Skip to content

Commit

Permalink
Update CHaP to build cardano-node using plutus core 1.9.1 which fixes…
Browse files Browse the repository at this point in the history
… the blocking protocol version issue. All tests passing.
  • Loading branch information
James Browning committed Sep 15, 2023
1 parent 1de23c5 commit 3c81ec1
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 56 deletions.
4 changes: 2 additions & 2 deletions cabal.project
Expand Up @@ -13,8 +13,8 @@ repository cardano-haskell-packages

-- See CONTRIBUTING.adoc for how to update index-state
index-state:
, hackage.haskell.org 2023-09-11T11:11:00Z
, cardano-haskell-packages 2023-09-11T11:11:00Z
, hackage.haskell.org 2023-09-15T11:11:00Z
, cardano-haskell-packages 2023-09-15T11:11:00Z
packages: e2e-tests

-- We never, ever, want this.
Expand Down
Expand Up @@ -150,7 +150,7 @@ aggregateMultiKeyG2Script bs16Null dst BlsParams{..} _sc = do
calcDsScalars :: [P.BuiltinBLS12_381_G2_Element] -> [Integer] -> [Integer]
calcDsScalars [] acc = acc
calcDsScalars (_ : xs) [x'] = calcDsScalars xs [x', x' P.* x']
calcDsScalars (_ : xs) acc@(x' : xs') = calcDsScalars xs (acc P.++ [last xs' P.* x'])
calcDsScalars (_ : xs) acc@(x' : xs') = calcDsScalars xs (acc P.++ [last' xs' P.* x'])
calcDsScalars _ _ = P.traceError "calcDsScalars: unexpected"

go
Expand All @@ -167,10 +167,10 @@ aggregateMultiKeyG2Script bs16Null dst BlsParams{..} _sc = do
calcAggregatedPubkey pk ds = ds `P.bls12_381_G2_scalarMul` pk

-- PlutusTx.Prelude has no last
last :: [a] -> a
last [] = P.traceError "last: needs at least two elements"
last [x] = x
last (_ : xs) = last xs
last' :: [a] -> a
last' [] = P.traceError "last: needs at least two elements"
last' [x] = x
last' (_ : xs) = last' xs

{- An alternative implementation of calcAggregatedPubkeys which uses a different
-- means of scalar exponentiation. It results in a slightly smaller script using less CPU but
Expand Down
113 changes: 73 additions & 40 deletions e2e-tests/test/Spec/Builtins/BLS.hs
Expand Up @@ -42,55 +42,88 @@ verifyBlsFunctionsTest networkOptions TestParams{..} = do
C.AnyCardanoEra era <- TN.eraFromOptions networkOptions
(w1SKey, _, w1Address) <- TN.w1 networkOptions tempAbsPath networkId

-- build a transaction

txIn <- Q.adaOnlyTxInAtAddress era localNodeConnectInfo w1Address

-- produce vrf proof for use in minting
let vrfProofWithOutput = VRF.generateVrfProofWithOutput VRF.vrfPrivKey VRF.vrfMessage

-- due to the max tx size constraint we must split use of BLS builtins across two transactions

-- build and submit tx1

tx1In <- Q.adaOnlyTxInAtAddress era localNodeConnectInfo w1Address

let
tx1TokenValues =
C.valueFromList
[ (PS.verifyBlsSimpleAssetIdV3, 1)
, (PS.verifyBlsVrfAssetIdV3, 2)
, (PS.verifyBlsGroth16AssetIdV3, 3)
, (PS.verifyBlsSigG1AssetIdV3, 4)
, (PS.verifyBlsSigG2AssetIdV3, 5)
]
tx1Out = Tx.txOut era (C.lovelaceToValue 3_100_000 <> tx1TokenValues) w1Address
tx1MintWitnesses =
Map.fromList
[ PS.verifyBlsSimpleMintWitnessV3 era
, PS.verifyBlsVrfMintWitnessV3 era vrfProofWithOutput
, PS.verifyBlsGroth16MintWitnessV3 era
, PS.verifyBlsSigG1MintWitnessV3 era
, PS.verifyBlsSigG2MintWitnessV3 era
]
tx1Collateral = Tx.txInsCollateral era [tx1In]
tx1BodyContent =
(Tx.emptyTxBodyContent era pparams)
{ C.txIns = Tx.pubkeyTxIns [tx1In]
, C.txInsCollateral = tx1Collateral
, C.txMintValue = Tx.txMintValue era tx1TokenValues tx1MintWitnesses
, C.txOuts = [tx1Out]
}

signedTx1 <- Tx.buildTx era localNodeConnectInfo tx1BodyContent w1Address w1SKey
Tx.submitTx era localNodeConnectInfo signedTx1
let expectedTxIn1 = Tx.txIn (Tx.txId signedTx1) 0

-- Query for txo and whether it contains newly minting tokens to prove successful use of BLS builtins
resultTxOut1 <-
Q.getTxOutAtAddress era localNodeConnectInfo w1Address expectedTxIn1 "TN.getTxOutAtAddress"
tx1OutHasTokenValue <- Q.txOutHasValue resultTxOut1 tx1TokenValues

-- build and submit tx1

tx2In <- Q.adaOnlyTxInAtAddress era localNodeConnectInfo w1Address

let
tokenValues =
tx2TokenValues =
C.valueFromList
[ -- (PS.verifyBlsSimpleAssetIdV3, 1)
(PS.verifyBlsVrfAssetIdV3, 2)
-- , (PS.verifyBlsGroth16AssetIdV3, 3)
-- , (PS.verifyBlsSigG1AssetIdV3, 4)
-- , (PS.verifyBlsSigG2AssetIdV3, 5)
-- , (PS.verifyBlsAggregateSigSingleKeyG1AssetIdV3, 6)
-- , (PS.verifyBlsAggregateSigMultiKeyG1AssetIdV3, 7)
-- , (PS.verifyBlsSchnorrG1AssetIdV3, 8)
-- , (PS.verifyBlsSchnorrG2AssetIdV3, 9)
[ (PS.verifyBlsAggregateSigSingleKeyG1AssetIdV3, 6)
, (PS.verifyBlsAggregateSigMultiKeyG1AssetIdV3, 7)
, (PS.verifyBlsSchnorrG1AssetIdV3, 8)
, (PS.verifyBlsSchnorrG2AssetIdV3, 9)
]
txOut = Tx.txOut era (C.lovelaceToValue 3_000_000 <> tokenValues) w1Address
mintWitnesses =
tx2Out = Tx.txOut era (C.lovelaceToValue 3_200_000 <> tx2TokenValues) w1Address
tx2MintWitnesses =
Map.fromList
[ -- PS.verifyBlsSimpleMintWitnessV3 era
PS.verifyBlsVrfMintWitnessV3 era vrfProofWithOutput
-- , PS.verifyBlsGroth16MintWitnessV3 era
-- , PS.verifyBlsSigG1MintWitnessV3 era
-- , PS.verifyBlsSigG2MintWitnessV3 era
-- , PS.verifyBlsAggregateSigSingleKeyG1MintWitnessV3 era
-- , PS.verifyBlsAggregateSigMultiKeyG2MintWitnessV3 era
-- , PS.verifyBlsSchnorrG1MintWitnessV3 era
-- , PS.verifyBlsSchnorrG2MintWitnessV3 era
[ PS.verifyBlsAggregateSigSingleKeyG1MintWitnessV3 era
, PS.verifyBlsAggregateSigMultiKeyG2MintWitnessV3 era
, PS.verifyBlsSchnorrG1MintWitnessV3 era
, PS.verifyBlsSchnorrG2MintWitnessV3 era
]
collateral = Tx.txInsCollateral era [txIn]
txBodyContent =
tx2Collateral = Tx.txInsCollateral era [tx2In]
tx2BodyContent =
(Tx.emptyTxBodyContent era pparams)
{ C.txIns = Tx.pubkeyTxIns [txIn]
, C.txInsCollateral = collateral
, C.txMintValue = Tx.txMintValue era tokenValues mintWitnesses
, C.txOuts = [txOut]
{ C.txIns = Tx.pubkeyTxIns [tx2In]
, C.txInsCollateral = tx2Collateral
, C.txMintValue = Tx.txMintValue era tx2TokenValues tx2MintWitnesses
, C.txOuts = [tx2Out]
}

-- Build and submit transaction
signedTx <- Tx.buildTx era localNodeConnectInfo txBodyContent w1Address w1SKey
Tx.submitTx era localNodeConnectInfo signedTx
let expectedTxIn = Tx.txIn (Tx.txId signedTx) 0
signedTx2 <- Tx.buildTx era localNodeConnectInfo tx2BodyContent w1Address w1SKey
Tx.submitTx era localNodeConnectInfo signedTx2
let expectedTxIn2 = Tx.txIn (Tx.txId signedTx2) 0

-- Query for txo and whether it contains newly minting tokens to prove successful use of BLS builtins
resultTxOut2 <-
Q.getTxOutAtAddress era localNodeConnectInfo w1Address expectedTxIn2 "TN.getTxOutAtAddress"
tx2OutHasTokenValue <- Q.txOutHasValue resultTxOut2 tx2TokenValues

-- Query for txo and assert it contains newly minting tokens to prove successful use of BLS builtins
resultTxOut <-
Q.getTxOutAtAddress era localNodeConnectInfo w1Address expectedTxIn "TN.getTxOutAtAddress"
txOutHasTokenValue <- Q.txOutHasValue resultTxOut tokenValues
assert "txOut has tokens" txOutHasTokenValue
-- assert both transaction outputs contain expected token values mitned by the use of all BLS builtins
assert "txOuts have tokens" (tx1OutHasTokenValue && tx2OutHasTokenValue)
7 changes: 4 additions & 3 deletions e2e-tests/test/Spec/Builtins/SECP256k1.hs
Expand Up @@ -24,6 +24,7 @@ import Helpers.TestData (TestInfo (..), TestParams (..))
import Helpers.Testnet qualified as TN
import Helpers.Tx qualified as Tx
import Helpers.Utils qualified as U
import PlutusLedgerApi.Common qualified as C
import PlutusScripts.SECP256k1.V_1_0 qualified as PS_1_0
import PlutusScripts.SECP256k1.V_1_1 qualified as PS_1_1

Expand Down Expand Up @@ -55,12 +56,12 @@ verifySchnorrAndEcdsaTest networkOptions TestParams{localNodeConnectInfo, pparam
C.AlonzoEra ->
( C.valueFromList [(PS_1_0.verifySchnorrAssetIdV1, 4), (PS_1_0.verifyEcdsaAssetIdV1, 2)]
, Map.fromList [PS_1_0.verifySchnorrMintWitnessV1 era, PS_1_0.verifyEcdsaMintWitnessV1 era]
, "PlutusV1" -- TODO use show?
, show C.PlutusV1
)
C.BabbageEra ->
( C.valueFromList [(PS_1_0.verifySchnorrAssetIdV2, 4), (PS_1_0.verifyEcdsaAssetIdV2, 2)]
, Map.fromList [PS_1_0.verifySchnorrMintWitnessV2 era, PS_1_0.verifyEcdsaMintWitnessV2 era]
, "PlutusV2" -- TODO use show?
, show C.PlutusV2
)
-- TODO: Add V1 once supported
C.ConwayEra ->
Expand All @@ -76,7 +77,7 @@ verifySchnorrAndEcdsaTest networkOptions TestParams{localNodeConnectInfo, pparam
, PS_1_1.verifySchnorrMintWitnessV3 era
, PS_1_1.verifyEcdsaMintWitnessV3 era
]
, "PlutusV3" -- TODO use show?
, show C.PlutusV3
)
txOut = Tx.txOut era (C.lovelaceToValue 3_000_000 <> tokenValues) w1Address
collateral = Tx.txInsCollateral era [txIn]
Expand Down
12 changes: 6 additions & 6 deletions flake.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

0 comments on commit 3c81ec1

Please sign in to comment.