diff --git a/cabal.project b/cabal.project index 1d2ae13..eef3fc6 100644 --- a/cabal.project +++ b/cabal.project @@ -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. diff --git a/e2e-tests/test/PlutusScripts/BLS/AggregateSigWithMultipleKeys/Common.hs b/e2e-tests/test/PlutusScripts/BLS/AggregateSigWithMultipleKeys/Common.hs index 324d06e..0d7717b 100644 --- a/e2e-tests/test/PlutusScripts/BLS/AggregateSigWithMultipleKeys/Common.hs +++ b/e2e-tests/test/PlutusScripts/BLS/AggregateSigWithMultipleKeys/Common.hs @@ -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 @@ -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 diff --git a/e2e-tests/test/Spec/Builtins/BLS.hs b/e2e-tests/test/Spec/Builtins/BLS.hs index b20db67..c33c835 100644 --- a/e2e-tests/test/Spec/Builtins/BLS.hs +++ b/e2e-tests/test/Spec/Builtins/BLS.hs @@ -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) diff --git a/e2e-tests/test/Spec/Builtins/SECP256k1.hs b/e2e-tests/test/Spec/Builtins/SECP256k1.hs index 88df1c0..a706a97 100644 --- a/e2e-tests/test/Spec/Builtins/SECP256k1.hs +++ b/e2e-tests/test/Spec/Builtins/SECP256k1.hs @@ -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 @@ -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 -> @@ -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] diff --git a/flake.lock b/flake.lock index 025e215..a00417a 100644 --- a/flake.lock +++ b/flake.lock @@ -3,11 +3,11 @@ "CHaP": { "flake": false, "locked": { - "lastModified": 1694418828, - "narHash": "sha256-AvhT3sIszBOoKI+HiSeoRS8We3HlngP2sPzLgIYx4Gg=", + "lastModified": 1694768913, + "narHash": "sha256-c+C/6gcZCD8TcX+08WhLudOEO0QQu6GXdy1GO6ZA190=", "owner": "input-output-hk", "repo": "cardano-haskell-packages", - "rev": "43bb9380c49d8e65169d83ba3e1957ef01f97617", + "rev": "0f233c529212e0bacff8b7ba6eb9f39aa799ef0f", "type": "github" }, "original": { @@ -260,11 +260,11 @@ "hackage": { "flake": false, "locked": { - "lastModified": 1694391774, - "narHash": "sha256-FvGv9drim3WIgQaq5c7IkKxWDTWtdd85Vh5eq4UBdoM=", + "lastModified": 1694737374, + "narHash": "sha256-JCnrqgKHhv5Jc7mu1TBAvQG483oHhKICdkb+2ywxwPE=", "owner": "input-output-hk", "repo": "hackage.nix", - "rev": "313a97ec97db179956f1a9eebf843aa23f39a7c7", + "rev": "e3b58bcdc9d0b67a9e9d475a939ec66556167642", "type": "github" }, "original": {