From 139f8bc4316f68e13b7e3abdabe392f0c166eee2 Mon Sep 17 00:00:00 2001 From: Diego K <43053772+diegokingston@users.noreply.github.com> Date: Sat, 28 Sep 2024 18:26:22 -0300 Subject: [PATCH 1/6] Improve docs (#1111) Co-authored-by: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> --- README.md | 188 +------------------ docs/1_introduction/0_about_aligned.md | 4 + docs/1_introduction/4_faq.md | 21 +++ docs/2_architecture/0_supported_verifiers.md | 8 +- docs/3_guides/6_setup_aligned.md | 14 +- 5 files changed, 37 insertions(+), 198 deletions(-) diff --git a/README.md b/README.md index f09837125..2191e59f8 100644 --- a/README.md +++ b/README.md @@ -3,190 +3,4 @@ > [!CAUTION] > To be used in testnet only. -## Table of Contents - -- [Aligned](#aligned) - - [Table of Contents](#table-of-contents) - - [The Project](#the-project) - - [How to use the testnet](#how-to-use-the-testnet) - - [Operator Guide](#operator-guide) - - [Aligned Infrastructure Guide](#aligned-infrastructure-guide) - - [Submitting Proofs to Aligned](#submitting-proofs-to-aligned) - - [Integrating Aligned into your Project](#integrating-aligned-into-your-project) - - [Versioning and Networks](#versioning-and-networks) - - -## The Project - -Aligned is a decentralized network of nodes that verifies Zero-Knowledge and Validity proofs, and post the results in Ethereum. - -These proofs can be generated and used for a tenth of the price, and with extremely low latency, allowing novel types of applications that weren't possible before in Ethereum. - -## How to use the testnet - -1. Download and install Aligned to send proofs in the testnet: - -```bash -curl -L https://raw.githubusercontent.com/yetanotherco/aligned_layer/main/batcher/aligned/install_aligned.sh | bash -``` - -2. Then run the ```source``` command that should appear in the shell. - - -3. Download an example SP1 proof file with it's ELF file using: - -```bash -curl -L https://raw.githubusercontent.com/yetanotherco/aligned_layer/main/batcher/aligned/get_proof_test_files.sh | bash -``` - -We are downloading a proof previously generated, sending it to Aligned, and retrieving the results from Ethereum Holesky testnet. Aligned is using EigenLayer to do a fast and cheap verification of more than one thousand proofs per second. - -4. Let's send the proof to be verified in Aligned: - -```bash -rm -rf ~/.aligned/aligned_verification_data/ && -aligned submit \ ---proving_system SP1 \ ---proof ~/.aligned/test_files/sp1_fibonacci.proof \ ---vm_program ~/.aligned/test_files/sp1_fibonacci.elf \ ---aligned_verification_data_path ~/.aligned/aligned_verification_data \ ---batcher_url wss://batcher.alignedlayer.com \ ---rpc_url https://ethereum-holesky-rpc.publicnode.com \ ---payment_service_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 -``` - -5. You should get a response like this: - -```bash -[2024-07-01T19:17:54Z WARN aligned] Missing keystore used for payment. This proof will not be included if sent to Eth Mainnet -[2024-07-01T19:17:54Z INFO aligned] Submitting proofs to the Aligned batcher... -[2024-07-01T19:19:18Z INFO aligned] Batch inclusion data written into ./aligned_verification_data/e367d76e_0.json -[2024-07-01T19:19:18Z INFO aligned] Proofs submitted to aligned. See the batch in the explorer: -[2024-07-01T19:19:18Z INFO aligned] https://explorer.alignedlayer.com/batches/0xe367d76e832edec893d3a9027b3c231b2e3994c47acfac2e67197c13c9be0c4c -``` - -You can use the link to the explorer to check the status of your transaction. - -6. After three Ethereum blocks, you can check if it has been verified with: - -```bash -aligned verify-proof-onchain \ ---aligned-verification-data ~/.aligned/aligned_verification_data/*.json \ ---rpc_url https://ethereum-holesky-rpc.publicnode.com \ ---chain holesky \ ---payment_service_addr 0x815aeCA64a974297942D2Bbf034ABEe22a38A003 -``` - -This is reading the result of the verification of the proof in Ethereum. - -7. You should get this result: - -```bash -[2024-06-17T21:58:43Z INFO aligned] Your proof was verified in Aligned and included in the batch! -``` - -If the proof wasn't verified you should get this result: - -```bash -[2024-06-17T21:59:09Z INFO aligned] Your proof was not included in the batch. -``` - -Aligned works in: -- MacOS Arm64 (M1 or higher) -- Linux x86 with GLIBC_2.32 or superior (For example, Ubuntu 22.04 or higher) - If you don't meet these requirements, clone the repository, install rust, and then run: - -```bash -make uninstall_aligned -make install_aligned_compiling -``` - -### Reading the results of proof verification in Ethereum - - -#### Using CURL and an Ethereum RPC -In step 6 of the previous section, we used the `aligned verify-proof-onchain` to check that our proof was verified in Aligned. - -Internally, this is making a call to our Aligned contract, verifying commitments are right, and that the proof is included in the batch. - -That command is doing the same as the following `curl` to an Ethereum node. - -```bash -curl -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_call","id":1, "params":[{"to": "0x58F280BeBE9B34c9939C3C39e0890C81f163B623", "data": ""}]}' \ - -X POST https://ethereum-holesky-rpc.publicnode.com -``` - -This will return 0x1 if the proof and it's associated data is correct and verified in Aligned, and 0x0 if not. - -For example, this a correct calldata for a verified proof: - -```bash -curl -H "Content-Type: application/json" \ - --data '{"jsonrpc":"2.0","method":"eth_call","id":1,"params":[{"to": "0x58F280BeBE9B34c9939C3C39e0890C81f163B623", "data": "0xfa534dc0c181e470901eecf693bfa6f0e89e837dcf35700cdd91c210a0ce0660e86742080000000000000000000000000000000000000000000000000000000000000000836371a502bf5ad67be837b21fa99bc381f7e8124f02042ffb80fa7ce27bc8f6f39fd6e51aad88f6f4ce6ab8827279cfffb922660000000000000000000000007553cb14bff387c06e016cb3e7946e91d9fe44a54ad5d888ce8343ddb16116a700000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000007600000000000000000000000000000000000000000000000000000000000001007b2f4966c3ab3e59d213eda057734df28c323055a2a02f50bd286585cc80128c967250f2b9ad990485338fd2d49e83f47917983f5566da551d4c32e9063ea5641d94b04bac222e06ea18cbb617d0d52c7007cc8f8b30c435b8b8101bdff0ea8482436acf251652f00397f4cefa0bb8eea1c8addb6cf2ca843004b89d80c7e1e41344fd2387535fe4afcaafde27b04543d993bbbc7286154044913e5bd65b86d7cc4d47a90132a95d9ffecb913b414ba2d2f0b1d7b826eb5025a27bcadcc0d94cb125c9c9d556eac08dd6b0f5f55f68afe699f3c529442dbf1b47e968b3705ee2e1be4acb884d184a139a390cb94e9e5806686605dc0a025269bc3afd990c8302"}]}' \ - -X POST https://ethereum-holesky-rpc.publicnode.com -``` - -To generate the calldata yourself, follow these steps: - -1. Clone the repository and move into it. -2. Create a Python virtual environment and install the dependencies with: - -```bash -python3 -m venv .aligned_venv -source .aligned_venv/bin/activate -python3 -m pip install -r examples/verify/requirements.txt -``` - -3. Encode your proof verification data with: - -```bash -python3 examples/verify/encode_verification_data.py --aligned-verification-data ~/.aligned/aligned_verification_data/*.json -``` - -If your verification data is in another path, just change the `--aligned-verification-data` parameter. - -#### Using a caller contract - -To verify a proof in your own contract, use a static call to the Aligned contract. You can use the following [Caller Contract](examples/verify/src/VerifyBatchInclusionCaller.sol) as an example. The code will look like this: - -```solidity -(bool callWasSuccessfull, bytes memory proofIsIncluded) = targetContract.staticcall( - abi.encodeWithSignature( - "verifyBatchInclusion(bytes32,bytes32,bytes32,bytes20,bytes32,bytes,uint256)", - proofCommitment, - pubInputCommitment, - provingSystemAuxDataCommitment, - proofGeneratorAddr, - batchMerkleRoot, - merkleProof, - verificationDataBatchIndex - ) -); -require(callWasSuccessfull, "static_call failed"); -``` - -## Operator Guide - -If you want to run an operator, check our [Operator Guide](./docs/operator_guides/0_running_an_operator.md). - -## Aligned Infrastructure Guide - -If you are developing on Aligned, or want to run your own devnet, check our [setup Aligned guide](docs/3_guides/6_setup_aligned.md). - - -## Submitting Proofs to Aligned -For submitting proofs generated by your own project to the network via CLI, see the documentation on [submitting proofs to Aligned](docs/3_guides/0_submitting_proofs.md). - - -## Integrating Aligned into your Project - -If you are developing applications using Aligned, we offer a [Rust-SDK](docs/3_guides/1_SDK_how_to.md) for submitting proofs directly to the network within your applications. - -## Versioning and Networks - -Testnet code and documentation is always in sync with the default [Testnet Branch](https://github.com/yetanotherco/aligned_layer/tree/feat/testnet) - -Releases are provided for each version of the testnet. - -Latest version of the code, deployed on staging network, is always on [Staging Branch](https://github.com/yetanotherco/aligned_layer/tree/feat/staging) +To learn more about Aligned and how to use it, refer to the [docs page](https://docs.alignedlayer.com/) or [docs folder](./docs/). diff --git a/docs/1_introduction/0_about_aligned.md b/docs/1_introduction/0_about_aligned.md index 3538dc067..4a28c5957 100644 --- a/docs/1_introduction/0_about_aligned.md +++ b/docs/1_introduction/0_about_aligned.md @@ -91,3 +91,7 @@ Since Aligned’s operators only need to run the verification code on bare metal - Adding new proof systems is straightforward. Preliminary numbers show that Aligned can verify more than 1000 proofs per second, over two orders of magnitude than the EVM at nominal capacity. Using effective batching techniques, we can split the task creation and verification cost between thousands of proofs. + +## Future additions + +- Propagation of the results to different L2s diff --git a/docs/1_introduction/4_faq.md b/docs/1_introduction/4_faq.md index 57b019d35..920bb5926 100644 --- a/docs/1_introduction/4_faq.md +++ b/docs/1_introduction/4_faq.md @@ -6,6 +6,27 @@ Aligned’s mission is to extend Ethereum’s zero-knowledge capabilities. We ar The question we want to share is: If we are sure that zero-knowledge proofs are the future of Ethereum, but we don't know which of the many possible zero-knowledge futures will win, **then how do we build infrastructure for Ethereum to make it compatible with any future zero-knowledge proving system?** +### What are the security guarantees and trust assumptions of Aligned? + +Aligned verifies proofs by having the operators re-execute the verification code for each proof and, if all of the proofs are valid, each of them signs a message containing a commitment to the proof and public input or the root of the batch. The aggregator is responsible for receiving the signatures, checking the quorum, performing the aggregation and sending them to Ethereum. + +- 67% of the operators behaving dishonestly to be able to submit false proofs. +- 33% of the operators colluding to censor a batch of proofs or task. However, in the case of a batch, the operators can only censor the whole batch, but not a particular proof included in it. +- The aggregator can censor batches or proofs by not sending the aggregated signature. + +### What is the batcher? + +We have a service called the batcher that batches enough proofs to send to the AVS in Eigen Layer to reduce on-chain verification costs. Users can submit their proofs to Aligned directly without the batcher. The batcher is fully optional. The batcher is an optimization to reduce on-chain verification costs. + +### What are the security guarantees added by the batcher? + +A batcher can censor proofs. The user can run their own batcher to avoid censorship or can send a task to verify proofs in Aligned via Ethereum without using the batcher. +The batcher cannot transfer user's funds to other accounts, only spend them to create verification tasks and pay to the aggregator. We recommend to only deposit enough funds for a few months of operations. + +### How do I send proofs without a batcher? + +### How do I run my own batcher? + ### Why build Aligned on top of Ethereum? Ethereum is the most decentralized and most significant source of liquidity in the crypto ecosystem. We believe it is the most ambitious and long-term project on the internet. Aligned is being built to help Ethereum achieve its highest potential, and we believe this is only possible through validity/zero-knowledge proofs. diff --git a/docs/2_architecture/0_supported_verifiers.md b/docs/2_architecture/0_supported_verifiers.md index 44dd8841b..6ff9973d0 100644 --- a/docs/2_architecture/0_supported_verifiers.md +++ b/docs/2_architecture/0_supported_verifiers.md @@ -8,12 +8,12 @@ The following is the list of the verifiers currently supported by Aligned: - :white_check_mark: gnark - Plonk (with BN254 and BLS12-381) - :white_check_mark: SP1 [(v1.0.1)](https://github.com/succinctlabs/sp1/releases/tag/v1.0.1) - :white_check_mark: Risc0 [(v1.0.1)](https://github.com/risc0/risc0/releases/tag/v1.0.1) -- :white_check_mark: Halo2 - Plonk/KZG -- :white_check_mark: Halo2 - Plonk/IPA +- 🏗️ Circom +- 🏗️ Lambdaworks -The following are going to be added soon: + +The following are in the roadmap to be added: - :black_square_button: Kimchi - :black_square_button: Jolt - :black_square_button: Nexus -- :black_square_button: Circom diff --git a/docs/3_guides/6_setup_aligned.md b/docs/3_guides/6_setup_aligned.md index b9c64fd3b..259e6538f 100644 --- a/docs/3_guides/6_setup_aligned.md +++ b/docs/3_guides/6_setup_aligned.md @@ -415,25 +415,25 @@ make batcher_send_risc0_burst
Plonk -Send an individual bn254 proof: +Send an individual BN254 proof: ```bash make batcher_send_plonk_bn254_task ``` -Send a burst of 15 bn254 proofs: +Send a burst of 15 BN254 proofs: ```bash make batcher_send_plonk_bn254_burst ``` -Send an individual bl12 proof: +Send an individual BLS12-381 proof: ```bash make batcher_send_plonk_bls12_381_task ``` -Send a burst of 15 bl12 proofs: +Send a burst of 15 BLS12-381 proofs: ```bash make batcher_send_plonk_bls12_381_burst @@ -444,19 +444,19 @@ make batcher_send_plonk_bls12_381_burst
Groth16 -Send an individual bn254 proof: +Send an individual BN254 proof: ```bash make batcher_send_groth16_bn254_task ``` -Send bn254 proofs indefinitely: +Send BN254 proofs indefinitely: ```bash make batcher_send_infinite_groth16 ``` -Send bn254 proof bursts indefinitely: +Send BN254 proof bursts indefinitely: ```bash make batcher_send_burst_groth16 From d6c2e34ecce7b91afe6e148d9f216ffec41007b2 Mon Sep 17 00:00:00 2001 From: Mauro Toscano <12560266+MauroToscano@users.noreply.github.com> Date: Sat, 28 Sep 2024 18:27:56 -0300 Subject: [PATCH 2/6] Update 0_supported_verifiers.md --- docs/2_architecture/0_supported_verifiers.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/2_architecture/0_supported_verifiers.md b/docs/2_architecture/0_supported_verifiers.md index 6ff9973d0..ba401b4b7 100644 --- a/docs/2_architecture/0_supported_verifiers.md +++ b/docs/2_architecture/0_supported_verifiers.md @@ -10,10 +10,9 @@ The following is the list of the verifiers currently supported by Aligned: - :white_check_mark: Risc0 [(v1.0.1)](https://github.com/risc0/risc0/releases/tag/v1.0.1) - 🏗️ Circom - 🏗️ Lambdaworks - +- 🏗️ Kimchi The following are in the roadmap to be added: -- :black_square_button: Kimchi - :black_square_button: Jolt - :black_square_button: Nexus From cf84ee85240f9ca596f63eca73440659408107c9 Mon Sep 17 00:00:00 2001 From: Julian Arce <52429267+JuArce@users.noreply.github.com> Date: Mon, 30 Sep 2024 17:57:36 -0300 Subject: [PATCH 3/6] docs: add guide to run operator using systemd (#1078) --- docs/operator_guides/0_running_an_operator.md | 84 +++++++++++++++++-- docs/operator_guides/1_operator_FAQ.md | 14 +++- 2 files changed, 89 insertions(+), 9 deletions(-) diff --git a/docs/operator_guides/0_running_an_operator.md b/docs/operator_guides/0_running_an_operator.md index da90a7212..e3b9e0785 100644 --- a/docs/operator_guides/0_running_an_operator.md +++ b/docs/operator_guides/0_running_an_operator.md @@ -92,17 +92,27 @@ Update the following placeholders in `./config-files/config-operator.yaml`: `""` and `""` are the paths to your keys generated with the EigenLayer CLI, `""` and `""` can be found in the `operator.yaml` file created in the EigenLayer registration process. The keys are stored by default in the `~/.eigenlayer/operator_keys/` directory, so for example `` could be `/path/to/home/.eigenlayer/operator_keys/some_key.ecdsa.key.json` and for `` it could be `/path/to/home/.eigenlayer/operator_keys/some_key.bls.key.json`. -The default configuration uses the public nodes RPC, but we suggest you use your own nodes for better performance and reliability. -Also, from v0.5.2 there is a fallback mechanism to have two RPCs, so you can add a second RPC for redundancy. +Two RPCs are used, one as the main one, and the other one as a fallback in case one node is working unreliably. + +Default configurations is set up to use the same public node in both scenarios. + +{% hint style="danger" %} + +PUBLIC NODES SHOULDN'T BE USED AS THE MAIN RPC. We recommend not using public nodes at all. + +FALLBACK AND MAIN RPCs SHOULD BE DIFFERENT. + +{% endhint %} + +Most of the actions will pass through the main RPC unless there is a problem with it. Events are fetched from both nodes. ```yaml -eth_rpc_url: "https://ethereum-holesky-rpc.publicnode.com" -eth_rpc_url_fallback: "https://ethereum-holesky-rpc.publicnode.com" -eth_ws_url: "wss://ethereum-holesky-rpc.publicnode.com" -eth_ws_url_fallback: "wss://ethereum-holesky-rpc.publicnode.com" +eth_rpc_url: "https://" +eth_rpc_url_fallback: "https://" +eth_ws_url: "wss://" +eth_ws_url_fallback: "wss://" ``` - ## Step 4 - Deposit Strategy Tokens We are using [WETH](https://holesky.eigenlayer.xyz/restake/WETH) as the strategy token. @@ -152,6 +162,66 @@ If you don't have Holesky ETH, these are some useful faucets: ./operator/build/aligned-operator start --config ./config-files/config-operator.yaml ``` +### Run Operator using Systemd + +To manage the Operator process on Linux systems, we recommend use systemd with the following configuration: + +You should create a user and a group in order to run the Operator and set the service unit to use that. In the provided service unit, we assume you have already created a user called `aligned` + +```toml +# aligned-operator.service + +[Unit] +Description=Aligned Operator +After=network.target + +[Service] +Type=simple +User=aligned +ExecStart=/operator/build/aligned-operator start --config +Restart=always +RestartSec=1 +StartLimitBurst=100 + +[Install] +WantedBy=multi-user.target +``` + +{% hint style="info" %} +`aligned-operator.service` is just an arbitrary name. You can name your service as you wish, following the format `.service`. +{% endhint %} + +Once you have configured the `aligned-operator.service` file, you need to run the following commands: + +```shell +sudo cp aligned-operator.service /etc/systemd/system/aligned-operator.service +sudo systemctl enable --now aligned-operator.service +``` + +{% hint style="warning" %} +All paths must be absolute. +{% endhint %} + +Those commands will link the service to systemd directory and then, will start the Operator service. + +Also, if the server running the operator goes down, systemd will start automatically the Operator on server startup. + +#### Restart operator + +If you want to restart the operator, you can use the following command: + +```shell +sudo systemctl restart aligned-operator.service +``` + +#### Get Operators logs + +Once you are running your operator using systemd, you can get its logs using journalctl as follows: + +```shell +journalctl -xfeu aligned-operator.service +``` + ## Unregistering the operator To unregister the Aligned operator, run: diff --git a/docs/operator_guides/1_operator_FAQ.md b/docs/operator_guides/1_operator_FAQ.md index 5c7f5b64d..79515849f 100644 --- a/docs/operator_guides/1_operator_FAQ.md +++ b/docs/operator_guides/1_operator_FAQ.md @@ -17,9 +17,19 @@ We also recommend the following RPC providers: - [Infura](https://infura.io/) - [Blast](https://blastapi.io/) -The default configuration uses the public nodes RPC. +Two RPCs are used, one as the main one, and the other one as a fallback in case one node is working unreliably. -Since `v0.5.2`, there is a fallback mechanism to have two RPCs, so you need to add a second RPC for redundancy. +Default configurations is set up to use the same public node in both scenarios. + +{% hint style="danger" %} + +PUBLIC NODES SHOULDN'T BE USED AS THE MAIN RPC. We recommend not using public nodes at all. + +FALLBACK AND MAIN RPCs SHOULD BE DIFFERENT. + +{% endhint %} + +Most of the actions will pass through the main RPC unless there is a problem with it. Events are fetched from both nodes. ### How can I check if the version I'm using is the latest one? From fd7b9757b93313095647000fcbc90535961492f1 Mon Sep 17 00:00:00 2001 From: PatStiles <33334338+PatStiles@users.noreply.github.com> Date: Wed, 2 Oct 2024 12:14:31 -0300 Subject: [PATCH 4/6] feat(ffi): ffi refactors (#1092) --- batcher/aligned-batcher/gnark/verifier.go | 10 +- operator/halo2ipa/halo2ipa.go | 12 +-- operator/halo2ipa/halo2ipa_test.go | 39 ++------ operator/halo2kzg/halo2kzg.go | 12 +-- operator/halo2kzg/halo2kzg_test.go | 42 ++------- .../lib/test_files/merkle_root.bin | 2 +- .../lib/test_files/merkle_tree_batch.bin | Bin 11137816 -> 37152 bytes operator/merkle_tree/merkle_tree.go | 4 +- operator/merkle_tree/merkle_tree_test.go | 21 ++--- operator/merkle_tree_old/merkle_tree_old.go | 4 +- .../merkle_tree_old/merkle_tree_old_test.go | 21 ++--- operator/pkg/operator.go | 88 ++++++++---------- operator/pkg/s3.go | 4 +- operator/risc_zero/lib/src/lib.rs | 36 ++++--- operator/risc_zero/risc_zero.go | 10 +- operator/risc_zero/risc_zero_test.go | 8 +- operator/sp1/lib/src/lib.rs | 7 +- operator/sp1/sp1.go | 4 +- operator/sp1/sp1_test.go | 24 ++--- 19 files changed, 143 insertions(+), 205 deletions(-) diff --git a/batcher/aligned-batcher/gnark/verifier.go b/batcher/aligned-batcher/gnark/verifier.go index 4acba01a8..7e4fe547f 100644 --- a/batcher/aligned-batcher/gnark/verifier.go +++ b/batcher/aligned-batcher/gnark/verifier.go @@ -15,15 +15,21 @@ import "C" import ( "bytes" + "log" + "unsafe" + "github.com/consensys/gnark-crypto/ecc" "github.com/consensys/gnark/backend/groth16" "github.com/consensys/gnark/backend/plonk" "github.com/consensys/gnark/backend/witness" - "log" - "unsafe" ) func listRefToBytes(listRef C.ListRef) []byte { + + if listRef.len == 0 { + return []byte{} + } + return C.GoBytes(unsafe.Pointer(listRef.ptr), C.int(listRef.len)) } diff --git a/operator/halo2ipa/halo2ipa.go b/operator/halo2ipa/halo2ipa.go index 6e178f2ff..6df49b051 100644 --- a/operator/halo2ipa/halo2ipa.go +++ b/operator/halo2ipa/halo2ipa.go @@ -10,9 +10,9 @@ import "C" import "unsafe" func VerifyHalo2IpaProof( - proofBuffer []byte, proofLen uint32, - paramsBuffer []byte, paramsLen uint32, - publicInputBuffer []byte, publicInputLen uint32, + proofBuffer []byte, + paramsBuffer []byte, + publicInputBuffer []byte, ) bool { /* For Halo2 the `paramsBuffer` contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 followed by the concatenated variable length buffers: @@ -28,8 +28,8 @@ func VerifyHalo2IpaProof( publicInputPtr := (*C.uchar)(unsafe.Pointer(&publicInputBuffer[0])) return (bool)(C.verify_halo2_ipa_proof_ffi( - proofPtr, (C.uint32_t)(proofLen), - paramsPtr, (C.uint32_t)(paramsLen), - publicInputPtr, (C.uint32_t)(publicInputLen), + proofPtr, (C.uint32_t)(len(proofBuffer)), + paramsPtr, (C.uint32_t)(len(paramsBuffer)), + publicInputPtr, (C.uint32_t)(len(publicInputBuffer)), )) } diff --git a/operator/halo2ipa/halo2ipa_test.go b/operator/halo2ipa/halo2ipa_test.go index 13ed42385..68044505a 100644 --- a/operator/halo2ipa/halo2ipa_test.go +++ b/operator/halo2ipa/halo2ipa_test.go @@ -7,12 +7,6 @@ import ( "github.com/yetanotherco/aligned_layer/operator/halo2ipa" ) -const MaxProofSize = 8 * 1024 - -const MaxParamsSize = 8 * 1024 - -const MaxPublicInputSize = 4 * 1024 - const ProofFilePath = "../../scripts/test_files/halo2_ipa/proof.bin" const PublicInputPath = "../../scripts/test_files/halo2_ipa/pub_input.bin" @@ -20,42 +14,25 @@ const PublicInputPath = "../../scripts/test_files/halo2_ipa/pub_input.bin" const ParamsFilePath = "../../scripts/test_files/halo2_ipa/params.bin" func TestHalo2IpaProofVerifies(t *testing.T) { - proofFile, err := os.Open(ProofFilePath) + proofBytes, err := os.ReadFile(ProofFilePath) if err != nil { t.Errorf("could not open proof file: %s", err) } - proofBytes := make([]byte, MaxProofSize) - nReadProofBytes, err := proofFile.Read(proofBytes) - if err != nil { - t.Errorf("could not read bytes from file") - } - defer proofFile.Close() - paramsFile, err := os.Open(ParamsFilePath) + paramsBytes, err := os.ReadFile(ParamsFilePath) if err != nil { - t.Errorf("could not open proof file: %s", err) + t.Errorf("could not open params file: %s", err) } - paramsBytes := make([]byte, MaxParamsSize) - nReadParamsBytes, err := paramsFile.Read(paramsBytes) - if err != nil { - t.Errorf("could not read bytes from file") - } - defer paramsFile.Close() - publicInputFile, err := os.Open(PublicInputPath) - if err != nil { - t.Errorf("could not open proof file: %s", err) - } - publicInputBytes := make([]byte, MaxPublicInputSize) - nReadPublicInputBytes, err := publicInputFile.Read(publicInputBytes) + publicInputBytes, err := os.ReadFile(PublicInputPath) if err != nil { - t.Errorf("could not read bytes from file") + t.Errorf("could not open public input file: %s", err) } if !halo2ipa.VerifyHalo2IpaProof( - ([]byte)(proofBytes), uint32(nReadProofBytes), - ([]byte)(paramsBytes), uint32(nReadParamsBytes), - ([]byte)(publicInputBytes), uint32(nReadPublicInputBytes), + ([]byte)(proofBytes), + ([]byte)(paramsBytes), + ([]byte)(publicInputBytes), ) { t.Errorf("proof did not verify") } diff --git a/operator/halo2kzg/halo2kzg.go b/operator/halo2kzg/halo2kzg.go index 20330b7c4..0f2f83a32 100644 --- a/operator/halo2kzg/halo2kzg.go +++ b/operator/halo2kzg/halo2kzg.go @@ -9,9 +9,9 @@ import "C" import "unsafe" func VerifyHalo2KzgProof( - proofBuffer []byte, proofLen uint32, - paramsBuffer []byte, paramsLen uint32, - publicInputBuffer []byte, publicInputLen uint32, + proofBuffer []byte, + paramsBuffer []byte, + publicInputBuffer []byte, ) bool { /* For Halo2 the `paramsBuffer` contains the serialized cs, vk, and params with there respective sizes serialized as u32 values (4 bytes) => 3 * 4 bytes = 12 followed by the concatenated variable length buffers: @@ -27,8 +27,8 @@ func VerifyHalo2KzgProof( publicInputPtr := (*C.uchar)(unsafe.Pointer(&publicInputBuffer[0])) return (bool)(C.verify_halo2_kzg_proof_ffi( - proofPtr, (C.uint32_t)(proofLen), - paramsPtr, (C.uint32_t)(paramsLen), - publicInputPtr, (C.uint32_t)(publicInputLen), + proofPtr, (C.uint32_t)(len(proofBuffer)), + paramsPtr, (C.uint32_t)(len(paramsBuffer)), + publicInputPtr, (C.uint32_t)(len(publicInputBuffer)), )) } diff --git a/operator/halo2kzg/halo2kzg_test.go b/operator/halo2kzg/halo2kzg_test.go index 5a0657789..a1ad8c1a0 100644 --- a/operator/halo2kzg/halo2kzg_test.go +++ b/operator/halo2kzg/halo2kzg_test.go @@ -7,15 +7,6 @@ import ( "github.com/yetanotherco/aligned_layer/operator/halo2kzg" ) -// MaxProofSize 4KB -const MaxProofSize = 8 * 1024 - -// MaxProofSize 4KB -const MaxParamsSize = 8 * 1024 - -// MaxPublicInputSize 4KB -const MaxPublicInputSize = 4 * 1024 - const ProofFilePath = "../../scripts/test_files/halo2_kzg/proof.bin" const PublicInputPath = "../../scripts/test_files/halo2_kzg/pub_input.bin" @@ -23,42 +14,25 @@ const PublicInputPath = "../../scripts/test_files/halo2_kzg/pub_input.bin" const ParamsFilePath = "../../scripts/test_files/halo2_kzg/params.bin" func TestHalo2KzgProofVerifies(t *testing.T) { - proofFile, err := os.Open(ProofFilePath) + proofBytes, err := os.ReadFile(ProofFilePath) if err != nil { t.Errorf("could not open proof file: %s", err) } - proofBytes := make([]byte, MaxProofSize) - nReadProofBytes, err := proofFile.Read(proofBytes) - if err != nil { - t.Errorf("could not read bytes from file") - } - defer proofFile.Close() - paramsFile, err := os.Open(ParamsFilePath) + paramsBytes, err := os.ReadFile(ParamsFilePath) if err != nil { - t.Errorf("could not open proof file: %s", err) + t.Errorf("could not open params file: %s", err) } - paramsBytes := make([]byte, MaxParamsSize) - nReadParamsBytes, err := paramsFile.Read(paramsBytes) - if err != nil { - t.Errorf("could not read bytes from file") - } - defer paramsFile.Close() - publicInputFile, err := os.Open(PublicInputPath) - if err != nil { - t.Errorf("could not open proof file: %s", err) - } - publicInputBytes := make([]byte, MaxPublicInputSize) - nReadPublicInputBytes, err := publicInputFile.Read(publicInputBytes) + publicInputBytes, err := os.ReadFile(PublicInputPath) if err != nil { - t.Errorf("could not read bytes from file") + t.Errorf("could not open public input file: %s", err) } if !halo2kzg.VerifyHalo2KzgProof( - ([]byte)(proofBytes), uint32(nReadProofBytes), - ([]byte)(paramsBytes), uint32(nReadParamsBytes), - ([]byte)(publicInputBytes), uint32(nReadPublicInputBytes), + ([]byte)(proofBytes), + ([]byte)(paramsBytes), + ([]byte)(publicInputBytes), ) { t.Errorf("proof did not verify") } diff --git a/operator/merkle_tree/lib/test_files/merkle_root.bin b/operator/merkle_tree/lib/test_files/merkle_root.bin index 7d46ceeae..623903edd 100644 --- a/operator/merkle_tree/lib/test_files/merkle_root.bin +++ b/operator/merkle_tree/lib/test_files/merkle_root.bin @@ -1 +1 @@ -e0a3761a514a2a7873350869e699bbd87c9cbf53ba963caae0a232cb6d698b1b \ No newline at end of file +715181f01c095618472a72cd06e384d92f02eadc4ea28bf097181b17fdc57f28 \ No newline at end of file diff --git a/operator/merkle_tree/lib/test_files/merkle_tree_batch.bin b/operator/merkle_tree/lib/test_files/merkle_tree_batch.bin index 7238a17a143f6dc1518d97d3c5f273fa8e22793a..733703c5436ea0c8c3815f83203b4b466e711ffa 100644 GIT binary patch literal 37152 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 literal 11137816 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
  • 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%0AE*v{$pwMK`uM8Q=QVvbFX5y4fS1Ptl| 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