Transactions

Ropsten 測試網路中未發生交易

  • May 9, 2020

我正在學習建立一個簡單的前端網站,在測試環境中執行智能合約方法,但是即使 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>
  1. 我已經從 MetaMask 水龍頭中獲得了乙太幣到 Ropsten 測試網路。
  2. 在 MetaMask 上將網路設置為 Ropsten 測試網路。
  3. 通過注入的 web3 環境在 Remix IDE 上部署智能合約
  4. 將前端網站程式碼中Web3的端點指向Infura的Ropsten地址
  5. 在前端程式碼中設置 Remix 的合約地址以及 ABI

如前所述,MetaMask 顯示了正在確認的 Contract Deployment 的日誌,但是當我嘗試使用該方法setMessage時,MetaMask 彈出視窗沒有出現,並且沒有其他任何反應。該網站通過 VSC 的 Live Server 擴展在本地埠 5500 上執行,並且在日誌中沒有顯示錯誤。

您正在使用.call(),它不會創建交易。用於查詢合約。

如果要修改契約,則需要使用.send().

看來,您的程式碼無法連接到元遮罩,請嘗試更改

web3 = new Web3(web3.currentProvider);

web3 = new Web3(window.web3.currentProvider);

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