Raw-Transaction

Nethereum // Infura/RPC 客戶端

  • July 4, 2018

我有一段時間讓交易發佈在主網上。問題與我的錢包餘額或 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);

您可以在此處找到完整範例: https ://github.com/Nethereum/Nethereum.CQS.SimpleTokenTransfer/blob/master/Nethereum.CQS.SimpleTokenTransfer/Program.cs#L111-L155

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