Contract-Deployment

如何使用 Rust 部署合約?

  • March 25, 2021

我正在使用帶有 crate web3 0.15.0的 Rust 。(有沒有更好的庫可以使用?)

我的目標是使用我用 Rust 編寫的程序部署合約並在其中呼叫函式。

我有兩個簡單的函式,一個連接到客戶端,另一個部署合約,以及一個呼叫這兩個函式的 main 函式。嘗試使用 web3 庫進行部署時出現錯誤。

use web3::transports::WebSocket;
use web3::Web3;
use web3::api::Eth;
use web3::contract::Contract;

use std::path::Path;
use std::fs::File;
use std::io::Read;

async fn connect_ws () -> Web3<WebSocket>
{
   let transport = WebSocket::new ("ws://127.0.0.1:6691").await;
   Web3::new (transport.unwrap ())
}

async fn deploy (eth: Eth<WebSocket>)
{
   let abi_file = "../../solidity/test/SmallContract.abi";
   let bin_file = "../../solidity/test/SmallContract.bin";

   // make sure the files exist
   let required_files = [&abi_file, &bin_file];
   for rf in required_files.iter ()
   {
       if !Path::new (rf).exists () { println! ("{} does not exist.\n", rf); std::process::exit (1); }
   }

   // open the abi file
   let abi = File::open (&abi_file);
   if abi.is_err () { println! ("Failed to open {}\n", abi_file); std::process::exit (1); }

   // read the abi file
   let mut abi_data = String::new ();
   let bytes_read = abi.unwrap ().read_to_string (&mut abi_data);
   if bytes_read.is_err () { println! ("Failed to read from {}\n", abi_file); std::process::exit (1); }

   let builder = Contract::deploy (eth, abi_data.as_bytes ());
   match &builder
   {
       Err (err) => { println! ("Contract::deploy returned an error:\n{}\n", err); std::process::exit (1); },
       Ok (_) => {}
   }
}

#[tokio::main]
async fn main ()
{
   let web3 = connect_ws ().await;
   deploy (web3.eth ()).await;
}

Contract::deploy 返回錯誤。顯然,它需要字節而不是 JSON 的實際文本。

我的程序的輸出是:

Contract::deploy returned an error:
Serialization error: Invalid operation type. at line 1 column 891

abi 文件的長度為 891 個 ascii 字元。JSON 格式正確。我已經嘗試使用由 solc 0.8.2 和 solc 0.7.6 生成的文件,並且它做同樣的事情。

難道我做錯了什麼?有誰知道在 Rust 中部署合約的任何範常式式碼?

這是一個已知錯誤,已報告為問題 #410

還有一個web3 crate的未解決問題列表。

引用自:https://ethereum.stackexchange.com/questions/95009