Infura

如何使用 Nethereum 和 Infura 呼叫智能合約函式

  • March 11, 2022

我正在使用 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(非常大的例子不適合這裡)如何以這種方式進行互動。

從長遠來看,我建議使用帶有類型化合約定義的程式碼生成器,從長遠來看它更容易(還支持結構、生成事件、多輸出、自動估算氣體等)

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