Передача FixedArrays и байтов в смарт-контракт - PullRequest
1 голос
/ 15 апреля 2020

У меня возникли проблемы с передачей матрицы 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"
...