У меня возникли проблемы с передачей матрицы 2 x 2 в функцию с использованием библиотеки web3 .
Библиотека предназначена для передачи параметров в 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
*/
}
Автомобиль go .toml
[dependencies]
web3 = { git = "https://github.com/tomusdrw/rust-web3" }
ethabi = "12.0.0"
primitive-types = "0.7.0"