Nethereum // Infura/RPC 客戶端
我有一段時間讓交易發佈在主網上。問題與我的錢包餘額或 gas 無關。同一合約上的餘額查找工作正常。但是,我無法獲得此離線簽名交易(原始交易等價物,)
我已經嘗試了所有傳遞各種參數的方式,我已經通過事務管理器設置了 defaultGas/Price,並將 SendTransactionAsync() 方法與不需要它們的重載一起使用。我已經單獨發送了帶有合約參數的方法(不在下面的對像數組中)。我仔細檢查了隨機數 - 它顯示為 0。我嘗試了這個和 andwaitforreceipt 變體。
var contract = web3.Eth.GetContract(contractAbi,contractAddress); var function = contract.GetFunction("transfer"); hash = await function.SendTransactionAsync(@from: accountAddress, gas: new HexBigInteger(60000), gasPrice: HexBigInteger(40), value: null, functionInput: new object[] { recipient, Web3.Convert.ToWei(value) });
該合約是標準的 ERC20 代幣。關於為什麼交易沒有返回錯誤但 infura 不廣播的任何見解?我在正常的私有 geth 節點上多次使用了相同的程式碼。
編輯:我也一直在嘗試獲取其他一些 RPC JSON API。如果有人熟悉,您會通過發送數據有效負載的方式確認這是正確的方法嗎?我從 etherscan api 得到一個“低估的錯誤”
var contract = web3.Eth.GetContract(contractAbi, contractAddress); var function = contract.GetFunction("transfer"); string fdata = function.GetData(new object[] { recipient, Web3.Convert.ToWei(value) }); var txCount = await web3.Eth.Transactions.GetTransactionCount.SendRequestAsync(accountAddress); var encoded = Web3.OfflineTransactionSigner.SignTransaction(privateKey: accountKey, to: contractAddress, amount: 0, nonce: txCount.Value, gasPrice: new BigInteger(70), gasLimit: new HexBigInteger(60000), data: fdata); encoded = "0x" + encoded;
我可以看到您使用的價格已經相當低(需要從 Gwei 轉換為 Wei),但您也將受益於估算交易的 gas,並使用 Nethereum 的其他功能。
首先,我們可以有一個 TransferFunction。這主要是描述來自 ERC20 合約的 Transfer 函式和不同參數的對象。這繼承自 ContractMessage,其中包括其他屬性,例如 AddressFrom、Gas、GasPrice、Value(乙太幣值),它們是普通交易的一部分。
[Function("transfer", "bool")] public class TransferFunction : ContractMessage { [Parameter("address", "_to", 1)] public string To { get; set; } [Parameter("uint256", "_value", 2)] public BigInteger TokenAmount { get; set; } }
現在讓我們定義我們的自定義變數:
var senderAddress = "0x12890d2cce102216644c59daE5baed380d84830c"; var receiverAddress = "0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe"; var privatekey = "0xb5b1870957d373ef0eeffecc6e4812c0fd08f554b37b233526acc331bf1544f7"; var url = "https://rinkeby.infura.io/";
並創建一個新的 Web3 實例。
var web3 = new Web3.Web3(new Account(privatekey), url);
這個 Web3 實例是使用新的 Account 對象使用私鑰創建的。這主要使 Web3 能夠在發送之前“離線”簽署任何交易,因此您無需自己製作所有內容。
下一步是創建我們要發送的消息的實例。
var transactionMessage = new TransferFunction() { FromAddress = senderAddress, To = receiverAddress, TokenAmount = 100, //Set our own price GasPrice = Web3.Web3.Convert.ToWei(25, UnitConversion.EthUnit.Gwei) };
這裡已經填充了 FromAddress(這不是必需的,因為這將從已經設置的 Account 中選擇)、智能合約的接收者(To)、金額,最後是 GasPrice。
這個 GasPrice 是一個自定義價格(不使用 Nethereum 預設值,由於價格波動可能會太貴,現在是這樣)。
為了設置價格,我們將其從通常用於定價的單位 Gwei 轉換為 Wei。
現在我們已經準備好我們的“消息”/事務,我們可以創建一個事務處理程序,它將負責發送事務。
var transferHandler = web3.Eth.GetContractTransactionHandler<TransferFunction>();
另一個步驟(這是可選的),因為這是自動為您完成的,是估計交易的成本(以 gas 為單位)。
var estimate = await transferHandler.EstimateGasAsync(transactionMessage, ContractAddress); transactionMessage.Gas = estimate.Value;
最後發送交易:
var transactionHash = await transferHandler.SendRequestAsync(transactionMessage, ContractAddress);