Solidity
無法將事務添加到區塊鏈(我正在呼叫 setMessage(str) 方法,但我傳遞的字元串未設置但 getMessage() 方法有效)
當我呼叫 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; } }
像這樣獲取回調響應:
有人請讓我知道我錯過了什麼。提前致謝。
當你呼叫
setMessage
函式時,你應該使用send
而不是call
$("#setMessageButton").click(function () { var val = $("#userInput").val(); RemixContract.methods.setMessage(val) .send() .then(function(result){ console.log(result) }) });
希望這可以幫助