diff --git a/.github/workflows/build.yaml b/.github/workflows/build.yaml index 5cfe184..b8d4659 100644 --- a/.github/workflows/build.yaml +++ b/.github/workflows/build.yaml @@ -11,6 +11,8 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 + with: + submodules: true - name: Set up Go uses: actions/setup-go@v3 @@ -63,6 +65,9 @@ jobs: run: | go mod download + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + - name: Cache binaries uses: actions/cache@v3 id: cache-bin @@ -70,6 +75,10 @@ jobs: path: ${{ runner.temp }}/bin key: ${{ runner.os }}-binaries + - name: Build Contracts + run: | + forge build --force + - name: Download geth and reth if: steps.cache-bin.outputs.cache-hit != 'true' run: | @@ -118,4 +127,14 @@ jobs: --config ./configs/contract.yml \ --root-dir ${{ runner.temp }}/data-dir \ --output-dir ${{ runner.temp }}/output \ + --geth-bin ${{ runner.temp }}/bin/geth + - name: Run ERC20 Benchmark + id: erc20 + run: | + go run benchmark/cmd/main.go \ + --log.level info \ + run \ + --config ./configs/erc20.yml \ + --root-dir ${{ runner.temp }}/data-dir \ + --output-dir ${{ runner.temp }}/output \ --geth-bin ${{ runner.temp }}/bin/geth \ No newline at end of file diff --git a/.github/workflows/public-benchmarks.yaml b/.github/workflows/public-benchmarks.yaml index 073c9ca..0609926 100644 --- a/.github/workflows/public-benchmarks.yaml +++ b/.github/workflows/public-benchmarks.yaml @@ -9,7 +9,9 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 + - uses: actions/checkout@v4 + with: + submodules: true - name: Set up Go uses: actions/setup-go@v3 @@ -30,6 +32,13 @@ jobs: path: ${{ runner.temp }}/bin key: ${{ runner.os }}-binaries + - name: Install Foundry + uses: foundry-rs/foundry-toolchain@v1 + + - name: Build Contracts + run: | + forge build --force + - name: Download geth and reth if: steps.cache-bin.outputs.cache-hit != 'true' run: | diff --git a/.gitignore b/.gitignore index 316a4fc..278b6ea 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,6 @@ data-dir/ output/ .vercel + +contracts/cache/ +contracts/out/ diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..d20cc46 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,6 @@ +[submodule "contracts/lib/openzeppelin"] + path = contracts/lib/openzeppelin + url = https://github.com/OpenZeppelin/openzeppelin-contracts +[submodule "contracts/lib/forge-std"] + path = contracts/lib/forge-std + url = https://github.com/foundry-rs/forge-std diff --git a/Makefile b/Makefile index d7e6eae..83a2fca 100644 --- a/Makefile +++ b/Makefile @@ -19,9 +19,13 @@ LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) LDFLAGSSTRING +=-X main.Version=$(VERSION) LDFLAGS := -ldflags "$(LDFLAGSSTRING)" +.PHONY: contracts +contracts: + forge build --force + .PHONY: build build: - env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/base-bench ./benchmark/cmd + forge build --force && env GO111MODULE=on GOOS=$(TARGETOS) GOARCH=$(TARGETARCH) CGO_ENABLED=0 go build -v $(LDFLAGS) -o ./bin/base-bench ./benchmark/cmd .PHONY: clean clean: diff --git a/README.md b/README.md index 00763f3..47305e0 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,14 @@ Base Benchmark provides comprehensive testing capabilities: ## 📋 Quick Start +[Install Forge](https://book.getfoundry.sh/getting-started/installation) + +Recursively clone github submodules: + +```bash +git submodule update --init --recursive +``` + ```bash # Build the application make build diff --git a/configs/contract.yml b/configs/contract.yml index 63538f7..2f53113 100644 --- a/configs/contract.yml +++ b/configs/contract.yml @@ -5,7 +5,7 @@ variables: - type: transaction_workload values: - - contract:1:ecpairing(uint256,bytes):10000000:0x:./contracts/ecpairing.hex + - contract:1:ecpairing(uint256,bytes):10000000:0x:Precompile - type: node_type values: - geth diff --git a/configs/contracts/ecpairing.hex b/configs/contracts/ecpairing.hex deleted file mode 100644 index 34f25b4..0000000 --- a/configs/contracts/ecpairing.hex +++ /dev/null @@ -1 +0,0 @@ -0x6080604052348015600f57600080fd5b506004600081905550610e2b806100276000396000f3fe608060405234801561001057600080fd5b50600436106100575760003560e01c8063292098271461005c5780635d19d817146100785780636bb5fb1e146100945780636d92aec4146100b0578063de292789146100cc575b600080fd5b61007660048036038101906100719190610817565b6100ea565b005b610092600480360381019061008d9190610817565b610107565b005b6100ae60048036038101906100a99190610817565b610292565b005b6100ca60048036038101906100c59190610817565b6105e7565b005b6100d4610769565b6040516100e19190610886565b60405180910390f35b826000808282546100fb91906108d0565b92505081905550505050565b60005a90506000807f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd3905060007f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490506000600190506000600290505b8885101561028757600080600673ffffffffffffffffffffffffffffffffffffffff168686868660405160200161019e9493929190610904565b6040516020818303038152906040526040516101ba91906109ba565b600060405180830381855afa9150503d80600081146101f5576040519150601f19603f3d011682016040523d82523d6000602084013e6101fa565b606091505b50915091508161023f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161023690610a2e565b60405180910390fd5b808060200190518101906102539190610a63565b80945081955050505a886102679190610aa3565b965060008081548092919061027b90610ad7565b91905055505050610164565b505050505050505050565b60005a90506000806040518060c001604052807f2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da81526020017f2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f681526020017f1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc81526020017f22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d981526020017f2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f9081526020017f2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e81525090505b858210156105df57600080600873ffffffffffffffffffffffffffffffffffffffff16836040516020016103be9190610bca565b6040516020818303038152906040526040516103da91906109ba565b600060405180830381855afa9150503d8060008114610415576040519150601f19603f3d011682016040523d82523d6000602084013e61041a565b606091505b50915091508161045f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161045690610c31565b60405180910390fd5b600673ffffffffffffffffffffffffffffffffffffffff168360006006811061048b5761048a610c51565b5b6020020151846001600681106104a4576104a3610c51565b5b6020020151600160026040516020016104c09493929190610d0d565b6040516020818303038152906040526040516104dc91906109ba565b600060405180830381855afa9150503d8060008114610517576040519150601f19603f3d011682016040523d82523d6000602084013e61051c565b606091505b50809250819350505081610565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161055c90610a2e565b60405180910390fd5b808060200190518101906105799190610a63565b8460006006811061058d5761058c610c51565b5b60200201856001600681106105a5576105a4610c51565b5b60200201828152508281525050505a856105bf9190610aa3565b93506000808154809291906105d390610ad7565b9190505550505061038a565b505050505050565b60005a90506000807f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd3905060007f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490506000600290505b8784101561075f57600080600773ffffffffffffffffffffffffffffffffffffffff1685858560405160200161067693929190610d52565b60405160208183030381529060405260405161069291906109ba565b600060405180830381855afa9150503d80600081146106cd576040519150601f19603f3d011682016040523d82523d6000602084013e6106d2565b606091505b509150915081610717576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161070e90610dd5565b60405180910390fd5b8080602001905181019061072b9190610a63565b80955081965050505a8761073f9190610aa3565b955060008081548092919061075390610ad7565b9190505550505061063e565b5050505050505050565b60008054905090565b600080fd5b600080fd5b6000819050919050565b61078f8161077c565b811461079a57600080fd5b50565b6000813590506107ac81610786565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f8401126107d7576107d66107b2565b5b8235905067ffffffffffffffff8111156107f4576107f36107b7565b5b6020830191508360018202830111156108105761080f6107bc565b5b9250929050565b6000806000604084860312156108305761082f610772565b5b600061083e8682870161079d565b935050602084013567ffffffffffffffff81111561085f5761085e610777565b5b61086b868287016107c1565b92509250509250925092565b6108808161077c565b82525050565b600060208201905061089b6000830184610877565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006108db8261077c565b91506108e68361077c565b92508282019050808211156108fe576108fd6108a1565b5b92915050565b60006080820190506109196000830187610877565b6109266020830186610877565b6109336040830185610877565b6109406060830184610877565b95945050505050565b600081519050919050565b600081905092915050565b60005b8381101561097d578082015181840152602081019050610962565b60008484015250505050565b600061099482610949565b61099e8185610954565b93506109ae81856020860161095f565b80840191505092915050565b60006109c68284610989565b915081905092915050565b600082825260208201905092915050565b7f4543416464206661696c65640000000000000000000000000000000000000000600082015250565b6000610a18600c836109d1565b9150610a23826109e2565b602082019050919050565b60006020820190508181036000830152610a4781610a0b565b9050919050565b600081519050610a5d81610786565b92915050565b60008060408385031215610a7a57610a79610772565b5b6000610a8885828601610a4e565b9250506020610a9985828601610a4e565b9150509250929050565b6000610aae8261077c565b9150610ab98361077c565b9250828203905081811115610ad157610ad06108a1565b5b92915050565b6000610ae28261077c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610b1457610b136108a1565b5b600182019050919050565b600060069050919050565b600081905092915050565b6000819050919050565b610b488161077c565b82525050565b6000610b5a8383610b3f565b60208301905092915050565b6000602082019050919050565b610b7c81610b1f565b610b868184610b2a565b9250610b9182610b35565b8060005b83811015610bc2578151610ba98782610b4e565b9650610bb483610b66565b925050600181019050610b95565b505050505050565b600060c082019050610bdf6000830184610b73565b92915050565b7f454350616972696e67206661696c656400000000000000000000000000000000600082015250565b6000610c1b6010836109d1565b9150610c2682610be5565b602082019050919050565b60006020820190508181036000830152610c4a81610c0e565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b600060ff82169050919050565b6000819050919050565b6000610cbc610cb7610cb284610c80565b610c97565b610c8a565b9050919050565b610ccc81610ca1565b82525050565b6000819050919050565b6000610cf7610cf2610ced84610cd2565b610c97565b610c8a565b9050919050565b610d0781610cdc565b82525050565b6000608082019050610d226000830187610877565b610d2f6020830186610877565b610d3c6040830185610cc3565b610d496060830184610cfe565b95945050505050565b6000606082019050610d676000830186610877565b610d746020830185610877565b610d816040830184610877565b949350505050565b7f45434d756c206661696c65640000000000000000000000000000000000000000600082015250565b6000610dbf600c836109d1565b9150610dca82610d89565b602082019050919050565b60006020820190508181036000830152610dee81610db2565b905091905056fea2646970667358221220d6374dd4551a2f088a2b9e4df51468c7047bf7876de789905c5341d0bac56e5f64736f6c634300081c0033 \ No newline at end of file diff --git a/configs/contracts/erc20.hex b/configs/contracts/erc20.hex deleted file mode 100644 index e8f74b6..0000000 --- a/configs/contracts/erc20.hex +++ /dev/null @@ -1 +0,0 @@ -0x6080604052600060065534801561001557600080fd5b506040518060400160405280600581526020017f546f6b656e0000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f544b4e0000000000000000000000000000000000000000000000000000000000815250816003908161009191906105ed565b5080600490816100a191906105ed565b5050506100db336100b66100e760201b60201c565b600a6100c2919061082e565b629896806100d09190610879565b6100f060201b60201c565b600580819055506109ac565b60006012905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036101625760006040517fec442f0500000000000000000000000000000000000000000000000000000000815260040161015991906108fc565b60405180910390fd5b6101746000838361017860201b60201c565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036101ca5780600260008282546101be9190610917565b9250508190555061029d565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610256578381836040517fe450d38c00000000000000000000000000000000000000000000000000000000815260040161024d9392919061095a565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036102e65780600260008282540392505081905550610333565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040516103909190610991565b60405180910390a3505050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061041e57607f821691505b602082108103610431576104306103d7565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026104997fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261045c565b6104a3868361045c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006104ea6104e56104e0846104bb565b6104c5565b6104bb565b9050919050565b6000819050919050565b610504836104cf565b610518610510826104f1565b848454610469565b825550505050565b600090565b61052d610520565b6105388184846104fb565b505050565b5b8181101561055c57610551600082610525565b60018101905061053e565b5050565b601f8211156105a15761057281610437565b61057b8461044c565b8101602085101561058a578190505b61059e6105968561044c565b83018261053d565b50505b505050565b600082821c905092915050565b60006105c4600019846008026105a6565b1980831691505092915050565b60006105dd83836105b3565b9150826002028217905092915050565b6105f68261039d565b67ffffffffffffffff81111561060f5761060e6103a8565b5b6106198254610406565b610624828285610560565b600060209050601f8311600181146106575760008415610645578287015190505b61064f85826105d1565b8655506106b7565b601f19841661066586610437565b60005b8281101561068d57848901518255600182019150602085019450602081019050610668565b868310156106aa57848901516106a6601f8916826105b3565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008160011c9050919050565b6000808291508390505b600185111561074557808604811115610721576107206106bf565b5b60018516156107305780820291505b808102905061073e856106ee565b9450610705565b94509492505050565b60008261075e576001905061081a565b8161076c576000905061081a565b8160018114610782576002811461078c576107bb565b600191505061081a565b60ff84111561079e5761079d6106bf565b5b8360020a9150848211156107b5576107b46106bf565b5b5061081a565b5060208310610133831016604e8410600b84101617156107f05782820a9050838111156107eb576107ea6106bf565b5b61081a565b6107fd84848460016106fb565b92509050818404811115610814576108136106bf565b5b81810290505b9392505050565b600060ff82169050919050565b6000610839826104bb565b915061084483610821565b92506108717fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461074e565b905092915050565b6000610884826104bb565b915061088f836104bb565b925082820261089d816104bb565b915082820484148315176108b4576108b36106bf565b5b5092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006108e6826108bb565b9050919050565b6108f6816108db565b82525050565b600060208201905061091160008301846108ed565b92915050565b6000610922826104bb565b915061092d836104bb565b9250828201905080821115610945576109446106bf565b5b92915050565b610954816104bb565b82525050565b600060608201905061096f60008301866108ed565b61097c602083018561094b565b610989604083018461094b565b949350505050565b60006020820190506109a6600083018461094b565b92915050565b6111e4806109bb6000396000f3fe608060405234801561001057600080fd5b50600436106100cf5760003560e01c80636c843e931161008c57806395d89b411161006657806395d89b4114610214578063a9059cbb14610232578063dd62ed3e14610262578063de29278914610292576100cf565b80636c843e93146101aa57806370a08231146101c8578063783b1872146101f8576100cf565b806306fdde03146100d4578063095ea7b3146100f257806318160ddd1461012257806323b872dd146101405780632920982714610170578063313ce5671461018c575b600080fd5b6100dc6102b0565b6040516100e99190610c4c565b60405180910390f35b61010c60048036038101906101079190610d0c565b610342565b6040516101199190610d67565b60405180910390f35b61012a610365565b6040516101379190610d91565b60405180910390f35b61015a60048036038101906101559190610dac565b61036f565b6040516101679190610d67565b60405180910390f35b61018a60048036038101906101859190610e64565b61039e565b005b6101946103bd565b6040516101a19190610ee0565b60405180910390f35b6101b26103c6565b6040516101bf9190610f0a565b60405180910390f35b6101e260048036038101906101dd9190610f25565b61041b565b6040516101ef9190610d91565b60405180910390f35b610212600480360381019061020d9190610e64565b610463565b005b61021c6104d7565b6040516102299190610c4c565b60405180910390f35b61024c60048036038101906102479190610d0c565b610569565b6040516102599190610d67565b60405180910390f35b61027c60048036038101906102779190610f52565b61058c565b6040516102899190610d91565b60405180910390f35b61029a610613565b6040516102a79190610d91565b60405180910390f35b6060600380546102bf90610fc1565b80601f01602080910402602001604051908101604052809291908181526020018280546102eb90610fc1565b80156103385780601f1061030d57610100808354040283529160200191610338565b820191906000526020600020905b81548152906001019060200180831161031b57829003601f168201915b5050505050905090565b60008061034d61061d565b905061035a818585610625565b600191505092915050565b6000600254905090565b60008061037a61061d565b9050610387858285610637565b6103928585856106cc565b60019150509392505050565b6001600560008282546103b19190611021565b92505081905550505050565b60006012905090565b6000600660008154809291906103db90611055565b9190505550600042336006546040516020016103f993929190611106565b6040516020818303038152906040528051906020012090508060001c91505090565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60005a90506000806104736103c6565b90506001600560008282546104889190611021565b925050819055505b858210156104cf576104a3816001610569565b505a836104b09190611143565b9150600560008154809291906104c590611055565b9190505550610490565b505050505050565b6060600480546104e690610fc1565b80601f016020809104026020016040519081016040528092919081815260200182805461051290610fc1565b801561055f5780601f106105345761010080835404028352916020019161055f565b820191906000526020600020905b81548152906001019060200180831161054257829003601f168201915b5050505050905090565b60008061057461061d565b90506105818185856106cc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b6000600554905090565b600033905090565b61063283838360016107c0565b505050565b6000610643848461058c565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8110156106c657818110156106b6578281836040517ffb8f41b20000000000000000000000000000000000000000000000000000000081526004016106ad93929190611177565b60405180910390fd5b6106c5848484840360006107c0565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361073e5760006040517f96c6fd1e0000000000000000000000000000000000000000000000000000000081526004016107359190610f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036107b05760006040517fec442f050000000000000000000000000000000000000000000000000000000081526004016107a79190610f0a565b60405180910390fd5b6107bb838383610997565b505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036108325760006040517fe602df050000000000000000000000000000000000000000000000000000000081526004016108299190610f0a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036108a45760006040517f94280d6200000000000000000000000000000000000000000000000000000000815260040161089b9190610f0a565b60405180910390fd5b81600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508015610991578273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040516109889190610d91565b60405180910390a35b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036109e95780600260008282546109dd9190611021565b92505081905550610abc565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015610a75578381836040517fe450d38c000000000000000000000000000000000000000000000000000000008152600401610a6c93929190611177565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610b055780600260008282540392505081905550610b52565b806000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055505b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610baf9190610d91565b60405180910390a3505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610bf6578082015181840152602081019050610bdb565b60008484015250505050565b6000601f19601f8301169050919050565b6000610c1e82610bbc565b610c288185610bc7565b9350610c38818560208601610bd8565b610c4181610c02565b840191505092915050565b60006020820190508181036000830152610c668184610c13565b905092915050565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610ca382610c78565b9050919050565b610cb381610c98565b8114610cbe57600080fd5b50565b600081359050610cd081610caa565b92915050565b6000819050919050565b610ce981610cd6565b8114610cf457600080fd5b50565b600081359050610d0681610ce0565b92915050565b60008060408385031215610d2357610d22610c6e565b5b6000610d3185828601610cc1565b9250506020610d4285828601610cf7565b9150509250929050565b60008115159050919050565b610d6181610d4c565b82525050565b6000602082019050610d7c6000830184610d58565b92915050565b610d8b81610cd6565b82525050565b6000602082019050610da66000830184610d82565b92915050565b600080600060608486031215610dc557610dc4610c6e565b5b6000610dd386828701610cc1565b9350506020610de486828701610cc1565b9250506040610df586828701610cf7565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f840112610e2457610e23610dff565b5b8235905067ffffffffffffffff811115610e4157610e40610e04565b5b602083019150836001820283011115610e5d57610e5c610e09565b5b9250929050565b600080600060408486031215610e7d57610e7c610c6e565b5b6000610e8b86828701610cf7565b935050602084013567ffffffffffffffff811115610eac57610eab610c73565b5b610eb886828701610e0e565b92509250509250925092565b600060ff82169050919050565b610eda81610ec4565b82525050565b6000602082019050610ef56000830184610ed1565b92915050565b610f0481610c98565b82525050565b6000602082019050610f1f6000830184610efb565b92915050565b600060208284031215610f3b57610f3a610c6e565b5b6000610f4984828501610cc1565b91505092915050565b60008060408385031215610f6957610f68610c6e565b5b6000610f7785828601610cc1565b9250506020610f8885828601610cc1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610fd957607f821691505b602082108103610fec57610feb610f92565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061102c82610cd6565b915061103783610cd6565b925082820190508082111561104f5761104e610ff2565b5b92915050565b600061106082610cd6565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361109257611091610ff2565b5b600182019050919050565b6000819050919050565b6110b86110b382610cd6565b61109d565b82525050565b60008160601b9050919050565b60006110d6826110be565b9050919050565b60006110e8826110cb565b9050919050565b6111006110fb82610c98565b6110dd565b82525050565b600061111282866110a7565b60208201915061112282856110ef565b60148201915061113282846110a7565b602082019150819050949350505050565b600061114e82610cd6565b915061115983610cd6565b925082820390508181111561117157611170610ff2565b5b92915050565b600060608201905061118c6000830186610efb565b6111996020830185610d82565b6111a66040830184610d82565b94935050505056fea2646970667358221220f63e213712b990b27c3ea345d4f42a556fb0f93435ab9d56400350f219450a8464736f6c634300081c0033 \ No newline at end of file diff --git a/configs/contracts/precompiles.hex b/configs/contracts/precompiles.hex deleted file mode 100644 index 63b31e9..0000000 --- a/configs/contracts/precompiles.hex +++ /dev/null @@ -1 +0,0 @@ -0x6080604052348015600f57600080fd5b506001600081905550611575806100276000396000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80636bb5fb1e1161005b5780636bb5fb1e146100fd5780636d92aec414610119578063b846f97014610135578063de2927891461015157610088565b8063029675e51461008d57806319845f8a146100a957806329209827146100c55780635d19d817146100e1575b600080fd5b6100a760048036038101906100a29190610d17565b61016f565b005b6100c360048036038101906100be9190610d17565b61054c565b005b6100df60048036038101906100da9190610d17565b610579565b005b6100fb60048036038101906100f69190610d17565b6105bc565b005b61011760048036038101906101129190610d17565b610730565b005b610133600480360381019061012e9190610d17565b610a6e565b005b61014f600480360381019061014a9190610d17565b610bd9565b005b610159610c03565b6040516101669190610d86565b60405180910390f35b60005a9050600061017e610c0c565b7f48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa560001b816000600281106101b6576101b5610da1565b5b6020020181815250507fd182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b60001b816001600281106101f7576101f6610da1565b5b602002018181525050610208610c2e565b7f616263000000000000000000000000000000000000000000000000000000000060001b816000600481106102405761023f610da1565b5b6020020181815250506000801b8160016004811061026157610260610da1565b5b6020020181815250506000801b8160026004811061028257610281610da1565b5b6020020181815250506000801b816003600481106102a3576102a2610da1565b5b6020020181815250506102b4610c50565b67030000000000000060c01b816000600281106102d4576102d3610da1565b5b602002019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff191681525050600060c01b8160016002811061032e5761032d610da1565b5b602002019077ffffffffffffffffffffffffffffffffffffffffffffffff1916908177ffffffffffffffffffffffffffffffffffffffffffffffff1916815250506000600190505b8885101561054157600060648661038d9190610e2e565b90506000600973ffffffffffffffffffffffffffffffffffffffff1682876000600281106103be576103bd610da1565b5b6020020151886001600281106103d7576103d6610da1565b5b6020020151886000600481106103f0576103ef610da1565b5b60200201518960016004811061040957610408610da1565b5b60200201518a60026004811061042257610421610da1565b5b60200201518b60036004811061043b5761043a610da1565b5b60200201518b60006002811061045457610453610da1565b5b60200201518c60016002811061046d5761046c610da1565b5b60200201518c60405160200161048c9a99989796959493929190610f71565b6040516020818303038152906040526040516104a89190611096565b600060405180830381855afa9150503d80600081146104e3576040519150601f19603f3d011682016040523d82523d6000602084013e6104e8565b606091505b505090508061052c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105239061110a565b60405180910390fd5b5a88610538919061112a565b96505050610376565b505050505050505050565b60005a905060005b84811015610572578081555a8261056b919061112a565b9050610554565b5050505050565b60005a905060005b848110156105b557600160008082825461059b919061115e565b925050819055505a826105ae919061112a565b9050610581565b5050505050565b60005a90506000807f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd3905060007f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490506000600190506000600290505b8885101561072557600080600673ffffffffffffffffffffffffffffffffffffffff16868686866040516020016106539493929190611192565b60405160208183030381529060405260405161066f9190611096565b600060405180830381855afa9150503d80600081146106aa576040519150601f19603f3d011682016040523d82523d6000602084013e6106af565b606091505b5091509150816106f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106eb90611223565b60405180910390fd5b808060200190518101906107089190611258565b80945081955050505a8861071c919061112a565b96505050610619565b505050505050505050565b60005a90506000806040518060c001604052807f2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da81526020017f2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f681526020017f1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc81526020017f22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d981526020017f2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f9081526020017f2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e81525090505b85821015610a6657600080600873ffffffffffffffffffffffffffffffffffffffff168360405160200161085c9190611343565b6040516020818303038152906040526040516108789190611096565b600060405180830381855afa9150503d80600081146108b3576040519150601f19603f3d011682016040523d82523d6000602084013e6108b8565b606091505b5091509150816108fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f4906113aa565b60405180910390fd5b600673ffffffffffffffffffffffffffffffffffffffff168360006006811061092957610928610da1565b5b60200201518460016006811061094257610941610da1565b5b60200201516001600260405160200161095e9493929190611457565b60405160208183030381529060405260405161097a9190611096565b600060405180830381855afa9150503d80600081146109b5576040519150601f19603f3d011682016040523d82523d6000602084013e6109ba565b606091505b50809250819350505081610a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109fa90611223565b60405180910390fd5b80806020019051810190610a179190611258565b84600060068110610a2b57610a2a610da1565b5b6020020185600160068110610a4357610a42610da1565b5b60200201828152508281525050505a85610a5d919061112a565b93505050610828565b505050505050565b60005a90506000807f030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd3905060007f15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c490506000600290505b87841015610bcf57600080600773ffffffffffffffffffffffffffffffffffffffff16858585604051602001610afd9392919061149c565b604051602081830303815290604052604051610b199190611096565b600060405180830381855afa9150503d8060008114610b54576040519150601f19603f3d011682016040523d82523d6000602084013e610b59565b606091505b509150915081610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b959061151f565b60405180910390fd5b80806020019051810190610bb29190611258565b80955081965050505a87610bc6919061112a565b95505050610ac5565b5050505050505050565b60005a905060005b84811015610bfc575a82610bf5919061112a565b9050610be1565b5050505050565b60008054905090565b6040518060400160405280600290602082028036833780820191505090505090565b6040518060800160405280600490602082028036833780820191505090505090565b6040518060400160405280600290602082028036833780820191505090505090565b600080fd5b600080fd5b6000819050919050565b610c8f81610c7c565b8114610c9a57600080fd5b50565b600081359050610cac81610c86565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112610cd757610cd6610cb2565b5b8235905067ffffffffffffffff811115610cf457610cf3610cb7565b5b602083019150836001820283011115610d1057610d0f610cbc565b5b9250929050565b600080600060408486031215610d3057610d2f610c72565b5b6000610d3e86828701610c9d565b935050602084013567ffffffffffffffff811115610d5f57610d5e610c77565b5b610d6b86828701610cc1565b92509250509250925092565b610d8081610c7c565b82525050565b6000602082019050610d9b6000830184610d77565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610e3982610c7c565b9150610e4483610c7c565b925082610e5457610e53610dd0565b5b828204905092915050565b600063ffffffff82169050919050565b60008160e01b9050919050565b6000610e8782610e6f565b9050919050565b610e9f610e9a82610e5f565b610e7c565b82525050565b6000819050919050565b6000819050919050565b610eca610ec582610ea5565b610eaf565b82525050565b60007fffffffffffffffff00000000000000000000000000000000000000000000000082169050919050565b6000819050919050565b610f17610f1282610ed0565b610efc565b82525050565b60008115159050919050565b60008160f81b9050919050565b6000610f4182610f29565b9050919050565b6000610f5382610f36565b9050919050565b610f6b610f6682610f1d565b610f48565b82525050565b6000610f7d828d610e8e565b600482019150610f8d828c610eb9565b602082019150610f9d828b610eb9565b602082019150610fad828a610eb9565b602082019150610fbd8289610eb9565b602082019150610fcd8288610eb9565b602082019150610fdd8287610eb9565b602082019150610fed8286610f06565b600882019150610ffd8285610f06565b60088201915061100d8284610f5a565b6001820191508190509b9a5050505050505050505050565b600081519050919050565b600081905092915050565b60005b8381101561105957808201518184015260208101905061103e565b60008484015250505050565b600061107082611025565b61107a8185611030565b935061108a81856020860161103b565b80840191505092915050565b60006110a28284611065565b915081905092915050565b600082825260208201905092915050565b7f426c616b653266206661696c6564000000000000000000000000000000000000600082015250565b60006110f4600e836110ad565b91506110ff826110be565b602082019050919050565b60006020820190508181036000830152611123816110e7565b9050919050565b600061113582610c7c565b915061114083610c7c565b925082820390508181111561115857611157610dff565b5b92915050565b600061116982610c7c565b915061117483610c7c565b925082820190508082111561118c5761118b610dff565b5b92915050565b60006080820190506111a76000830187610d77565b6111b46020830186610d77565b6111c16040830185610d77565b6111ce6060830184610d77565b95945050505050565b7f4543416464206661696c65640000000000000000000000000000000000000000600082015250565b600061120d600c836110ad565b9150611218826111d7565b602082019050919050565b6000602082019050818103600083015261123c81611200565b9050919050565b60008151905061125281610c86565b92915050565b6000806040838503121561126f5761126e610c72565b5b600061127d85828601611243565b925050602061128e85828601611243565b9150509250929050565b600060069050919050565b600081905092915050565b6000819050919050565b6112c181610c7c565b82525050565b60006112d383836112b8565b60208301905092915050565b6000602082019050919050565b6112f581611298565b6112ff81846112a3565b925061130a826112ae565b8060005b8381101561133b57815161132287826112c7565b965061132d836112df565b92505060018101905061130e565b505050505050565b600060c08201905061135860008301846112ec565b92915050565b7f454350616972696e67206661696c656400000000000000000000000000000000600082015250565b60006113946010836110ad565b915061139f8261135e565b602082019050919050565b600060208201905081810360008301526113c381611387565b9050919050565b6000819050919050565b600060ff82169050919050565b6000819050919050565b60006114066114016113fc846113ca565b6113e1565b6113d4565b9050919050565b611416816113eb565b82525050565b6000819050919050565b600061144161143c6114378461141c565b6113e1565b6113d4565b9050919050565b61145181611426565b82525050565b600060808201905061146c6000830187610d77565b6114796020830186610d77565b611486604083018561140d565b6114936060830184611448565b95945050505050565b60006060820190506114b16000830186610d77565b6114be6020830185610d77565b6114cb6040830184610d77565b949350505050565b7f45434d756c206661696c65640000000000000000000000000000000000000000600082015250565b6000611509600c836110ad565b9150611514826114d3565b602082019050919050565b60006020820190508181036000830152611538816114fc565b905091905056fea2646970667358221220cc0a93ed1e5fa832aa1c9eaebdcc0ccf445dc4325a980994902b70a8aac68e7364736f6c634300081c0033 \ No newline at end of file diff --git a/configs/ecadd.yml b/configs/ecadd.yml index 37d7431..c2f9797 100644 --- a/configs/ecadd.yml +++ b/configs/ecadd.yml @@ -5,7 +5,7 @@ variables: - type: transaction_workload values: - - contract:1:ecadd(uint256,bytes):1000000000:0x:./contracts/precompiles.hex + - contract:1:ecadd(uint256,bytes):1000000000:0x:Precompile - type: node_type values: - geth diff --git a/configs/ecmul.yml b/configs/ecmul.yml index 0223deb..1fc6a7f 100644 --- a/configs/ecmul.yml +++ b/configs/ecmul.yml @@ -5,7 +5,7 @@ variables: - type: transaction_workload values: - - contract:1:ecmul(uint256,bytes):1000000000:0x:./contracts/precompiles.hex + - contract:1:ecmul(uint256,bytes):1000000000:0x:Precompile - type: node_type values: - geth diff --git a/configs/ecpairing.yml b/configs/ecpairing.yml index fd47cad..cff57c5 100644 --- a/configs/ecpairing.yml +++ b/configs/ecpairing.yml @@ -5,8 +5,8 @@ variables: - type: transaction_workload values: - - contract:1:ecpairing(uint256,bytes):600000000:0x:./contracts/precompiles.hex - - contract:1:ecpairing(uint256,bytes):700000000:0x:./contracts/precompiles.hex + - contract:1:ecpairing(uint256,bytes):600000000:0x:Precompile + - contract:1:ecpairing(uint256,bytes):700000000:0x:Precompile - type: node_type values: - geth diff --git a/configs/erc20.yml b/configs/erc20.yml index 981a3ca..34c1df0 100644 --- a/configs/erc20.yml +++ b/configs/erc20.yml @@ -5,8 +5,8 @@ variables: - type: transaction_workload values: - - contract:1:moveErc20(uint256,bytes):700000000:0x:./contracts/erc20.hex - - contract:1:moveErc20(uint256,bytes):1000000000:0x:./contracts/erc20.hex + - contract:1:moveErc20(uint256,bytes):700000000:0x:ERC20Transfer + - contract:1:moveErc20(uint256,bytes):1000000000:0x:ERC20Transfer - type: node_type values: - geth diff --git a/configs/public-benchmark.yml b/configs/public-benchmark.yml index 951b82d..5278363 100644 --- a/configs/public-benchmark.yml +++ b/configs/public-benchmark.yml @@ -31,8 +31,8 @@ value: 505000000 - type: transaction_workload values: - - contract:1:ecpairing(uint256,bytes):200000000:0x:./contracts/precompiles.hex - - contract:1:ecpairing(uint256,bytes):400000000:0x:./contracts/precompiles.hex + - contract:1:ecpairing(uint256,bytes):200000000:0x:Precompile + - contract:1:ecpairing(uint256,bytes):400000000:0x:Precompile - name: EC Mul Precompile description: https://github.com/base/fp-test-cases/blob/main/src/Precompiler.sol benchmark: @@ -40,7 +40,7 @@ variables: - type: transaction_workload values: - - contract:1:ecmul(uint256,bytes):1000000000:0x:./contracts/precompiles.hex + - contract:1:ecmul(uint256,bytes):1000000000:0x:Precompile - type: node_type values: - geth @@ -56,7 +56,7 @@ variables: - type: transaction_workload values: - - contract:1:writer(uint256,bytes):1000000000:0x:./contracts/precompiles.hex + - contract:1:writer(uint256,bytes):1000000000:0x:Precompile - type: node_type values: - geth diff --git a/configs/sload.yml b/configs/sload.yml index e860095..15c4bef 100644 --- a/configs/sload.yml +++ b/configs/sload.yml @@ -5,7 +5,7 @@ variables: - type: transaction_workload values: - - contract:1:reader(uint256,bytes):1000000000:0x:./contracts/precompiles.hex + - contract:1:reader(uint256,bytes):1000000000:0x:Precompile - type: node_type values: - geth diff --git a/configs/sstore.yml b/configs/sstore.yml index dcf962c..cd97d83 100644 --- a/configs/sstore.yml +++ b/configs/sstore.yml @@ -5,7 +5,7 @@ variables: - type: transaction_workload values: - - contract:1:writer(uint256,bytes):1000000000:0x:./contracts/precompiles.hex + - contract:1:writer(uint256,bytes):1000000000:0x:Precompile - type: node_type values: - geth diff --git a/contracts/lib/forge-std b/contracts/lib/forge-std new file mode 160000 index 0000000..77041d2 --- /dev/null +++ b/contracts/lib/forge-std @@ -0,0 +1 @@ +Subproject commit 77041d2ce690e692d6e03cc812b57d1ddaa4d505 diff --git a/contracts/lib/openzeppelin b/contracts/lib/openzeppelin new file mode 160000 index 0000000..e342516 --- /dev/null +++ b/contracts/lib/openzeppelin @@ -0,0 +1 @@ +Subproject commit e34251682bac9c3252af30e91e999f13dd098b9f diff --git a/contracts/src/ERC20Transfer.sol b/contracts/src/ERC20Transfer.sol new file mode 100644 index 0000000..408425e --- /dev/null +++ b/contracts/src/ERC20Transfer.sol @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +pragma solidity ^0.8.13; + +import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; + +contract ERC20Transfer is ERC20 { + uint256 counter; + uint256 private nonce = 0; + + constructor() ERC20("Token", "TKN") { + _mint(msg.sender, 10000000 * 10 ** decimals()); + counter = 5; + } + + function generateRandomAddress() public returns (address) { + nonce++; + + bytes32 hash = keccak256( + abi.encodePacked(block.timestamp, msg.sender, nonce) + ); + + return address(uint160(uint256(hash))); + } + + function increaseCounter(uint256 gas_target, bytes calldata input2) public { + counter += 1; + } + + function moveErc20(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + + address to = generateRandomAddress(); + counter += 1; + while (gas_used < gas_target) { + transfer(to, 1 wei); + gas_used = start_gas - gasleft(); + counter++; + } + } + + function getResult() public view returns (uint256) { + return counter; + } +} \ No newline at end of file diff --git a/contracts/src/Precompile.sol b/contracts/src/Precompile.sol new file mode 100644 index 0000000..88c5600 --- /dev/null +++ b/contracts/src/Precompile.sol @@ -0,0 +1,134 @@ +pragma solidity ^0.8.13; + +contract Precompile { + uint256 counter; + + constructor() { + counter = 1; + } + + function writer(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + + while (gas_used < gas_target) { + assembly { + sstore(gas_used, gas_used) + } + gas_used = start_gas - gasleft(); + } + } + + function reader(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + + while (gas_used < gas_target) { + assembly { + let junk := sload(gas_used) + } + gas_used = start_gas - gasleft(); + } + } + + function ecadd(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + + uint256 x1 = 0x030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd3; + uint256 y1 = 0x15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4; + uint256 x2 = 1; + uint256 y2 = 2; + + while (gas_used < gas_target) { + (bool ok, bytes memory result) = address(6).staticcall(abi.encode(x1, y1, x2, y2)); + require(ok, "ECAdd failed"); + (x2, y2) = abi.decode(result, (uint256, uint256)); + gas_used = start_gas - gasleft(); + } + } + + function increaseCounter(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + while (gas_used < gas_target) { + counter += 1; + gas_used = start_gas - gasleft(); + } + } + + function ecmul(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + + uint256 x1 = 0x030644e72e131a029b85045b68181585d97816a916871ca8d3c208c16d87cfd3; + uint256 y1 = 0x15ed738c0e0a7c92e7845f96b2ae9c0a68a6a449e3538fc7ff3ebf7a5a18a2c4; + uint256 scalar = 2; + + while (gas_used < gas_target) { + (bool ok, bytes memory result) = address(7).staticcall(abi.encode(x1, y1, scalar)); + require(ok, "ECMul failed"); + (x1, y1) = abi.decode(result, (uint256, uint256)); + gas_used = start_gas - gasleft(); + } + } + + function ecpairing(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + + uint256[6] memory input = [ + 0x2cf44499d5d27bb186308b7af7af02ac5bc9eeb6a3d147c186b21fb1b76e18da, + 0x2c0f001f52110ccfe69108924926e45f0b0c868df0e7bde1fe16d3242dc715f6, + 0x1fb19bb476f6b9e44e2a32234da8212f61cd63919354bc06aef31e3cfaff3ebc, + 0x22606845ff186793914e03e21df544c34ffe2f2f3504de8a79d9159eca2d98d9, + 0x2bd368e28381e8eccb5fa81fc26cf3f048eea9abfdd85d7ed3ab3698d63e4f90, + 0x2fe02e47887507adf0ff1743cbac6ba291e66f59be6bd763950bb16041a0a85e + ]; + while (gas_used < gas_target) { + (bool ok, bytes memory result) = address(8).staticcall(abi.encode(input)); + require(ok, "ECPairing failed"); + // Use ECAdd to create new points + (ok, result) = address(6).staticcall(abi.encode(input[0], input[1], 1, 2)); + require(ok, "ECAdd failed"); + (input[0], input[1]) = abi.decode(result, (uint256, uint256)); + gas_used = start_gas - gasleft(); + } + } + + function run_blake2f(uint256 gas_target, bytes calldata input2) public { + uint256 start_gas = gasleft(); + uint256 gas_used = 0; + + // Blake2f + bytes32[2] memory h; + h[0] = 0x48c9bdf267e6096a3ba7ca8485ae67bb2bf894fe72f36e3cf1361d5f3af54fa5; + h[1] = 0xd182e6ad7f520e511f6c3e2b8c68059b6bbd41fbabd9831f79217e1319cde05b; + + bytes32[4] memory m; + m[0] = 0x6162630000000000000000000000000000000000000000000000000000000000; + m[1] = 0x0000000000000000000000000000000000000000000000000000000000000000; + m[2] = 0x0000000000000000000000000000000000000000000000000000000000000000; + m[3] = 0x0000000000000000000000000000000000000000000000000000000000000000; + + bytes8[2] memory t; + t[0] = 0x0300000000000000; + t[1] = 0x0000000000000000; + + bool f = true; + + while (gas_used < gas_target) { + uint32 rounds = uint32(gas_used / 100); + + (bool ok,) = + address(9).staticcall(abi.encodePacked(rounds, h[0], h[1], m[0], m[1], m[2], m[3], t[0], t[1], f)); + require(ok, "Blake2f failed"); + gas_used = start_gas - gasleft(); + } + } + + + function getResult() public view returns (uint256) { + return counter; + } +} \ No newline at end of file diff --git a/foundry.toml b/foundry.toml new file mode 100644 index 0000000..f7d9983 --- /dev/null +++ b/foundry.toml @@ -0,0 +1,10 @@ +[profile.default] +src = "contracts/src" +test = "contracts/test" +out = "contracts/out" +script = "contracts/script" +cache_path = "contracts/cache" +cache = true +libs = ["contracts/lib"] + +# See more config options https://github.com/foundry-rs/foundry/blob/master/crates/config/README.md#all-options diff --git a/runner/network/network_benchmark.go b/runner/network/network_benchmark.go index 3b6fbce..4d43e94 100644 --- a/runner/network/network_benchmark.go +++ b/runner/network/network_benchmark.go @@ -220,7 +220,7 @@ func (nb *NetworkBenchmark) benchmarkSequencer(ctx context.Context) ([]engine.Ex ctx, nb.log, sequencerClient.ClientURL(), nb.params, privateKey, amount, nb.genesis) case strings.HasPrefix(string(payloadType), "contract"): var config payload.ContractPayloadWorkerConfig - config, err = payload.ValidateContractPayload(payloadType, nb.config.ConfigPath()) + config, err = payload.ValidateContractPayload(payloadType) if err != nil { return nil, 0, err } diff --git a/runner/payload/contract_worker.go b/runner/payload/contract_worker.go index d9d1912..298627e 100644 --- a/runner/payload/contract_worker.go +++ b/runner/payload/contract_worker.go @@ -3,6 +3,7 @@ package payload import ( "context" "crypto/ecdsa" + "encoding/json" "fmt" "math/big" "os" @@ -33,7 +34,15 @@ type ContractPayloadWorkerConfig struct { CallsPerBlock int } -func ValidateContractPayload(payloadType benchmark.TransactionPayload, configDir string) (ContractPayloadWorkerConfig, error) { +type Bytecode struct { + Object string `json:"object"` +} + +type Contract struct { + Bytecode Bytecode `json:"bytecode"` +} + +func ValidateContractPayload(payloadType benchmark.TransactionPayload) (ContractPayloadWorkerConfig, error) { selectors := strings.Split(string(payloadType), ":") if len(selectors) != 6 { @@ -53,15 +62,19 @@ func ValidateContractPayload(payloadType benchmark.TransactionPayload, configDir bytecodeFile := selectors[5] - dir := filepath.Dir(configDir) - - bytecodePath := filepath.Join(dir, bytecodeFile) - log.Info("loading bytecode from", "path", bytecodePath) - - bytecodeHex, err := os.ReadFile(bytecodePath) + bytecodePath := filepath.Join("contracts/out/" + bytecodeFile + ".sol/" + bytecodeFile + ".json") + data, err := os.ReadFile(bytecodePath) if err != nil { return ContractPayloadWorkerConfig{}, errors.New("failed to read bytecode file") } + + var c Contract + if err := json.Unmarshal(data, &c); err != nil { + return ContractPayloadWorkerConfig{}, errors.New("failed to unmarshal bytecode file") + } + + bytecodeHex := c.Bytecode.Object + bytecode := common.FromHex(string(bytecodeHex)) config := ContractPayloadWorkerConfig{