将FixedArrays和Bytes传递给智能合约

时间:2020-04-14 21:27:41

标签: rust ethereum smartcontracts

使用web3库将2 x 2矩阵传递给函数时,我遇到了一些问题。

该库旨在将参数传递到ABI(抽象二进制接口),该接口在区块链上调用智能合约。问题在于,ABI具有某些类型的参数必须匹配(例如UintString)。

https://docs.rs/web3/0.10.0/web3/contract/struct.Contract.html#method.call

它公开的接口是另一个名为ethabi的库,它提供了我需要的类型(例如BytesFixedArray

不幸的是,方法调用需要参数来实现Tokenizable特征,而BytesFixedArray则不需要。

当我尝试传递字符串时,我得到一个AbiError(InvalidData),这表明我传递ABI的数据之间不匹配。

当我尝试通过ethabi::Token::{Bytes,FixedArrays}时,我收到一条错误消息,说明不满足Tokenize特质界限。

我怎么能得到这个?

这是我到目前为止尝试过的:

extern crate ethabi;
extern crate primitive_types;
extern crate web3;

use ethabi::Token::{FixedArray, FixedBytes, Uint};
use ethabi::*;
use primitive_types::*;
use web3::contract::{Contract, Options};
use web3::futures::Future;
use web3::types::{Address, Bytes, H256 as H256_w, U256 as U256_w};


fn main() {
    let addr = "*snip*";
    let smart_contract_addr = "*snip*";

    let (_eloop, transport) = web3::transports::Http::new(&addr).unwrap();

    let web3 = web3::Web3::new(transport);
    let accounts = web3.eth().accounts().wait().unwrap();

    // Accessing existing contract
    let accounts = web3.eth().accounts().wait().unwrap();

    let contract_address: Address = "83249c2366a34cCbe6b2AeFEeF94A59beFc4C4Cd".parse().unwrap();
    let contract = Contract::from_json(
        web3.eth(),
        contract_address,
        include_bytes!("../build/*snip*.abi"),
    )
    .unwrap();

    let a = Token::Uint(
        U256::from_dec_str(
            "1368015179489954701390400359078579693043519447331113978918064868415326638035",
        )
        .unwrap(),
    );
    let b = Token::Uint(
        U256::from_dec_str(
            "9918110051302171585080402603319702774565515993150576347155970296011118125764",
        )
        .unwrap(),
    );
    let c = Token::Uint(
        U256::from_dec_str(
            "4503322228978077916651710446042370109107355802721800704639343137502100212473",
        )
        .unwrap(),
    );
    let d = Token::Uint(
        U256::from_dec_str(
            "6132642251294427119375180147349983541569387941788025780665104001559216576968",
        )
        .unwrap(),
    );

    let f = vec![c, d];
    let g = vec![a, b];
    let x = FixedArray(f); /*Desired Type: https://docs.rs/ethabi/12.0.0/ethabi/enum.Token.html#method.to_array*/

    let n = Bytes::from("0xdf32340000000000000000000000000000000000000000000000000000000000");
    let result = contract.call(
        "calculate_aggregate",
        (x, n),
        accounts[0],
        Options::default(),
    );
    let aggregate = result.wait().unwrap();
    println!("{}", aggregate);

    /*

    Error:  the trait `web3::contract::tokens::Tokenizable` is not implemented for `ethabi::Token`
    When strings are used; thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: Abi(InvalidData)', src/main.rs:115:21
    */
}

Cargo.toml

[dependencies]
web3 = { git = "https://github.com/tomusdrw/rust-web3" }
ethabi = "12.0.0"
primitive-types = "0.7.0"

0 个答案:

没有答案