@feelyourprotocol/evm 8141.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +373 -0
- package/README.md +690 -0
- package/dist/cjs/binaryTreeAccessWitness.d.ts +61 -0
- package/dist/cjs/binaryTreeAccessWitness.d.ts.map +1 -0
- package/dist/cjs/binaryTreeAccessWitness.js +314 -0
- package/dist/cjs/binaryTreeAccessWitness.js.map +1 -0
- package/dist/cjs/chunkCache.d.ts +13 -0
- package/dist/cjs/chunkCache.d.ts.map +1 -0
- package/dist/cjs/chunkCache.js +30 -0
- package/dist/cjs/chunkCache.js.map +1 -0
- package/dist/cjs/constructors.d.ts +11 -0
- package/dist/cjs/constructors.d.ts.map +1 -0
- package/dist/cjs/constructors.js +30 -0
- package/dist/cjs/constructors.js.map +1 -0
- package/dist/cjs/eip7708.d.ts +24 -0
- package/dist/cjs/eip7708.d.ts.map +1 -0
- package/dist/cjs/eip7708.js +37 -0
- package/dist/cjs/eip7708.js.map +1 -0
- package/dist/cjs/eof/constants.d.ts +22 -0
- package/dist/cjs/eof/constants.d.ts.map +1 -0
- package/dist/cjs/eof/constants.js +31 -0
- package/dist/cjs/eof/constants.js.map +1 -0
- package/dist/cjs/eof/container.d.ts +87 -0
- package/dist/cjs/eof/container.d.ts.map +1 -0
- package/dist/cjs/eof/container.js +380 -0
- package/dist/cjs/eof/container.js.map +1 -0
- package/dist/cjs/eof/errors.d.ts +66 -0
- package/dist/cjs/eof/errors.d.ts.map +1 -0
- package/dist/cjs/eof/errors.js +200 -0
- package/dist/cjs/eof/errors.js.map +1 -0
- package/dist/cjs/eof/setup.d.ts +9 -0
- package/dist/cjs/eof/setup.d.ts.map +1 -0
- package/dist/cjs/eof/setup.js +26 -0
- package/dist/cjs/eof/setup.js.map +1 -0
- package/dist/cjs/eof/stackDelta.d.ts +10 -0
- package/dist/cjs/eof/stackDelta.d.ts.map +1 -0
- package/dist/cjs/eof/stackDelta.js +164 -0
- package/dist/cjs/eof/stackDelta.js.map +1 -0
- package/dist/cjs/eof/util.d.ts +8 -0
- package/dist/cjs/eof/util.d.ts.map +1 -0
- package/dist/cjs/eof/util.js +18 -0
- package/dist/cjs/eof/util.js.map +1 -0
- package/dist/cjs/eof/verify.d.ts +38 -0
- package/dist/cjs/eof/verify.d.ts.map +1 -0
- package/dist/cjs/eof/verify.js +436 -0
- package/dist/cjs/eof/verify.js.map +1 -0
- package/dist/cjs/errors.d.ts +40 -0
- package/dist/cjs/errors.d.ts.map +1 -0
- package/dist/cjs/errors.js +43 -0
- package/dist/cjs/errors.js.map +1 -0
- package/dist/cjs/evm.d.ts +181 -0
- package/dist/cjs/evm.d.ts.map +1 -0
- package/dist/cjs/evm.js +1142 -0
- package/dist/cjs/evm.js.map +1 -0
- package/dist/cjs/frameContext.d.ts +50 -0
- package/dist/cjs/frameContext.d.ts.map +1 -0
- package/dist/cjs/frameContext.js +17 -0
- package/dist/cjs/frameContext.js.map +1 -0
- package/dist/cjs/index.d.ts +18 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +43 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/interpreter.d.ts +361 -0
- package/dist/cjs/interpreter.d.ts.map +1 -0
- package/dist/cjs/interpreter.js +1057 -0
- package/dist/cjs/interpreter.js.map +1 -0
- package/dist/cjs/journal.d.ts +69 -0
- package/dist/cjs/journal.d.ts.map +1 -0
- package/dist/cjs/journal.js +247 -0
- package/dist/cjs/journal.js.map +1 -0
- package/dist/cjs/logger.d.ts +38 -0
- package/dist/cjs/logger.d.ts.map +1 -0
- package/dist/cjs/logger.js +126 -0
- package/dist/cjs/logger.js.map +1 -0
- package/dist/cjs/memory.d.ts +29 -0
- package/dist/cjs/memory.d.ts.map +1 -0
- package/dist/cjs/memory.js +75 -0
- package/dist/cjs/memory.js.map +1 -0
- package/dist/cjs/message.d.ts +70 -0
- package/dist/cjs/message.d.ts.map +1 -0
- package/dist/cjs/message.js +51 -0
- package/dist/cjs/message.js.map +1 -0
- package/dist/cjs/opcodes/EIP1283.d.ts +13 -0
- package/dist/cjs/opcodes/EIP1283.d.ts.map +1 -0
- package/dist/cjs/opcodes/EIP1283.js +58 -0
- package/dist/cjs/opcodes/EIP1283.js.map +1 -0
- package/dist/cjs/opcodes/EIP2200.d.ts +13 -0
- package/dist/cjs/opcodes/EIP2200.d.ts.map +1 -0
- package/dist/cjs/opcodes/EIP2200.js +64 -0
- package/dist/cjs/opcodes/EIP2200.js.map +1 -0
- package/dist/cjs/opcodes/EIP2929.d.ts +68 -0
- package/dist/cjs/opcodes/EIP2929.d.ts.map +1 -0
- package/dist/cjs/opcodes/EIP2929.js +146 -0
- package/dist/cjs/opcodes/EIP2929.js.map +1 -0
- package/dist/cjs/opcodes/codes.d.ts +45 -0
- package/dist/cjs/opcodes/codes.d.ts.map +1 -0
- package/dist/cjs/opcodes/codes.js +453 -0
- package/dist/cjs/opcodes/codes.js.map +1 -0
- package/dist/cjs/opcodes/functions.d.ts +11 -0
- package/dist/cjs/opcodes/functions.d.ts.map +1 -0
- package/dist/cjs/opcodes/functions.js +1778 -0
- package/dist/cjs/opcodes/functions.js.map +1 -0
- package/dist/cjs/opcodes/gas.d.ts +15 -0
- package/dist/cjs/opcodes/gas.d.ts.map +1 -0
- package/dist/cjs/opcodes/gas.js +1016 -0
- package/dist/cjs/opcodes/gas.js.map +1 -0
- package/dist/cjs/opcodes/index.d.ts +4 -0
- package/dist/cjs/opcodes/index.d.ts.map +1 -0
- package/dist/cjs/opcodes/index.js +20 -0
- package/dist/cjs/opcodes/index.js.map +1 -0
- package/dist/cjs/opcodes/util.d.ts +86 -0
- package/dist/cjs/opcodes/util.d.ts.map +1 -0
- package/dist/cjs/opcodes/util.js +281 -0
- package/dist/cjs/opcodes/util.js.map +1 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/params.d.ts +3 -0
- package/dist/cjs/params.d.ts.map +1 -0
- package/dist/cjs/params.js +424 -0
- package/dist/cjs/params.js.map +1 -0
- package/dist/cjs/precompiles/01-ecrecover.d.ts +4 -0
- package/dist/cjs/precompiles/01-ecrecover.d.ts.map +1 -0
- package/dist/cjs/precompiles/01-ecrecover.js +58 -0
- package/dist/cjs/precompiles/01-ecrecover.js.map +1 -0
- package/dist/cjs/precompiles/02-sha256.d.ts +4 -0
- package/dist/cjs/precompiles/02-sha256.d.ts.map +1 -0
- package/dist/cjs/precompiles/02-sha256.js +27 -0
- package/dist/cjs/precompiles/02-sha256.js.map +1 -0
- package/dist/cjs/precompiles/03-ripemd160.d.ts +4 -0
- package/dist/cjs/precompiles/03-ripemd160.d.ts.map +1 -0
- package/dist/cjs/precompiles/03-ripemd160.js +26 -0
- package/dist/cjs/precompiles/03-ripemd160.js.map +1 -0
- package/dist/cjs/precompiles/04-identity.d.ts +4 -0
- package/dist/cjs/precompiles/04-identity.d.ts.map +1 -0
- package/dist/cjs/precompiles/04-identity.js +24 -0
- package/dist/cjs/precompiles/04-identity.js.map +1 -0
- package/dist/cjs/precompiles/05-modexp.d.ts +5 -0
- package/dist/cjs/precompiles/05-modexp.d.ts.map +1 -0
- package/dist/cjs/precompiles/05-modexp.js +185 -0
- package/dist/cjs/precompiles/05-modexp.js.map +1 -0
- package/dist/cjs/precompiles/06-bn254-add.d.ts +4 -0
- package/dist/cjs/precompiles/06-bn254-add.d.ts.map +1 -0
- package/dist/cjs/precompiles/06-bn254-add.js +42 -0
- package/dist/cjs/precompiles/06-bn254-add.js.map +1 -0
- package/dist/cjs/precompiles/07-bn254-mul.d.ts +4 -0
- package/dist/cjs/precompiles/07-bn254-mul.d.ts.map +1 -0
- package/dist/cjs/precompiles/07-bn254-mul.js +43 -0
- package/dist/cjs/precompiles/07-bn254-mul.js.map +1 -0
- package/dist/cjs/precompiles/08-bn254-pairing.d.ts +4 -0
- package/dist/cjs/precompiles/08-bn254-pairing.d.ts.map +1 -0
- package/dist/cjs/precompiles/08-bn254-pairing.js +45 -0
- package/dist/cjs/precompiles/08-bn254-pairing.js.map +1 -0
- package/dist/cjs/precompiles/09-blake2f.d.ts +5 -0
- package/dist/cjs/precompiles/09-blake2f.d.ts.map +1 -0
- package/dist/cjs/precompiles/09-blake2f.js +201 -0
- package/dist/cjs/precompiles/09-blake2f.js.map +1 -0
- package/dist/cjs/precompiles/0a-kzg-point-evaluation.d.ts +5 -0
- package/dist/cjs/precompiles/0a-kzg-point-evaluation.d.ts.map +1 -0
- package/dist/cjs/precompiles/0a-kzg-point-evaluation.js +68 -0
- package/dist/cjs/precompiles/0a-kzg-point-evaluation.js.map +1 -0
- package/dist/cjs/precompiles/0b-bls12-g1add.d.ts +4 -0
- package/dist/cjs/precompiles/0b-bls12-g1add.d.ts.map +1 -0
- package/dist/cjs/precompiles/0b-bls12-g1add.js +49 -0
- package/dist/cjs/precompiles/0b-bls12-g1add.js.map +1 -0
- package/dist/cjs/precompiles/0c-bls12-g1msm.d.ts +4 -0
- package/dist/cjs/precompiles/0c-bls12-g1msm.d.ts.map +1 -0
- package/dist/cjs/precompiles/0c-bls12-g1msm.js +62 -0
- package/dist/cjs/precompiles/0c-bls12-g1msm.js.map +1 -0
- package/dist/cjs/precompiles/0d-bls12-g2add.d.ts +4 -0
- package/dist/cjs/precompiles/0d-bls12-g2add.d.ts.map +1 -0
- package/dist/cjs/precompiles/0d-bls12-g2add.js +51 -0
- package/dist/cjs/precompiles/0d-bls12-g2add.js.map +1 -0
- package/dist/cjs/precompiles/0e-bls12-g2msm.d.ts +4 -0
- package/dist/cjs/precompiles/0e-bls12-g2msm.d.ts.map +1 -0
- package/dist/cjs/precompiles/0e-bls12-g2msm.js +60 -0
- package/dist/cjs/precompiles/0e-bls12-g2msm.js.map +1 -0
- package/dist/cjs/precompiles/0f-bls12-pairing.d.ts +4 -0
- package/dist/cjs/precompiles/0f-bls12-pairing.d.ts.map +1 -0
- package/dist/cjs/precompiles/0f-bls12-pairing.js +66 -0
- package/dist/cjs/precompiles/0f-bls12-pairing.js.map +1 -0
- package/dist/cjs/precompiles/10-bls12-map-fp-to-g1.d.ts +4 -0
- package/dist/cjs/precompiles/10-bls12-map-fp-to-g1.d.ts.map +1 -0
- package/dist/cjs/precompiles/10-bls12-map-fp-to-g1.js +44 -0
- package/dist/cjs/precompiles/10-bls12-map-fp-to-g1.js.map +1 -0
- package/dist/cjs/precompiles/100-p256verify.d.ts +4 -0
- package/dist/cjs/precompiles/100-p256verify.d.ts.map +1 -0
- package/dist/cjs/precompiles/100-p256verify.js +131 -0
- package/dist/cjs/precompiles/100-p256verify.js.map +1 -0
- package/dist/cjs/precompiles/11-bls12-map-fp2-to-g2.d.ts +4 -0
- package/dist/cjs/precompiles/11-bls12-map-fp2-to-g2.d.ts.map +1 -0
- package/dist/cjs/precompiles/11-bls12-map-fp2-to-g2.js +47 -0
- package/dist/cjs/precompiles/11-bls12-map-fp2-to-g2.js.map +1 -0
- package/dist/cjs/precompiles/bls12_381/constants.d.ts +10 -0
- package/dist/cjs/precompiles/bls12_381/constants.d.ts.map +1 -0
- package/dist/cjs/precompiles/bls12_381/constants.js +274 -0
- package/dist/cjs/precompiles/bls12_381/constants.js.map +1 -0
- package/dist/cjs/precompiles/bls12_381/index.d.ts +5 -0
- package/dist/cjs/precompiles/bls12_381/index.d.ts.map +1 -0
- package/dist/cjs/precompiles/bls12_381/index.js +24 -0
- package/dist/cjs/precompiles/bls12_381/index.js.map +1 -0
- package/dist/cjs/precompiles/bls12_381/mcl.d.ts +45 -0
- package/dist/cjs/precompiles/bls12_381/mcl.d.ts.map +1 -0
- package/dist/cjs/precompiles/bls12_381/mcl.js +264 -0
- package/dist/cjs/precompiles/bls12_381/mcl.js.map +1 -0
- package/dist/cjs/precompiles/bls12_381/noble.d.ts +39 -0
- package/dist/cjs/precompiles/bls12_381/noble.d.ts.map +1 -0
- package/dist/cjs/precompiles/bls12_381/noble.js +228 -0
- package/dist/cjs/precompiles/bls12_381/noble.js.map +1 -0
- package/dist/cjs/precompiles/bls12_381/util.d.ts +35 -0
- package/dist/cjs/precompiles/bls12_381/util.d.ts.map +1 -0
- package/dist/cjs/precompiles/bls12_381/util.js +68 -0
- package/dist/cjs/precompiles/bls12_381/util.js.map +1 -0
- package/dist/cjs/precompiles/bn254/index.d.ts +3 -0
- package/dist/cjs/precompiles/bn254/index.d.ts.map +1 -0
- package/dist/cjs/precompiles/bn254/index.js +8 -0
- package/dist/cjs/precompiles/bn254/index.js.map +1 -0
- package/dist/cjs/precompiles/bn254/noble.d.ts +13 -0
- package/dist/cjs/precompiles/bn254/noble.d.ts.map +1 -0
- package/dist/cjs/precompiles/bn254/noble.js +124 -0
- package/dist/cjs/precompiles/bn254/noble.js.map +1 -0
- package/dist/cjs/precompiles/bn254/rustbn.d.ts +16 -0
- package/dist/cjs/precompiles/bn254/rustbn.d.ts.map +1 -0
- package/dist/cjs/precompiles/bn254/rustbn.js +33 -0
- package/dist/cjs/precompiles/bn254/rustbn.js.map +1 -0
- package/dist/cjs/precompiles/index.d.ts +67 -0
- package/dist/cjs/precompiles/index.d.ts.map +1 -0
- package/dist/cjs/precompiles/index.js +262 -0
- package/dist/cjs/precompiles/index.js.map +1 -0
- package/dist/cjs/precompiles/types.d.ts +13 -0
- package/dist/cjs/precompiles/types.d.ts.map +1 -0
- package/dist/cjs/precompiles/types.js +3 -0
- package/dist/cjs/precompiles/types.js.map +1 -0
- package/dist/cjs/precompiles/util.d.ts +30 -0
- package/dist/cjs/precompiles/util.d.ts.map +1 -0
- package/dist/cjs/precompiles/util.js +63 -0
- package/dist/cjs/precompiles/util.js.map +1 -0
- package/dist/cjs/stack.d.ts +55 -0
- package/dist/cjs/stack.d.ts.map +1 -0
- package/dist/cjs/stack.js +143 -0
- package/dist/cjs/stack.js.map +1 -0
- package/dist/cjs/stemCache.d.ts +20 -0
- package/dist/cjs/stemCache.d.ts.map +1 -0
- package/dist/cjs/stemCache.js +37 -0
- package/dist/cjs/stemCache.js.map +1 -0
- package/dist/cjs/transientStorage.d.ts +54 -0
- package/dist/cjs/transientStorage.d.ts.map +1 -0
- package/dist/cjs/transientStorage.js +113 -0
- package/dist/cjs/transientStorage.js.map +1 -0
- package/dist/cjs/types.d.ts +465 -0
- package/dist/cjs/types.d.ts.map +1 -0
- package/dist/cjs/types.js +28 -0
- package/dist/cjs/types.js.map +1 -0
- package/dist/esm/binaryTreeAccessWitness.d.ts +61 -0
- package/dist/esm/binaryTreeAccessWitness.d.ts.map +1 -0
- package/dist/esm/binaryTreeAccessWitness.js +308 -0
- package/dist/esm/binaryTreeAccessWitness.js.map +1 -0
- package/dist/esm/chunkCache.d.ts +13 -0
- package/dist/esm/chunkCache.d.ts.map +1 -0
- package/dist/esm/chunkCache.js +26 -0
- package/dist/esm/chunkCache.js.map +1 -0
- package/dist/esm/constructors.d.ts +11 -0
- package/dist/esm/constructors.d.ts.map +1 -0
- package/dist/esm/constructors.js +27 -0
- package/dist/esm/constructors.js.map +1 -0
- package/dist/esm/eip7708.d.ts +24 -0
- package/dist/esm/eip7708.d.ts.map +1 -0
- package/dist/esm/eip7708.js +32 -0
- package/dist/esm/eip7708.js.map +1 -0
- package/dist/esm/eof/constants.d.ts +22 -0
- package/dist/esm/eof/constants.d.ts.map +1 -0
- package/dist/esm/eof/constants.js +28 -0
- package/dist/esm/eof/constants.js.map +1 -0
- package/dist/esm/eof/container.d.ts +87 -0
- package/dist/esm/eof/container.d.ts.map +1 -0
- package/dist/esm/eof/container.js +375 -0
- package/dist/esm/eof/container.js.map +1 -0
- package/dist/esm/eof/errors.d.ts +66 -0
- package/dist/esm/eof/errors.d.ts.map +1 -0
- package/dist/esm/eof/errors.js +195 -0
- package/dist/esm/eof/errors.js.map +1 -0
- package/dist/esm/eof/setup.d.ts +9 -0
- package/dist/esm/eof/setup.d.ts.map +1 -0
- package/dist/esm/eof/setup.js +23 -0
- package/dist/esm/eof/setup.js.map +1 -0
- package/dist/esm/eof/stackDelta.d.ts +10 -0
- package/dist/esm/eof/stackDelta.d.ts.map +1 -0
- package/dist/esm/eof/stackDelta.js +161 -0
- package/dist/esm/eof/stackDelta.js.map +1 -0
- package/dist/esm/eof/util.d.ts +8 -0
- package/dist/esm/eof/util.d.ts.map +1 -0
- package/dist/esm/eof/util.js +14 -0
- package/dist/esm/eof/util.js.map +1 -0
- package/dist/esm/eof/verify.d.ts +38 -0
- package/dist/esm/eof/verify.d.ts.map +1 -0
- package/dist/esm/eof/verify.js +432 -0
- package/dist/esm/eof/verify.js.map +1 -0
- package/dist/esm/errors.d.ts +40 -0
- package/dist/esm/errors.d.ts.map +1 -0
- package/dist/esm/errors.js +39 -0
- package/dist/esm/errors.js.map +1 -0
- package/dist/esm/evm.d.ts +181 -0
- package/dist/esm/evm.d.ts.map +1 -0
- package/dist/esm/evm.js +1131 -0
- package/dist/esm/evm.js.map +1 -0
- package/dist/esm/frameContext.d.ts +50 -0
- package/dist/esm/frameContext.d.ts.map +1 -0
- package/dist/esm/frameContext.js +14 -0
- package/dist/esm/frameContext.js.map +1 -0
- package/dist/esm/index.d.ts +18 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +15 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/interpreter.d.ts +361 -0
- package/dist/esm/interpreter.d.ts.map +1 -0
- package/dist/esm/interpreter.js +1054 -0
- package/dist/esm/interpreter.js.map +1 -0
- package/dist/esm/journal.d.ts +69 -0
- package/dist/esm/journal.d.ts.map +1 -0
- package/dist/esm/journal.js +243 -0
- package/dist/esm/journal.js.map +1 -0
- package/dist/esm/logger.d.ts +38 -0
- package/dist/esm/logger.d.ts.map +1 -0
- package/dist/esm/logger.js +121 -0
- package/dist/esm/logger.js.map +1 -0
- package/dist/esm/memory.d.ts +29 -0
- package/dist/esm/memory.d.ts.map +1 -0
- package/dist/esm/memory.js +71 -0
- package/dist/esm/memory.js.map +1 -0
- package/dist/esm/message.d.ts +70 -0
- package/dist/esm/message.d.ts.map +1 -0
- package/dist/esm/message.js +47 -0
- package/dist/esm/message.js.map +1 -0
- package/dist/esm/opcodes/EIP1283.d.ts +13 -0
- package/dist/esm/opcodes/EIP1283.d.ts.map +1 -0
- package/dist/esm/opcodes/EIP1283.js +55 -0
- package/dist/esm/opcodes/EIP1283.js.map +1 -0
- package/dist/esm/opcodes/EIP2200.d.ts +13 -0
- package/dist/esm/opcodes/EIP2200.d.ts.map +1 -0
- package/dist/esm/opcodes/EIP2200.js +61 -0
- package/dist/esm/opcodes/EIP2200.js.map +1 -0
- package/dist/esm/opcodes/EIP2929.d.ts +68 -0
- package/dist/esm/opcodes/EIP2929.d.ts.map +1 -0
- package/dist/esm/opcodes/EIP2929.js +138 -0
- package/dist/esm/opcodes/EIP2929.js.map +1 -0
- package/dist/esm/opcodes/codes.d.ts +45 -0
- package/dist/esm/opcodes/codes.d.ts.map +1 -0
- package/dist/esm/opcodes/codes.js +448 -0
- package/dist/esm/opcodes/codes.js.map +1 -0
- package/dist/esm/opcodes/functions.d.ts +11 -0
- package/dist/esm/opcodes/functions.d.ts.map +1 -0
- package/dist/esm/opcodes/functions.js +1775 -0
- package/dist/esm/opcodes/functions.js.map +1 -0
- package/dist/esm/opcodes/gas.d.ts +15 -0
- package/dist/esm/opcodes/gas.d.ts.map +1 -0
- package/dist/esm/opcodes/gas.js +1013 -0
- package/dist/esm/opcodes/gas.js.map +1 -0
- package/dist/esm/opcodes/index.d.ts +4 -0
- package/dist/esm/opcodes/index.d.ts.map +1 -0
- package/dist/esm/opcodes/index.js +4 -0
- package/dist/esm/opcodes/index.js.map +1 -0
- package/dist/esm/opcodes/util.d.ts +86 -0
- package/dist/esm/opcodes/util.d.ts.map +1 -0
- package/dist/esm/opcodes/util.js +257 -0
- package/dist/esm/opcodes/util.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/params.d.ts +3 -0
- package/dist/esm/params.d.ts.map +1 -0
- package/dist/esm/params.js +421 -0
- package/dist/esm/params.js.map +1 -0
- package/dist/esm/precompiles/01-ecrecover.d.ts +4 -0
- package/dist/esm/precompiles/01-ecrecover.d.ts.map +1 -0
- package/dist/esm/precompiles/01-ecrecover.js +55 -0
- package/dist/esm/precompiles/01-ecrecover.js.map +1 -0
- package/dist/esm/precompiles/02-sha256.d.ts +4 -0
- package/dist/esm/precompiles/02-sha256.d.ts.map +1 -0
- package/dist/esm/precompiles/02-sha256.js +24 -0
- package/dist/esm/precompiles/02-sha256.js.map +1 -0
- package/dist/esm/precompiles/03-ripemd160.d.ts +4 -0
- package/dist/esm/precompiles/03-ripemd160.d.ts.map +1 -0
- package/dist/esm/precompiles/03-ripemd160.js +23 -0
- package/dist/esm/precompiles/03-ripemd160.js.map +1 -0
- package/dist/esm/precompiles/04-identity.d.ts +4 -0
- package/dist/esm/precompiles/04-identity.d.ts.map +1 -0
- package/dist/esm/precompiles/04-identity.js +21 -0
- package/dist/esm/precompiles/04-identity.js.map +1 -0
- package/dist/esm/precompiles/05-modexp.d.ts +5 -0
- package/dist/esm/precompiles/05-modexp.d.ts.map +1 -0
- package/dist/esm/precompiles/05-modexp.js +181 -0
- package/dist/esm/precompiles/05-modexp.js.map +1 -0
- package/dist/esm/precompiles/06-bn254-add.d.ts +4 -0
- package/dist/esm/precompiles/06-bn254-add.d.ts.map +1 -0
- package/dist/esm/precompiles/06-bn254-add.js +39 -0
- package/dist/esm/precompiles/06-bn254-add.js.map +1 -0
- package/dist/esm/precompiles/07-bn254-mul.d.ts +4 -0
- package/dist/esm/precompiles/07-bn254-mul.d.ts.map +1 -0
- package/dist/esm/precompiles/07-bn254-mul.js +40 -0
- package/dist/esm/precompiles/07-bn254-mul.js.map +1 -0
- package/dist/esm/precompiles/08-bn254-pairing.d.ts +4 -0
- package/dist/esm/precompiles/08-bn254-pairing.d.ts.map +1 -0
- package/dist/esm/precompiles/08-bn254-pairing.js +42 -0
- package/dist/esm/precompiles/08-bn254-pairing.js.map +1 -0
- package/dist/esm/precompiles/09-blake2f.d.ts +5 -0
- package/dist/esm/precompiles/09-blake2f.d.ts.map +1 -0
- package/dist/esm/precompiles/09-blake2f.js +197 -0
- package/dist/esm/precompiles/09-blake2f.js.map +1 -0
- package/dist/esm/precompiles/0a-kzg-point-evaluation.d.ts +5 -0
- package/dist/esm/precompiles/0a-kzg-point-evaluation.d.ts.map +1 -0
- package/dist/esm/precompiles/0a-kzg-point-evaluation.js +64 -0
- package/dist/esm/precompiles/0a-kzg-point-evaluation.js.map +1 -0
- package/dist/esm/precompiles/0b-bls12-g1add.d.ts +4 -0
- package/dist/esm/precompiles/0b-bls12-g1add.d.ts.map +1 -0
- package/dist/esm/precompiles/0b-bls12-g1add.js +46 -0
- package/dist/esm/precompiles/0b-bls12-g1add.js.map +1 -0
- package/dist/esm/precompiles/0c-bls12-g1msm.d.ts +4 -0
- package/dist/esm/precompiles/0c-bls12-g1msm.d.ts.map +1 -0
- package/dist/esm/precompiles/0c-bls12-g1msm.js +59 -0
- package/dist/esm/precompiles/0c-bls12-g1msm.js.map +1 -0
- package/dist/esm/precompiles/0d-bls12-g2add.d.ts +4 -0
- package/dist/esm/precompiles/0d-bls12-g2add.d.ts.map +1 -0
- package/dist/esm/precompiles/0d-bls12-g2add.js +48 -0
- package/dist/esm/precompiles/0d-bls12-g2add.js.map +1 -0
- package/dist/esm/precompiles/0e-bls12-g2msm.d.ts +4 -0
- package/dist/esm/precompiles/0e-bls12-g2msm.d.ts.map +1 -0
- package/dist/esm/precompiles/0e-bls12-g2msm.js +57 -0
- package/dist/esm/precompiles/0e-bls12-g2msm.js.map +1 -0
- package/dist/esm/precompiles/0f-bls12-pairing.d.ts +4 -0
- package/dist/esm/precompiles/0f-bls12-pairing.d.ts.map +1 -0
- package/dist/esm/precompiles/0f-bls12-pairing.js +63 -0
- package/dist/esm/precompiles/0f-bls12-pairing.js.map +1 -0
- package/dist/esm/precompiles/10-bls12-map-fp-to-g1.d.ts +4 -0
- package/dist/esm/precompiles/10-bls12-map-fp-to-g1.d.ts.map +1 -0
- package/dist/esm/precompiles/10-bls12-map-fp-to-g1.js +41 -0
- package/dist/esm/precompiles/10-bls12-map-fp-to-g1.js.map +1 -0
- package/dist/esm/precompiles/100-p256verify.d.ts +4 -0
- package/dist/esm/precompiles/100-p256verify.d.ts.map +1 -0
- package/dist/esm/precompiles/100-p256verify.js +128 -0
- package/dist/esm/precompiles/100-p256verify.js.map +1 -0
- package/dist/esm/precompiles/11-bls12-map-fp2-to-g2.d.ts +4 -0
- package/dist/esm/precompiles/11-bls12-map-fp2-to-g2.d.ts.map +1 -0
- package/dist/esm/precompiles/11-bls12-map-fp2-to-g2.js +44 -0
- package/dist/esm/precompiles/11-bls12-map-fp2-to-g2.js.map +1 -0
- package/dist/esm/precompiles/bls12_381/constants.d.ts +10 -0
- package/dist/esm/precompiles/bls12_381/constants.d.ts.map +1 -0
- package/dist/esm/precompiles/bls12_381/constants.js +271 -0
- package/dist/esm/precompiles/bls12_381/constants.js.map +1 -0
- package/dist/esm/precompiles/bls12_381/index.d.ts +5 -0
- package/dist/esm/precompiles/bls12_381/index.d.ts.map +1 -0
- package/dist/esm/precompiles/bls12_381/index.js +5 -0
- package/dist/esm/precompiles/bls12_381/index.js.map +1 -0
- package/dist/esm/precompiles/bls12_381/mcl.d.ts +45 -0
- package/dist/esm/precompiles/bls12_381/mcl.d.ts.map +1 -0
- package/dist/esm/precompiles/bls12_381/mcl.js +254 -0
- package/dist/esm/precompiles/bls12_381/mcl.js.map +1 -0
- package/dist/esm/precompiles/bls12_381/noble.d.ts +39 -0
- package/dist/esm/precompiles/bls12_381/noble.d.ts.map +1 -0
- package/dist/esm/precompiles/bls12_381/noble.js +218 -0
- package/dist/esm/precompiles/bls12_381/noble.js.map +1 -0
- package/dist/esm/precompiles/bls12_381/util.d.ts +35 -0
- package/dist/esm/precompiles/bls12_381/util.d.ts.map +1 -0
- package/dist/esm/precompiles/bls12_381/util.js +63 -0
- package/dist/esm/precompiles/bls12_381/util.js.map +1 -0
- package/dist/esm/precompiles/bn254/index.d.ts +3 -0
- package/dist/esm/precompiles/bn254/index.d.ts.map +1 -0
- package/dist/esm/precompiles/bn254/index.js +3 -0
- package/dist/esm/precompiles/bn254/index.js.map +1 -0
- package/dist/esm/precompiles/bn254/noble.d.ts +13 -0
- package/dist/esm/precompiles/bn254/noble.d.ts.map +1 -0
- package/dist/esm/precompiles/bn254/noble.js +120 -0
- package/dist/esm/precompiles/bn254/noble.js.map +1 -0
- package/dist/esm/precompiles/bn254/rustbn.d.ts +16 -0
- package/dist/esm/precompiles/bn254/rustbn.d.ts.map +1 -0
- package/dist/esm/precompiles/bn254/rustbn.js +29 -0
- package/dist/esm/precompiles/bn254/rustbn.js.map +1 -0
- package/dist/esm/precompiles/index.d.ts +67 -0
- package/dist/esm/precompiles/index.d.ts.map +1 -0
- package/dist/esm/precompiles/index.js +251 -0
- package/dist/esm/precompiles/index.js.map +1 -0
- package/dist/esm/precompiles/types.d.ts +13 -0
- package/dist/esm/precompiles/types.d.ts.map +1 -0
- package/dist/esm/precompiles/types.js +2 -0
- package/dist/esm/precompiles/types.js.map +1 -0
- package/dist/esm/precompiles/util.d.ts +30 -0
- package/dist/esm/precompiles/util.d.ts.map +1 -0
- package/dist/esm/precompiles/util.js +57 -0
- package/dist/esm/precompiles/util.js.map +1 -0
- package/dist/esm/stack.d.ts +55 -0
- package/dist/esm/stack.d.ts.map +1 -0
- package/dist/esm/stack.js +139 -0
- package/dist/esm/stack.js.map +1 -0
- package/dist/esm/stemCache.d.ts +20 -0
- package/dist/esm/stemCache.d.ts.map +1 -0
- package/dist/esm/stemCache.js +33 -0
- package/dist/esm/stemCache.js.map +1 -0
- package/dist/esm/transientStorage.d.ts +54 -0
- package/dist/esm/transientStorage.d.ts.map +1 -0
- package/dist/esm/transientStorage.js +109 -0
- package/dist/esm/transientStorage.js.map +1 -0
- package/dist/esm/types.d.ts +465 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +23 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/tsconfig.prod.cjs.tsbuildinfo +1 -0
- package/dist/tsconfig.prod.esm.tsbuildinfo +1 -0
- package/package.json +98 -0
- package/src/binaryTreeAccessWitness.ts +447 -0
- package/src/chunkCache.ts +36 -0
- package/src/constructors.ts +35 -0
- package/src/eip7708.ts +47 -0
- package/src/eof/constants.ts +36 -0
- package/src/eof/container.ts +495 -0
- package/src/eof/errors.ts +214 -0
- package/src/eof/setup.ts +27 -0
- package/src/eof/stackDelta.ts +169 -0
- package/src/eof/util.ts +16 -0
- package/src/eof/verify.ts +531 -0
- package/src/errors.ts +45 -0
- package/src/evm.ts +1415 -0
- package/src/frameContext.ts +56 -0
- package/src/index.ts +75 -0
- package/src/interpreter.ts +1437 -0
- package/src/journal.ts +317 -0
- package/src/logger.ts +180 -0
- package/src/memory.ts +82 -0
- package/src/message.ts +114 -0
- package/src/opcodes/EIP1283.ts +77 -0
- package/src/opcodes/EIP2200.ts +87 -0
- package/src/opcodes/EIP2929.ts +173 -0
- package/src/opcodes/codes.ts +528 -0
- package/src/opcodes/functions.ts +1937 -0
- package/src/opcodes/gas.ts +1329 -0
- package/src/opcodes/index.ts +3 -0
- package/src/opcodes/util.ts +313 -0
- package/src/params.ts +423 -0
- package/src/precompiles/01-ecrecover.ts +77 -0
- package/src/precompiles/02-sha256.ts +32 -0
- package/src/precompiles/03-ripemd160.ts +32 -0
- package/src/precompiles/04-identity.ts +29 -0
- package/src/precompiles/05-modexp.ts +215 -0
- package/src/precompiles/06-bn254-add.ts +49 -0
- package/src/precompiles/07-bn254-mul.ts +50 -0
- package/src/precompiles/08-bn254-pairing.ts +54 -0
- package/src/precompiles/09-blake2f.ts +243 -0
- package/src/precompiles/0a-kzg-point-evaluation.ts +94 -0
- package/src/precompiles/0b-bls12-g1add.ts +63 -0
- package/src/precompiles/0c-bls12-g1msm.ts +87 -0
- package/src/precompiles/0d-bls12-g2add.ts +66 -0
- package/src/precompiles/0e-bls12-g2msm.ts +84 -0
- package/src/precompiles/0f-bls12-pairing.ts +86 -0
- package/src/precompiles/10-bls12-map-fp-to-g1.ts +58 -0
- package/src/precompiles/100-p256verify.ts +152 -0
- package/src/precompiles/11-bls12-map-fp2-to-g2.ts +61 -0
- package/src/precompiles/bls12_381/constants.ts +278 -0
- package/src/precompiles/bls12_381/index.ts +4 -0
- package/src/precompiles/bls12_381/mcl.ts +376 -0
- package/src/precompiles/bls12_381/noble.ts +307 -0
- package/src/precompiles/bls12_381/util.ts +78 -0
- package/src/precompiles/bn254/index.ts +2 -0
- package/src/precompiles/bn254/noble.ts +156 -0
- package/src/precompiles/bn254/rustbn.ts +35 -0
- package/src/precompiles/index.ts +344 -0
- package/src/precompiles/types.ts +15 -0
- package/src/precompiles/util.ts +70 -0
- package/src/stack.ts +166 -0
- package/src/stemCache.ts +45 -0
- package/src/transientStorage.ts +131 -0
- package/src/types.ts +538 -0
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
import { bytesToBigInt, bytesToUnprefixedHex, concatBytes, equalsBytes, setLengthLeft, unprefixedHexToBytes, } from '@feelyourprotocol/util';
|
|
2
|
+
import { EVMError } from "../../errors.js";
|
|
3
|
+
import { BLS_FIELD_MODULUS, BLS_G1_INFINITY_POINT_BYTES, BLS_G1_POINT_BYTE_LENGTH, BLS_G2_INFINITY_POINT_BYTES, BLS_G2_POINT_BYTE_LENGTH, BLS_ONE_BUFFER, BLS_ZERO_BUFFER, } from "./constants.js";
|
|
4
|
+
/**
|
|
5
|
+
* Converts an Uint8Array to a MCL G1 point. Raises errors if the point is not on the curve
|
|
6
|
+
* and (if activated) if the point is in the subgroup / order check.
|
|
7
|
+
* @param input Input Uint8Array. Should be 128 bytes
|
|
8
|
+
* @param mcl MCL instance
|
|
9
|
+
* @param verifyOrder Perform the subgroup check (defaults to true)
|
|
10
|
+
* @returns MCL G1 point
|
|
11
|
+
*/
|
|
12
|
+
function BLS12_381_ToG1Point(input, mcl, verifyOrder = true) {
|
|
13
|
+
if (equalsBytes(input, BLS_G1_INFINITY_POINT_BYTES)) {
|
|
14
|
+
return new mcl.G1();
|
|
15
|
+
}
|
|
16
|
+
// Using deprecated bytesToUnprefixedHex for performance: mcl library expects unprefixed hex strings.
|
|
17
|
+
const p_x = bytesToUnprefixedHex(input.subarray(16, BLS_G1_POINT_BYTE_LENGTH / 2));
|
|
18
|
+
const p_y = bytesToUnprefixedHex(input.subarray(80, BLS_G1_POINT_BYTE_LENGTH));
|
|
19
|
+
const G1 = new mcl.G1();
|
|
20
|
+
const Fp_X = new mcl.Fp();
|
|
21
|
+
const Fp_Y = new mcl.Fp();
|
|
22
|
+
const One = new mcl.Fp();
|
|
23
|
+
Fp_X.setStr(p_x, 16);
|
|
24
|
+
Fp_Y.setStr(p_y, 16);
|
|
25
|
+
One.setStr('1', 16);
|
|
26
|
+
G1.setX(Fp_X);
|
|
27
|
+
G1.setY(Fp_Y);
|
|
28
|
+
G1.setZ(One);
|
|
29
|
+
mcl.verifyOrderG1(verifyOrder);
|
|
30
|
+
if (verifyOrder && G1.isValidOrder() === false) {
|
|
31
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_POINT_NOT_ON_CURVE);
|
|
32
|
+
}
|
|
33
|
+
// Check if these coordinates are actually on the curve.
|
|
34
|
+
if (G1.isValid() === false) {
|
|
35
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_POINT_NOT_ON_CURVE);
|
|
36
|
+
}
|
|
37
|
+
return G1;
|
|
38
|
+
}
|
|
39
|
+
// input: a mcl G1 point
|
|
40
|
+
// output: a 128-byte Uint8Array
|
|
41
|
+
function BLS12_381_FromG1Point(input) {
|
|
42
|
+
// TODO: figure out if there is a better way to decode these values.
|
|
43
|
+
const decodeStr = input.getStr(16); //return a string of pattern "1 <x_coord> <y_coord>"
|
|
44
|
+
const decoded = decodeStr.match(/"?[0-9a-f]+"?/g); // match above pattern.
|
|
45
|
+
if (decodeStr === '0') {
|
|
46
|
+
return new Uint8Array(BLS_G1_POINT_BYTE_LENGTH);
|
|
47
|
+
}
|
|
48
|
+
const xBytes = setLengthLeft(unprefixedHexToBytes(decoded[1]), 64);
|
|
49
|
+
const yBytes = setLengthLeft(unprefixedHexToBytes(decoded[2]), 64);
|
|
50
|
+
return concatBytes(xBytes, yBytes);
|
|
51
|
+
}
|
|
52
|
+
// input: two 64-byte buffers
|
|
53
|
+
// output: a mcl Fp2 point
|
|
54
|
+
function BLS12_381_ToFp2Point(fpXCoordinate, fpYCoordinate, mcl) {
|
|
55
|
+
// check if the coordinates are in the field
|
|
56
|
+
if (bytesToBigInt(fpXCoordinate) >= BLS_FIELD_MODULUS) {
|
|
57
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_FP_NOT_IN_FIELD);
|
|
58
|
+
}
|
|
59
|
+
if (bytesToBigInt(fpYCoordinate) >= BLS_FIELD_MODULUS) {
|
|
60
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_FP_NOT_IN_FIELD);
|
|
61
|
+
}
|
|
62
|
+
const fp_x = new mcl.Fp();
|
|
63
|
+
const fp_y = new mcl.Fp();
|
|
64
|
+
const fp2 = new mcl.Fp2();
|
|
65
|
+
// Using deprecated bytesToUnprefixedHex for performance: mcl library expects unprefixed hex strings.
|
|
66
|
+
fp_x.setStr(bytesToUnprefixedHex(fpXCoordinate.subarray(16)), 16);
|
|
67
|
+
fp_y.setStr(bytesToUnprefixedHex(fpYCoordinate.subarray(16)), 16);
|
|
68
|
+
fp2.set_a(fp_x);
|
|
69
|
+
fp2.set_b(fp_y);
|
|
70
|
+
return fp2;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Converts an Uint8Array to a MCL G2 point. Raises errors if the point is not on the curve
|
|
74
|
+
* and (if activated) if the point is in the subgroup / order check.
|
|
75
|
+
* @param input Input Uint8Array. Should be 256 bytes
|
|
76
|
+
* @param mcl MCL instance
|
|
77
|
+
* @param verifyOrder Perform the subgroup check (defaults to true)
|
|
78
|
+
* @returns MCL G2 point
|
|
79
|
+
*/
|
|
80
|
+
function BLS12_381_ToG2Point(input, mcl, verifyOrder = true) {
|
|
81
|
+
if (equalsBytes(input, BLS_G2_INFINITY_POINT_BYTES)) {
|
|
82
|
+
return new mcl.G2();
|
|
83
|
+
}
|
|
84
|
+
const p_x_1 = input.subarray(0, 64);
|
|
85
|
+
const p_x_2 = input.subarray(64, BLS_G2_POINT_BYTE_LENGTH / 2);
|
|
86
|
+
const p_y_1 = input.subarray(128, 192);
|
|
87
|
+
const p_y_2 = input.subarray(192, BLS_G2_POINT_BYTE_LENGTH);
|
|
88
|
+
const Fp2X = BLS12_381_ToFp2Point(p_x_1, p_x_2, mcl);
|
|
89
|
+
const Fp2Y = BLS12_381_ToFp2Point(p_y_1, p_y_2, mcl);
|
|
90
|
+
const FpOne = new mcl.Fp();
|
|
91
|
+
FpOne.setStr('1', 16);
|
|
92
|
+
const FpZero = new mcl.Fp();
|
|
93
|
+
FpZero.setStr('0', 16);
|
|
94
|
+
const Fp2One = new mcl.Fp2();
|
|
95
|
+
Fp2One.set_a(FpOne);
|
|
96
|
+
Fp2One.set_b(FpZero);
|
|
97
|
+
const p = new mcl.G2();
|
|
98
|
+
p.setX(Fp2X);
|
|
99
|
+
p.setY(Fp2Y);
|
|
100
|
+
p.setZ(Fp2One);
|
|
101
|
+
mcl.verifyOrderG2(verifyOrder);
|
|
102
|
+
if (verifyOrder && p.isValidOrder() === false) {
|
|
103
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_POINT_NOT_ON_CURVE);
|
|
104
|
+
}
|
|
105
|
+
if (p.isValid() === false) {
|
|
106
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_POINT_NOT_ON_CURVE);
|
|
107
|
+
}
|
|
108
|
+
return p;
|
|
109
|
+
}
|
|
110
|
+
// input: a mcl G2 point
|
|
111
|
+
// output: a 256-byte Uint8Array
|
|
112
|
+
function BLS12_381_FromG2Point(input) {
|
|
113
|
+
// TODO: figure out if there is a better way to decode these values.
|
|
114
|
+
const decodeStr = input.getStr(16); //return a string of pattern "1 <x_coord_1> <x_coord_2> <y_coord_1> <y_coord_2>"
|
|
115
|
+
if (decodeStr === '0') {
|
|
116
|
+
return new Uint8Array(BLS_G2_POINT_BYTE_LENGTH);
|
|
117
|
+
}
|
|
118
|
+
const decoded = decodeStr.match(/"?[0-9a-f]+"?/g); // match above pattern.
|
|
119
|
+
const xBytes1 = setLengthLeft(unprefixedHexToBytes(decoded[1]), 64);
|
|
120
|
+
const xBytes2 = setLengthLeft(unprefixedHexToBytes(decoded[2]), 64);
|
|
121
|
+
const yBytes1 = setLengthLeft(unprefixedHexToBytes(decoded[3]), 64);
|
|
122
|
+
const yBytes2 = setLengthLeft(unprefixedHexToBytes(decoded[4]), 64);
|
|
123
|
+
return concatBytes(xBytes1, xBytes2, yBytes1, yBytes2);
|
|
124
|
+
}
|
|
125
|
+
// input: a 32-byte hex scalar Uint8Array
|
|
126
|
+
// output: a mcl Fr point
|
|
127
|
+
function BLS12_381_ToFrPoint(input, mcl) {
|
|
128
|
+
// Using deprecated bytesToUnprefixedHex for performance: mcl library expects unprefixed hex strings.
|
|
129
|
+
const mclHex = mcl.fromHexStr(bytesToUnprefixedHex(input));
|
|
130
|
+
const Fr = new mcl.Fr();
|
|
131
|
+
Fr.setBigEndianMod(mclHex);
|
|
132
|
+
return Fr;
|
|
133
|
+
}
|
|
134
|
+
// input: a 64-byte buffer
|
|
135
|
+
// output: a mcl Fp point
|
|
136
|
+
function BLS12_381_ToFpPoint(fpCoordinate, mcl) {
|
|
137
|
+
// check if point is in field
|
|
138
|
+
if (bytesToBigInt(fpCoordinate) >= BLS_FIELD_MODULUS) {
|
|
139
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_FP_NOT_IN_FIELD);
|
|
140
|
+
}
|
|
141
|
+
const fp = new mcl.Fp();
|
|
142
|
+
// Using deprecated bytesToUnprefixedHex for performance: mcl library expects unprefixed hex strings.
|
|
143
|
+
fp.setBigEndianMod(mcl.fromHexStr(bytesToUnprefixedHex(fpCoordinate)));
|
|
144
|
+
return fp;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Implementation of the `EVMBLSInterface` using the `mcl-wasm` WASM `mcl` wrapper library,
|
|
148
|
+
* see https://github.com/herumi/mcl-wasm.
|
|
149
|
+
*
|
|
150
|
+
* This can be optionally used to replace the build-in Noble implementation (`NobleBLS`) with
|
|
151
|
+
* a more performant WASM variant. See EVM `bls` constructor option on how to use.
|
|
152
|
+
*/
|
|
153
|
+
export class MCLBLS {
|
|
154
|
+
constructor(mcl) {
|
|
155
|
+
this._mcl = mcl;
|
|
156
|
+
}
|
|
157
|
+
init() {
|
|
158
|
+
this._mcl.setMapToMode(this._mcl.IRTF); // set the right map mode; otherwise mapToG2 will return wrong values.
|
|
159
|
+
this._mcl.verifyOrderG1(true); // subgroup checks for G1
|
|
160
|
+
this._mcl.verifyOrderG2(true); // subgroup checks for G2
|
|
161
|
+
}
|
|
162
|
+
addG1(input) {
|
|
163
|
+
// convert input to G1 points, add them, and convert the output to a Uint8Array.
|
|
164
|
+
const p1 = BLS12_381_ToG1Point(input.subarray(0, BLS_G1_POINT_BYTE_LENGTH), this._mcl, false);
|
|
165
|
+
const p2 = BLS12_381_ToG1Point(input.subarray(BLS_G1_POINT_BYTE_LENGTH, BLS_G1_POINT_BYTE_LENGTH * 2), this._mcl, false);
|
|
166
|
+
const result = this._mcl.add(p1, p2);
|
|
167
|
+
return BLS12_381_FromG1Point(result);
|
|
168
|
+
}
|
|
169
|
+
addG2(input) {
|
|
170
|
+
// convert input to G1 points, add them, and convert the output to a Uint8Array.
|
|
171
|
+
const p1 = BLS12_381_ToG2Point(input.subarray(0, BLS_G2_POINT_BYTE_LENGTH), this._mcl, false);
|
|
172
|
+
const p2 = BLS12_381_ToG2Point(input.subarray(BLS_G2_POINT_BYTE_LENGTH, BLS_G2_POINT_BYTE_LENGTH * 2), this._mcl, false);
|
|
173
|
+
const result = this._mcl.add(p1, p2);
|
|
174
|
+
return BLS12_381_FromG2Point(result);
|
|
175
|
+
}
|
|
176
|
+
mapFPtoG1(input) {
|
|
177
|
+
// convert input to Fp1 point
|
|
178
|
+
const Fp1Point = BLS12_381_ToFpPoint(input.subarray(0, 64), this._mcl);
|
|
179
|
+
// map it to G1
|
|
180
|
+
const result = Fp1Point.mapToG1();
|
|
181
|
+
return BLS12_381_FromG1Point(result);
|
|
182
|
+
}
|
|
183
|
+
mapFP2toG2(input) {
|
|
184
|
+
// convert input to Fp2 point
|
|
185
|
+
const Fp2Point = BLS12_381_ToFp2Point(input.subarray(0, 64), input.subarray(64, 128), this._mcl);
|
|
186
|
+
// map it to G2
|
|
187
|
+
const result = Fp2Point.mapToG2();
|
|
188
|
+
return BLS12_381_FromG2Point(result);
|
|
189
|
+
}
|
|
190
|
+
msmG1(input) {
|
|
191
|
+
const pairLength = 160;
|
|
192
|
+
const numPairs = input.length / pairLength;
|
|
193
|
+
const G1Array = [];
|
|
194
|
+
const FrArray = [];
|
|
195
|
+
for (let k = 0; k < numPairs; k++) {
|
|
196
|
+
const pairStart = pairLength * k;
|
|
197
|
+
const G1 = BLS12_381_ToG1Point(input.subarray(pairStart, pairStart + BLS_G1_POINT_BYTE_LENGTH), this._mcl);
|
|
198
|
+
const Fr = BLS12_381_ToFrPoint(input.subarray(pairStart + BLS_G1_POINT_BYTE_LENGTH, pairStart + pairLength), this._mcl);
|
|
199
|
+
G1Array.push(G1);
|
|
200
|
+
FrArray.push(Fr);
|
|
201
|
+
}
|
|
202
|
+
const result = this._mcl.mulVec(G1Array, FrArray);
|
|
203
|
+
return BLS12_381_FromG1Point(result);
|
|
204
|
+
}
|
|
205
|
+
msmG2(input) {
|
|
206
|
+
const pairLength = 288;
|
|
207
|
+
const numPairs = input.length / pairLength;
|
|
208
|
+
const G2Array = [];
|
|
209
|
+
const FrArray = [];
|
|
210
|
+
for (let k = 0; k < numPairs; k++) {
|
|
211
|
+
const pairStart = pairLength * k;
|
|
212
|
+
const G2 = BLS12_381_ToG2Point(input.subarray(pairStart, pairStart + BLS_G2_POINT_BYTE_LENGTH), this._mcl);
|
|
213
|
+
const Fr = BLS12_381_ToFrPoint(input.subarray(pairStart + BLS_G2_POINT_BYTE_LENGTH, pairStart + pairLength), this._mcl);
|
|
214
|
+
G2Array.push(G2);
|
|
215
|
+
FrArray.push(Fr);
|
|
216
|
+
}
|
|
217
|
+
const result = this._mcl.mulVec(G2Array, FrArray);
|
|
218
|
+
return BLS12_381_FromG2Point(result);
|
|
219
|
+
}
|
|
220
|
+
pairingCheck(input) {
|
|
221
|
+
const pairLength = 384;
|
|
222
|
+
const pairs = [];
|
|
223
|
+
for (let k = 0; k < input.length / pairLength; k++) {
|
|
224
|
+
const pairStart = pairLength * k;
|
|
225
|
+
const G1 = BLS12_381_ToG1Point(input.subarray(pairStart, pairStart + BLS_G1_POINT_BYTE_LENGTH), this._mcl);
|
|
226
|
+
const g2start = pairStart + BLS_G1_POINT_BYTE_LENGTH;
|
|
227
|
+
const G2 = BLS12_381_ToG2Point(input.subarray(g2start, g2start + BLS_G2_POINT_BYTE_LENGTH), this._mcl);
|
|
228
|
+
pairs.push([G1, G2]);
|
|
229
|
+
}
|
|
230
|
+
// run the pairing check
|
|
231
|
+
// reference (Nethermind): https://github.com/NethermindEth/nethermind/blob/374b036414722b9c8ad27e93d64840b8f63931b9/src/Nethermind/Nethermind.Evm/Precompiles/Bls/Mcl/PairingPrecompile.cs#L93
|
|
232
|
+
let GT;
|
|
233
|
+
for (let index = 0; index < pairs.length; index++) {
|
|
234
|
+
const pair = pairs[index];
|
|
235
|
+
const G1 = pair[0];
|
|
236
|
+
const G2 = pair[1];
|
|
237
|
+
if (index === 0) {
|
|
238
|
+
GT = this._mcl.millerLoop(G1, G2);
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
GT = this._mcl.mul(GT, this._mcl.millerLoop(G1, G2));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
GT = this._mcl.finalExp(GT);
|
|
245
|
+
if (GT.isOne() === true) {
|
|
246
|
+
return BLS_ONE_BUFFER;
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
return BLS_ZERO_BUFFER;
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
export { BLS12_381_FromG1Point, BLS12_381_FromG2Point, BLS12_381_ToFp2Point, BLS12_381_ToFpPoint, BLS12_381_ToFrPoint, BLS12_381_ToG1Point, BLS12_381_ToG2Point, };
|
|
254
|
+
//# sourceMappingURL=mcl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcl.js","sourceRoot":"","sources":["../../../../src/precompiles/bls12_381/mcl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { Fp2 } from '@noble/curves/abstract/tower.js';
|
|
2
|
+
import type { AffinePoint } from '@noble/curves/abstract/weierstrass.js';
|
|
3
|
+
import type { EVMBLSInterface } from '../../types.ts';
|
|
4
|
+
declare function BLS12_381_ToFp2Point(fpXCoordinate: Uint8Array, fpYCoordinate: Uint8Array): Fp2;
|
|
5
|
+
/**
|
|
6
|
+
* Converts an Uint8Array to a Noble G1 point. Raises errors if the point is not on the curve
|
|
7
|
+
* and (if activated) if the point is in the subgroup / order check.
|
|
8
|
+
* @param input Input Uint8Array. Should be 128 bytes
|
|
9
|
+
* @returns Noble G1 point
|
|
10
|
+
*/
|
|
11
|
+
declare function BLS12_381_ToG1Point(input: Uint8Array, verifyOrder?: boolean): import("@noble/curves/abstract/weierstrass.js").WeierstrassPoint<bigint>;
|
|
12
|
+
declare function BLS12_381_FromG1Point(input: AffinePoint<bigint>): Uint8Array;
|
|
13
|
+
/**
|
|
14
|
+
* Converts an Uint8Array to a Noble G2 point. Raises errors if the point is not on the curve
|
|
15
|
+
* and (if activated) if the point is in the subgroup / order check.
|
|
16
|
+
* @param input Input Uint8Array. Should be 256 bytes
|
|
17
|
+
* @returns Noble G2 point
|
|
18
|
+
*/
|
|
19
|
+
declare function BLS12_381_ToG2Point(input: Uint8Array, verifyOrder?: boolean): import("@noble/curves/abstract/weierstrass.js").WeierstrassPoint<Fp2>;
|
|
20
|
+
declare function BLS12_381_FromG2Point(input: AffinePoint<Fp2>): Uint8Array;
|
|
21
|
+
declare function BLS12_381_ToFrPoint(input: Uint8Array): bigint;
|
|
22
|
+
declare function BLS12_381_ToFpPoint(fpCoordinate: Uint8Array): bigint;
|
|
23
|
+
/**
|
|
24
|
+
* Implementation of the `EVMBLSInterface` using the `ethereum-cryptography (`@noble/curves`)
|
|
25
|
+
* JS library, see https://github.com/ethereum/js-ethereum-cryptography.
|
|
26
|
+
*
|
|
27
|
+
* This is the EVM default implementation.
|
|
28
|
+
*/
|
|
29
|
+
export declare class NobleBLS implements EVMBLSInterface {
|
|
30
|
+
addG1(input: Uint8Array): Uint8Array;
|
|
31
|
+
addG2(input: Uint8Array): Uint8Array;
|
|
32
|
+
mapFPtoG1(input: Uint8Array): Uint8Array;
|
|
33
|
+
mapFP2toG2(input: Uint8Array): Uint8Array;
|
|
34
|
+
msmG1(input: Uint8Array): Uint8Array;
|
|
35
|
+
msmG2(input: Uint8Array): Uint8Array;
|
|
36
|
+
pairingCheck(input: Uint8Array): Uint8Array;
|
|
37
|
+
}
|
|
38
|
+
export { BLS12_381_FromG1Point, BLS12_381_FromG2Point, BLS12_381_ToFp2Point, BLS12_381_ToFpPoint, BLS12_381_ToFrPoint, BLS12_381_ToG1Point, BLS12_381_ToG2Point, };
|
|
39
|
+
//# sourceMappingURL=noble.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noble.d.ts","sourceRoot":"","sources":["../../../../src/precompiles/bls12_381/noble.ts"],"names":[],"mappings":"AAsBA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,iCAAiC,CAAA;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,uCAAuC,CAAA;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAMrD,iBAAS,oBAAoB,CAAC,aAAa,EAAE,UAAU,EAAE,aAAa,EAAE,UAAU,OAajF;AAED;;;;;GAKG;AACH,iBAAS,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,UAAO,4EAqBjE;AAID,iBAAS,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,UAAU,CAKrE;AAED;;;;;GAKG;AACH,iBAAS,mBAAmB,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,UAAO,yEA0BjE;AAID,iBAAS,qBAAqB,CAAC,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,GAAG,UAAU,CAOlE;AAKD,iBAAS,mBAAmB,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,CAMtD;AAKD,iBAAS,mBAAmB,CAAC,YAAY,EAAE,UAAU,UAOpD;AAED;;;;;GAKG;AACH,qBAAa,QAAS,YAAW,eAAe;IAC9C,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAapC,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAYpC,SAAS,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAUxC,UAAU,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAUzC,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAgCpC,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;IAgCpC,YAAY,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU;CA6B5C;AAED,OAAO,EACL,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,EACnB,mBAAmB,GACpB,CAAA"}
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
import { BIGINT_0, bigIntToBytes, bytesToBigInt, concatBytes, equalsBytes, setLengthLeft, } from '@feelyourprotocol/util';
|
|
2
|
+
import { bls12_381 } from '@noble/curves/bls12-381.js';
|
|
3
|
+
import { EVMError } from "../../errors.js";
|
|
4
|
+
import { BLS_FIELD_MODULUS, BLS_G1_INFINITY_POINT_BYTES, BLS_G1_POINT_BYTE_LENGTH, BLS_G2_INFINITY_POINT_BYTES, BLS_G2_POINT_BYTE_LENGTH, BLS_ONE_BUFFER, BLS_ZERO_BUFFER, } from "./constants.js";
|
|
5
|
+
const G1_ZERO = bls12_381.G1.Point.ZERO;
|
|
6
|
+
const G2_ZERO = bls12_381.G2.Point.ZERO;
|
|
7
|
+
function BLS12_381_ToFp2Point(fpXCoordinate, fpYCoordinate) {
|
|
8
|
+
// check if the coordinates are in the field
|
|
9
|
+
if (bytesToBigInt(fpXCoordinate) >= BLS_FIELD_MODULUS) {
|
|
10
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_FP_NOT_IN_FIELD);
|
|
11
|
+
}
|
|
12
|
+
if (bytesToBigInt(fpYCoordinate) >= BLS_FIELD_MODULUS) {
|
|
13
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_FP_NOT_IN_FIELD);
|
|
14
|
+
}
|
|
15
|
+
const fpBytes = concatBytes(fpXCoordinate.subarray(16), fpYCoordinate.subarray(16));
|
|
16
|
+
const FP = bls12_381.fields.Fp2.fromBytes(fpBytes);
|
|
17
|
+
return FP;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Converts an Uint8Array to a Noble G1 point. Raises errors if the point is not on the curve
|
|
21
|
+
* and (if activated) if the point is in the subgroup / order check.
|
|
22
|
+
* @param input Input Uint8Array. Should be 128 bytes
|
|
23
|
+
* @returns Noble G1 point
|
|
24
|
+
*/
|
|
25
|
+
function BLS12_381_ToG1Point(input, verifyOrder = true) {
|
|
26
|
+
if (equalsBytes(input, BLS_G1_INFINITY_POINT_BYTES) === true) {
|
|
27
|
+
return G1_ZERO;
|
|
28
|
+
}
|
|
29
|
+
const x = bytesToBigInt(input.subarray(16, BLS_G1_POINT_BYTE_LENGTH / 2));
|
|
30
|
+
const y = bytesToBigInt(input.subarray(80, BLS_G1_POINT_BYTE_LENGTH));
|
|
31
|
+
const G1 = bls12_381.G1.Point.fromAffine({
|
|
32
|
+
x,
|
|
33
|
+
y,
|
|
34
|
+
});
|
|
35
|
+
try {
|
|
36
|
+
G1.assertValidity();
|
|
37
|
+
}
|
|
38
|
+
catch (e) {
|
|
39
|
+
if (verifyOrder || e.message !== 'bad point: not in prime-order subgroup')
|
|
40
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_POINT_NOT_ON_CURVE);
|
|
41
|
+
}
|
|
42
|
+
return G1;
|
|
43
|
+
}
|
|
44
|
+
// input: a Noble G1 point
|
|
45
|
+
// output: a 128-byte Uint8Array
|
|
46
|
+
function BLS12_381_FromG1Point(input) {
|
|
47
|
+
const xBytes = setLengthLeft(bigIntToBytes(input.x), 64);
|
|
48
|
+
const yBytes = setLengthLeft(bigIntToBytes(input.y), 64);
|
|
49
|
+
return concatBytes(xBytes, yBytes);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Converts an Uint8Array to a Noble G2 point. Raises errors if the point is not on the curve
|
|
53
|
+
* and (if activated) if the point is in the subgroup / order check.
|
|
54
|
+
* @param input Input Uint8Array. Should be 256 bytes
|
|
55
|
+
* @returns Noble G2 point
|
|
56
|
+
*/
|
|
57
|
+
function BLS12_381_ToG2Point(input, verifyOrder = true) {
|
|
58
|
+
if (equalsBytes(input, BLS_G2_INFINITY_POINT_BYTES) === true) {
|
|
59
|
+
return G2_ZERO;
|
|
60
|
+
}
|
|
61
|
+
const p_x_1 = input.subarray(0, 64);
|
|
62
|
+
const p_x_2 = input.subarray(64, BLS_G2_POINT_BYTE_LENGTH / 2);
|
|
63
|
+
const p_y_1 = input.subarray(128, 192);
|
|
64
|
+
const p_y_2 = input.subarray(192, BLS_G2_POINT_BYTE_LENGTH);
|
|
65
|
+
const Fp2X = BLS12_381_ToFp2Point(p_x_1, p_x_2);
|
|
66
|
+
const Fp2Y = BLS12_381_ToFp2Point(p_y_1, p_y_2);
|
|
67
|
+
const pG2 = bls12_381.G2.Point.fromAffine({
|
|
68
|
+
x: Fp2X,
|
|
69
|
+
y: Fp2Y,
|
|
70
|
+
});
|
|
71
|
+
try {
|
|
72
|
+
pG2.assertValidity();
|
|
73
|
+
}
|
|
74
|
+
catch (e) {
|
|
75
|
+
if (verifyOrder || e.message !== 'bad point: not in prime-order subgroup')
|
|
76
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_POINT_NOT_ON_CURVE);
|
|
77
|
+
}
|
|
78
|
+
return pG2;
|
|
79
|
+
}
|
|
80
|
+
// input: a Noble G1 point
|
|
81
|
+
// output: a 128-byte Uint8Array
|
|
82
|
+
function BLS12_381_FromG2Point(input) {
|
|
83
|
+
const xBytes1 = setLengthLeft(bigIntToBytes(input.x.c0), 64);
|
|
84
|
+
const xBytes2 = setLengthLeft(bigIntToBytes(input.x.c1), 64);
|
|
85
|
+
const yBytes1 = setLengthLeft(bigIntToBytes(input.y.c0), 64);
|
|
86
|
+
const yBytes2 = setLengthLeft(bigIntToBytes(input.y.c1), 64);
|
|
87
|
+
return concatBytes(xBytes1, xBytes2, yBytes1, yBytes2);
|
|
88
|
+
}
|
|
89
|
+
// input: a 32-byte hex scalar Uint8Array
|
|
90
|
+
// output: a Noble Fr point
|
|
91
|
+
function BLS12_381_ToFrPoint(input) {
|
|
92
|
+
const Fr = bls12_381.fields.Fr.fromBytes(input);
|
|
93
|
+
if (Fr >= bls12_381.fields.Fr.ORDER) {
|
|
94
|
+
return bls12_381.fields.Fr.create(Fr % bls12_381.fields.Fr.ORDER);
|
|
95
|
+
}
|
|
96
|
+
return bls12_381.fields.Fr.create(Fr);
|
|
97
|
+
}
|
|
98
|
+
// input: a 64-byte buffer
|
|
99
|
+
// output: a Noble Fp point
|
|
100
|
+
function BLS12_381_ToFpPoint(fpCoordinate) {
|
|
101
|
+
// check if point is in field
|
|
102
|
+
if (bytesToBigInt(fpCoordinate) >= BLS_FIELD_MODULUS) {
|
|
103
|
+
throw new EVMError(EVMError.errorMessages.BLS_12_381_FP_NOT_IN_FIELD);
|
|
104
|
+
}
|
|
105
|
+
const FP = bls12_381.fields.Fp.fromBytes(fpCoordinate.slice(16));
|
|
106
|
+
return FP;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Implementation of the `EVMBLSInterface` using the `ethereum-cryptography (`@noble/curves`)
|
|
110
|
+
* JS library, see https://github.com/ethereum/js-ethereum-cryptography.
|
|
111
|
+
*
|
|
112
|
+
* This is the EVM default implementation.
|
|
113
|
+
*/
|
|
114
|
+
export class NobleBLS {
|
|
115
|
+
addG1(input) {
|
|
116
|
+
const p1 = BLS12_381_ToG1Point(input.subarray(0, BLS_G1_POINT_BYTE_LENGTH), false);
|
|
117
|
+
const p2 = BLS12_381_ToG1Point(input.subarray(BLS_G1_POINT_BYTE_LENGTH, BLS_G1_POINT_BYTE_LENGTH * 2), false);
|
|
118
|
+
const p = p1.add(p2);
|
|
119
|
+
const result = BLS12_381_FromG1Point(p.toAffine());
|
|
120
|
+
return result;
|
|
121
|
+
}
|
|
122
|
+
addG2(input) {
|
|
123
|
+
const p1 = BLS12_381_ToG2Point(input.subarray(0, BLS_G2_POINT_BYTE_LENGTH), false);
|
|
124
|
+
const p2 = BLS12_381_ToG2Point(input.subarray(BLS_G2_POINT_BYTE_LENGTH, BLS_G2_POINT_BYTE_LENGTH * 2), false);
|
|
125
|
+
const p = p1.add(p2);
|
|
126
|
+
const result = BLS12_381_FromG2Point(p.toAffine());
|
|
127
|
+
return result;
|
|
128
|
+
}
|
|
129
|
+
mapFPtoG1(input) {
|
|
130
|
+
// convert input to Fp1 point
|
|
131
|
+
const FP = BLS12_381_ToFpPoint(input.subarray(0, 64));
|
|
132
|
+
// @ts-expect-error - @noble/curves v2 type resolution mismatch
|
|
133
|
+
const result = bls12_381.G1.mapToCurve(FP).toAffine();
|
|
134
|
+
const resultBytes = BLS12_381_FromG1Point(result);
|
|
135
|
+
return resultBytes;
|
|
136
|
+
}
|
|
137
|
+
mapFP2toG2(input) {
|
|
138
|
+
// convert input to Fp2 point
|
|
139
|
+
const Fp2Point = BLS12_381_ToFp2Point(input.subarray(0, 64), input.subarray(64, 128));
|
|
140
|
+
// @ts-expect-error - @noble/curves v2 type resolution mismatch
|
|
141
|
+
const result = bls12_381.G2.mapToCurve([Fp2Point.c0, Fp2Point.c1]).toAffine();
|
|
142
|
+
const resultBytes = BLS12_381_FromG2Point(result);
|
|
143
|
+
return resultBytes;
|
|
144
|
+
}
|
|
145
|
+
msmG1(input) {
|
|
146
|
+
// Note: This implementation is using the naive "algorithm" of just doing
|
|
147
|
+
// p1G1*v1F1 + p2G1*v1F1 + ... while the EIP is suggesting to use an optimized
|
|
148
|
+
// algorithm (Pippenger's algorithm, see https://eips.ethereum.org/EIPS/eip-2537#g1g2-msm).
|
|
149
|
+
//
|
|
150
|
+
// While this functionally works the approach is not "gas-cost-competitive" and an
|
|
151
|
+
// optimization should be considered in the future.
|
|
152
|
+
const pairLength = 160;
|
|
153
|
+
const numPairs = input.length / pairLength;
|
|
154
|
+
let pRes = G1_ZERO;
|
|
155
|
+
for (let k = 0; k < numPairs; k++) {
|
|
156
|
+
const pairStart = pairLength * k;
|
|
157
|
+
const G1 = BLS12_381_ToG1Point(input.subarray(pairStart, pairStart + BLS_G1_POINT_BYTE_LENGTH));
|
|
158
|
+
const Fr = BLS12_381_ToFrPoint(input.subarray(pairStart + BLS_G1_POINT_BYTE_LENGTH, pairStart + pairLength));
|
|
159
|
+
let pMul;
|
|
160
|
+
if (Fr === BIGINT_0) {
|
|
161
|
+
pMul = G1_ZERO;
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
pMul = G1.multiplyUnsafe(Fr);
|
|
165
|
+
}
|
|
166
|
+
pRes = pRes.add(pMul);
|
|
167
|
+
}
|
|
168
|
+
return BLS12_381_FromG1Point(pRes.toAffine());
|
|
169
|
+
}
|
|
170
|
+
msmG2(input) {
|
|
171
|
+
// Note: This implementation is using the naive "algorithm" of just doing
|
|
172
|
+
// p1G1*v1F1 + p2G1*v1F1 + ... while the EIP is suggesting to use an optimized
|
|
173
|
+
// algorithm (Pippenger's algorithm, see https://eips.ethereum.org/EIPS/eip-2537#g1g2-msm).
|
|
174
|
+
//
|
|
175
|
+
// While this functionally works the approach is not "gas-cost-competitive" and an
|
|
176
|
+
// optimization should be considered in the future.
|
|
177
|
+
const pairLength = 288;
|
|
178
|
+
const numPairs = input.length / pairLength;
|
|
179
|
+
let pRes = G2_ZERO;
|
|
180
|
+
for (let k = 0; k < numPairs; k++) {
|
|
181
|
+
const pairStart = pairLength * k;
|
|
182
|
+
const G2 = BLS12_381_ToG2Point(input.subarray(pairStart, pairStart + BLS_G2_POINT_BYTE_LENGTH));
|
|
183
|
+
const Fr = BLS12_381_ToFrPoint(input.subarray(pairStart + BLS_G2_POINT_BYTE_LENGTH, pairStart + pairLength));
|
|
184
|
+
let pMul;
|
|
185
|
+
if (Fr === BIGINT_0) {
|
|
186
|
+
pMul = G2_ZERO;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
pMul = G2.multiplyUnsafe(Fr);
|
|
190
|
+
}
|
|
191
|
+
pRes = pRes.add(pMul);
|
|
192
|
+
}
|
|
193
|
+
return BLS12_381_FromG2Point(pRes.toAffine());
|
|
194
|
+
}
|
|
195
|
+
pairingCheck(input) {
|
|
196
|
+
// Extract the pairs from the input
|
|
197
|
+
const pairLength = 384;
|
|
198
|
+
const pairs = [];
|
|
199
|
+
for (let k = 0; k < input.length / pairLength; k++) {
|
|
200
|
+
const pairStart = pairLength * k;
|
|
201
|
+
const G1 = BLS12_381_ToG1Point(input.subarray(pairStart, pairStart + BLS_G1_POINT_BYTE_LENGTH));
|
|
202
|
+
const g2start = pairStart + BLS_G1_POINT_BYTE_LENGTH;
|
|
203
|
+
const G2 = BLS12_381_ToG2Point(input.subarray(g2start, g2start + BLS_G2_POINT_BYTE_LENGTH));
|
|
204
|
+
pairs.push({ g1: G1, g2: G2 });
|
|
205
|
+
}
|
|
206
|
+
// Filter out infinity pairs
|
|
207
|
+
const filteredPairs = pairs.filter((pair) => pair.g1.equals(G1_ZERO) === false && pair.g2.equals(G2_ZERO) === false);
|
|
208
|
+
const FP12 = bls12_381.pairingBatch(filteredPairs, true);
|
|
209
|
+
if (bls12_381.fields.Fp12.eql(FP12, bls12_381.fields.Fp12.ONE)) {
|
|
210
|
+
return BLS_ONE_BUFFER;
|
|
211
|
+
}
|
|
212
|
+
else {
|
|
213
|
+
return BLS_ZERO_BUFFER;
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
export { BLS12_381_FromG1Point, BLS12_381_FromG2Point, BLS12_381_ToFp2Point, BLS12_381_ToFpPoint, BLS12_381_ToFrPoint, BLS12_381_ToG1Point, BLS12_381_ToG2Point, };
|
|
218
|
+
//# sourceMappingURL=noble.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"noble.js","sourceRoot":"","sources":["../../../../src/precompiles/bls12_381/noble.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { PrecompileInput } from '../types.ts';
|
|
2
|
+
/**
|
|
3
|
+
* Calculates the gas used for the MSM precompiles based on the number of pairs and
|
|
4
|
+
* calculating in some discount in relation to the number of pairs.
|
|
5
|
+
*
|
|
6
|
+
* @param numPairs - Number of pairings provided to the precompile
|
|
7
|
+
* @param gasUsedPerPair - Base gas cost per pairing
|
|
8
|
+
* @param discountTable - Discount table (pair count -> multiplier)
|
|
9
|
+
* @returns Total gas to charge after applying the discount table
|
|
10
|
+
*/
|
|
11
|
+
export declare const msmGasUsed: (numPairs: number, gasUsedPerPair: bigint, discountTable: [number, number][]) => bigint;
|
|
12
|
+
/**
|
|
13
|
+
* BLS-specific zero check to check that the top 16 bytes of a 64 byte field element provided
|
|
14
|
+
* are always zero (see EIP notes on field element encoding).
|
|
15
|
+
*
|
|
16
|
+
* Zero byte ranges are expected to be passed in the following format (and so each referencing
|
|
17
|
+
* 16-byte ranges):
|
|
18
|
+
*
|
|
19
|
+
* ```ts
|
|
20
|
+
* const zeroByteRanges = [
|
|
21
|
+
* [0, 16],
|
|
22
|
+
* [64, 80],
|
|
23
|
+
* [128, 144]
|
|
24
|
+
*
|
|
25
|
+
* ]
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @param opts - Precompile input wrapper containing the data to inspect
|
|
29
|
+
* @param zeroByteRanges - Ranges (as [start, end]) within which bytes must be zero
|
|
30
|
+
* @param pName - Human readable precompile name for logging
|
|
31
|
+
* @param pairStart - Optional offset into the data when iterating through pairs
|
|
32
|
+
* @returns `true` if every specified range contains only zero bytes
|
|
33
|
+
*/
|
|
34
|
+
export declare const leading16ZeroBytesCheck: (opts: PrecompileInput, zeroByteRanges: number[][], pName: string, pairStart?: number) => boolean;
|
|
35
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/precompiles/bls12_381/util.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAIlD;;;;;;;;GAQG;AACH,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,EAChB,gBAAgB,MAAM,EACtB,eAAe,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,WAgBlC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,uBAAuB,GAClC,MAAM,eAAe,EACrB,gBAAgB,MAAM,EAAE,EAAE,EAC1B,OAAO,MAAM,EACb,kBAAa,YAed,CAAA"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { equalsBytes } from '@feelyourprotocol/util';
|
|
2
|
+
const ZERO_BYTES_16 = new Uint8Array(16);
|
|
3
|
+
/**
|
|
4
|
+
* Calculates the gas used for the MSM precompiles based on the number of pairs and
|
|
5
|
+
* calculating in some discount in relation to the number of pairs.
|
|
6
|
+
*
|
|
7
|
+
* @param numPairs - Number of pairings provided to the precompile
|
|
8
|
+
* @param gasUsedPerPair - Base gas cost per pairing
|
|
9
|
+
* @param discountTable - Discount table (pair count -> multiplier)
|
|
10
|
+
* @returns Total gas to charge after applying the discount table
|
|
11
|
+
*/
|
|
12
|
+
export const msmGasUsed = (numPairs, gasUsedPerPair, discountTable) => {
|
|
13
|
+
const gasDiscountMax = discountTable[discountTable.length - 1][1];
|
|
14
|
+
let gasDiscountMultiplier;
|
|
15
|
+
if (numPairs <= discountTable.length) {
|
|
16
|
+
if (numPairs === 0) {
|
|
17
|
+
gasDiscountMultiplier = 0; // this implicitly sets gasUsed to 0 as per the EIP.
|
|
18
|
+
}
|
|
19
|
+
else {
|
|
20
|
+
gasDiscountMultiplier = discountTable[numPairs - 1][1];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
gasDiscountMultiplier = gasDiscountMax;
|
|
25
|
+
}
|
|
26
|
+
// (numPairs * multiplication_cost * discount) / multiplier
|
|
27
|
+
return (BigInt(numPairs) * gasUsedPerPair * BigInt(gasDiscountMultiplier)) / BigInt(1000);
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* BLS-specific zero check to check that the top 16 bytes of a 64 byte field element provided
|
|
31
|
+
* are always zero (see EIP notes on field element encoding).
|
|
32
|
+
*
|
|
33
|
+
* Zero byte ranges are expected to be passed in the following format (and so each referencing
|
|
34
|
+
* 16-byte ranges):
|
|
35
|
+
*
|
|
36
|
+
* ```ts
|
|
37
|
+
* const zeroByteRanges = [
|
|
38
|
+
* [0, 16],
|
|
39
|
+
* [64, 80],
|
|
40
|
+
* [128, 144]
|
|
41
|
+
*
|
|
42
|
+
* ]
|
|
43
|
+
* ```
|
|
44
|
+
*
|
|
45
|
+
* @param opts - Precompile input wrapper containing the data to inspect
|
|
46
|
+
* @param zeroByteRanges - Ranges (as [start, end]) within which bytes must be zero
|
|
47
|
+
* @param pName - Human readable precompile name for logging
|
|
48
|
+
* @param pairStart - Optional offset into the data when iterating through pairs
|
|
49
|
+
* @returns `true` if every specified range contains only zero bytes
|
|
50
|
+
*/
|
|
51
|
+
export const leading16ZeroBytesCheck = (opts, zeroByteRanges, pName, pairStart = 0) => {
|
|
52
|
+
for (const index in zeroByteRanges) {
|
|
53
|
+
const slicedBuffer = opts.data.subarray(zeroByteRanges[index][0] + pairStart, zeroByteRanges[index][1] + pairStart);
|
|
54
|
+
if (!(equalsBytes(slicedBuffer, ZERO_BYTES_16) === true)) {
|
|
55
|
+
if (opts._debug !== undefined) {
|
|
56
|
+
opts._debug(`${pName} failed: Point not on curve`);
|
|
57
|
+
}
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
};
|
|
63
|
+
//# sourceMappingURL=util.js.map
|