Transactions
Ropsten 測試網路中未發生交易
我正在學習建立一個簡單的前端網站,在測試環境中執行智能合約方法,但是即使 MetaMask 確認了合約的部署,交易也沒有被執行。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>Deploy a Remix Contract</title> <link rel="stylesheet" type="text/css" href="main.css" /> <script src="https://cdn.jsdelivr.net/gh/ethereum/web3.js/dist/web3.min.js"></script> </head> <body> <div> <h1>Ethereum Secret Messenger</h1> <hr /> <label for="message" >This site writes a secret message to the Ethereum blockchain!</label > <input id="userInput" type="text" /> <button id="setMessageButton">Set secret message</button> </div> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js"></script> <script> // Connect a the web3 provider if (typeof web3 !== "undefined") { web3 = new Web3(web3.currentProvider); } else { web3 = new Web3( new Web3.providers.HttpProvider( "https://ropsten.infura.io/v3/3934271dae4126bf3bffc1244d2f6f" ) ); } // Set a default account web3.eth.defaultAccount = web3.eth.accounts[0]; // Get the contract address var RemixContract = new web3.eth.Contract([ { constant: false, inputs: [ { name: "x", type: "string", }, ], name: "setMessage", outputs: [], payable: false, stateMutability: "nonpayable", type: "function", }, { constant: true, inputs: [], name: "getMessage", outputs: [ { name: "", type: "string", }, ], payable: false, stateMutability: "view", type: "function", }, ]); // Get the contract abi RemixContract.options.address = "0xbB2a0A4c3Fa4611eF34b260Bbb4932548fF38947"; $("#setMessageButton").click(function () { message = $("#userInput").val(); RemixContract.methods .setMessage($("#userInput").val()) .call() .then(console.log); console.log($("#userInput").val()); }); </script> </body> </html>
- 我已經從 MetaMask 水龍頭中獲得了乙太幣到 Ropsten 測試網路。
- 在 MetaMask 上將網路設置為 Ropsten 測試網路。
- 通過注入的 web3 環境在 Remix IDE 上部署智能合約
- 將前端網站程式碼中Web3的端點指向Infura的Ropsten地址
- 在前端程式碼中設置 Remix 的合約地址以及 ABI
如前所述,MetaMask 顯示了正在確認的 Contract Deployment 的日誌,但是當我嘗試使用該方法
setMessage
時,MetaMask 彈出視窗沒有出現,並且沒有其他任何反應。該網站通過 VSC 的 Live Server 擴展在本地埠 5500 上執行,並且在日誌中沒有顯示錯誤。
您正在使用
.call()
,它不會創建交易。用於查詢合約。如果要修改契約,則需要使用
.send()
.
看來,您的程式碼無法連接到元遮罩,請嘗試更改
web3 = new Web3(web3.currentProvider);
到
web3 = new Web3(window.web3.currentProvider);