Contract-Deployment
如何使用 Rust 部署合約?
我正在使用帶有 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的未解決問題列表。