使用web3库将2 x 2矩阵传递给函数时,我遇到了一些问题。
该库旨在将参数传递到ABI(抽象二进制接口),该接口在区块链上调用智能合约。问题在于,ABI具有某些类型的参数必须匹配(例如Uint
,String
)。
https://docs.rs/web3/0.10.0/web3/contract/struct.Contract.html#method.call
它公开的接口是另一个名为ethabi的库,它提供了我需要的类型(例如Bytes
,FixedArray
)
不幸的是,方法调用需要参数来实现Tokenizable
特征,而Bytes
和FixedArray
则不需要。
当我尝试传递字符串时,我得到一个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
*/
}
[dependencies]
web3 = { git = "https://github.com/tomusdrw/rust-web3" }
ethabi = "12.0.0"
primitive-types = "0.7.0"