Solidity

無法將事務添加到區塊鏈(我正在呼叫 setMessage(str) 方法,但我傳遞的字元串未設置但 getMessage() 方法有效)

  • April 16, 2022

當我呼叫 setMessage() 函式時,這不會在區塊鏈中記錄任何事務。但是 getMessage() 函式的工作原理是立即將之前使用 remix IDE 設置的消息帶入。

如果我嘗試立即使用 Remix IDE 設置消息,我的元遮罩會打開以進行確認。我的前端應用程序不會發生這種情況。

這就是我嘗試執行的。

<script>

   // Connect a the web3 provider
   if (typeof web3 !== 'undefined') {
       web3 = new Web3(web3.currentProvider);
   } else {
       web3 = new Web3(new Web3.providers.HttpProvider("https://rinkeby.infura.io/v3/298df63315214b1688a3c2b29e03217d"));
   }

   // Set a default account
   web3.eth.defaultAccount = web3.eth.accounts[0];

   //console.log(web3.eth.defaultAccount);

   // Get the contract address
   var RemixContract = new web3.eth.Contract([
       {
           "constant": true,
           "inputs": [],
           "name": "getMessage",
           "outputs": [
               {
                   "internalType": "string",
                   "name": "",
                   "type": "string"
               }
           ],
           "payable": false,
           "stateMutability": "view",
           "type": "function"
       },
       {
           "constant": false,
           "inputs": [
               {
                   "internalType": "string",
                   "name": "x",
                   "type": "string"
               }
           ],
           "name": "setMessage",
           "outputs": [],
           "payable": false,
           "stateMutability": "nonpayable",
           "type": "function"
       }
   ], '0xa212507364d7E73909Aad1ac114178dDfB48e476');

   console.log(RemixContract);

   $("#setMessageButton").click(function () {
       var val = $("#userInput").val();
       RemixContract.methods.setMessage(val)
       .call()
       .then(function(result){
           console.log(result)
       })
   });

</script>

這是我在 Remix IDE 中的智能合約:

pragma solidity ^0.4.24;

contract Message {
string myMessage;

function setMessage(string x) public {
   myMessage = x;
}

function getMessage() public view returns (string) {
   return myMessage;
}
}

Remix IDE 的螢幕截圖

像這樣獲取回調響應:

在此處輸入圖像描述

有人請讓我知道我錯過了什麼。提前致謝。

當你呼叫setMessage函式時,你應該使用send而不是call

$("#setMessageButton").click(function () {
       var val = $("#userInput").val();
       RemixContract.methods.setMessage(val)
       .send()
       .then(function(result){
           console.log(result)
       })
   });

希望這可以幫助

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