Web3js

如何使我的智能合約可用於與 Metamask 互動?

  • December 28, 2021

我正在使用 OpenZeppelin 入門套件。我寫了一個智能合約,它只包含兩個可以呼叫的整數。我編譯並部署了智能合約到我當地的 Ganache 區塊鏈。我已經啟動了我的 React Dapp,它通過 Metamask 連接到 Ganache(例如,我可以看到我的賬戶餘額)。

請查看我的儲存庫:https ://github.com/Lennardmulder/ozreact

我現在希望我的 Dapp 有一個按鈕,允許使用者呼叫該count函式並顯示其結果。我懷疑我首先需要使用類似的東西

var myContract = new web3.eth.Contract([...], '0xde0B295669a9FD93d5F28D9Ec85E40f4cb697BAe', {
   from: '0x1234567890123456789012345678901234567891', // default from address
   gasPrice: '20000000000' // default gas price in wei, 20 gwei in this case
});

插入正確的 ABI 和地址,以允許 Metamask 與智能合約互動?但是我在我的程式碼中究竟在哪裡定義這個?

在這裡查看您的智能合約,我看不到您的 dApp 可以指向的 getter 方法。在您的智能合約中放置以下程式碼:

function getCount() public view returns(uint) {
   return count;
}

現在在您的 dApp 中,您可以像這樣訪問這個新方法:

myContract.methods.getCount().call({from: <ADDRESS>}, function(err, response) {
   if(!err) {
       console.log(response, 'response');
   } else {
       console.error(err, 'err');
   }
});

此外,在升級和重新部署您的合約時,不要忘記將合約地址替換為new web3.eth.Contract().

添加到 Miroslav 的答案(對不起,我還不能評論):

如果將變數定義為 public,編譯器會自動生成一個與變數同名的 getter 方法。uint public count正如 OPs 契約中聲明的那樣,將生成函式

function count() public view returns(uint) {
   return count;
}

無需手動創建 getter,只需const count = await instance.methods.count().call()在非同步函式內部使用即可獲取 count 的值。

在這裡查看如何將 web3 與 metamask 連接:如何將 Web3 與 MetaMask 連接?

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