Web3js

如何在 DAPP 中呼叫智能合約功能?

  • July 3, 2019

我正在嘗試製作 DAPP。

我跟著這個連結 -

https://medium.com/@takleakshar/how-to-build-a-decentralized-full-stack-app-in-ethereum-and-react-42e63d45a208

這就是我的“Setup.js”的外觀。

import Web3 from 'web3';

const web3 = new Web3(new 
Web3.providers.HttpProvider("http://localhost:8545"));

const marketplaceContract = new web3.eth.Contract( ABI , 'Smart 
Contract Address', {
from: '0x123....', // default from address
gasPrice: '20000000000' // default gas price in wei, 20 gwei in this 
case
});

//const marketplaceContract = 
web3.eth.contract(MarketABI).at(MarketAddress);
export { marketplaceContract };

如您所見,我正在導入名為“marketplaceContract”的智能合約。

當我使用智能合約呼叫一個函式時 -

marketplaceContract.addGoods(name, user, age, brand, size, sp);

我得到的輸出為

TypeError: _Setup__WEBPACK_IMPORTED_MODULE_5__.marketplaceContract.addAccounts is not a function

雖然, addAccounts 是一個函式。

不知道是不是web3版本的問題。請幫助。還有其他方法可以呼叫我的 React-JS 文件中的函式嗎?

PS - 我不知道我是否必須把整個程式碼放在這裡。如果需要,請告訴我,我會將智能合約和 React 文件都放在這裡。我沒有放它,因為它很大。請不要開始鄙視我。

編輯

當我有一個.call()功能時,它執行良好。但是當我有一個在區塊鏈中以結構數據類型儲存一些數據的函式時,它就不起作用了。我用於.send({from: accounts[0]})那個功能。然後錯誤彈出

未處理的拒絕(TypeError):無法讀取未定義的屬性“匹配”

我搜尋了這個錯誤。我刪除了我的 package-lock.json 文件和 node_modules,然後安裝了 npm。不過,我得到了同樣的錯誤。我應該如何進行?

請檢查https://web3js.readthedocs.io/en/1.0/web3-eth-contract.html#id10。您必須將 .methods 添加到您的合約實例中,然後呼叫智能合約方法。

getMinABI: function () {
   return [
       {
           "constant": true,
           "inputs": [{"name": "_owner", "type": "address"}],
           "name": "balanceOf",
           "outputs": [{"name": "balance", "type": "uint256"}],
           "type": "function"
       },
       {
           "constant": true,
           "inputs": [],
           "name": "decimals",
           "outputs": [{"name": "", "type": "uint8"}],
           "type": "function"
       },
       {
           "constant": false,
           "inputs": [{"name": "_to", "type": "address"}, {"name": "_value", "type": "uint256"}],
           "name": "transfer",
           "outputs": [{"name": "success", "type": "bool"}],
           "payable": false,
           "stateMutability": "nonpayable",
           "type": "function"
       }
   ];
}

let contract = new Web3.eth.Contract(this.getMinABI(), 'contract address', {
    from: 'your address'
});

contract.methods.balanceOf('your address').call().then((balance) => {
  console.log(balance)
});

希望對你有幫助

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