如何使用 Nethereum 和 Infura 呼叫智能合約函式
我正在使用 Nethereum 在 Ropsten 中呼叫智能合約函式。我也在使用 Infura。
該功能需要合約所有者的權限才能執行。這是我的程式碼:
var account = new Account(ownerPrivateKey) var web3 = new Web3(account, $"https://ropsten.infura.io/v3/{infuraId}"); var contract = web3.Eth.GetContract(abi, contractAddress); var function = contract.GetFunction("myFunction"); var result = await function .CallAsync<dynamic>(address, true);
我收到錯誤:Nethereum.JsonRpc.Client.RpcResponseException:執行恢復:Ownable:呼叫者不是所有者。我想我需要在發送之前簽署交易,但我不知道怎麼做。我不知道我應該使用 CallAsync 還是 SendTransactionAsync,因為該函式將數據寫下來,而不是讀取任何內容。我嘗試了 SendTransactionAsync,但它似乎不適用於 Infura。誰有這方面的經驗,請幫幫我。我是新來的。
我的合約功能:
function myFunction(address account, bool flag) internal { _address[account] = flag; }
看來您的函式檢查是有效的所有者,因此您有一個還原錯誤消息
Nethereum.JsonRpc.Client.RpcResponseException: execution reverted: Ownable: caller is not the owner
。這是製作CallAsync
並獲得solidityrevert
消息後的輸出。如果你想改變合約的狀態(主要是寫入合約/乙太坊)你需要使用
SendTransactionAsync
而不是CallAsync
回到第一個問題,因為您正在“無類型”工作(使用字元串而不是特定的契約定義進行互動),您需要
from
在進行 CallAsync 時將參數設置為您的帳戶。你可以使用account.Address
這個。主要是在對智能合約進行呼叫/查詢時,from
在 CallAsync 中設置值將使該值msg.sender
與事務呼叫一樣穩定。檢查這個例子http://playground.nethereum.com/csharp/id/1045(非常大的例子不適合這裡)如何以這種方式進行互動。
從長遠來看,我建議使用帶有類型化合約定義的程式碼生成器,從長遠來看它更容易(還支持結構、生成事件、多輸出、自動估算氣體等)