Solidity

為什麼我的智能合約功能不被 web3 辨識?

  • October 7, 2021

我正在嘗試開發一個新的 Dapp。我已經編寫了智能合約,它們執行良好。我現在需要使用 web3 與智能合約進行互動,現在使用 ropsten 或 rinkeby。

我收到錯誤“未擷取的 TypeError:myCollection.methods.getNumberObjects.call(…) 不是函式”

以下是相關程式碼:

<script language="javascript" type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/web3@latest/dist/web3.min.js"></script>
<script language="javascript" type="text/javascript" src="collection_abi.js"></script>

   
window.addEventListener('load', function() {

   window.ethereum.enable();

   // Checking if Web3 has been injected by the browser (Mist/MetaMask)
   if (typeof web3 !== 'undefined') {
       // Use MetaMask's provider
       web3js = new Web3(web3.currentProvider);
   } else {
       // set the provider you want from Web3.providers - Ropesten
       web3js = new Web3.providers.HttpProvider("http://localhost:3000");
   }

   web3js.eth.defaultAccount = web3js.eth.accounts[0];

   // Now start app:
   startApp()
 })

function startApp() {
   collectionAddress = '0xaff...'
   myCollection = new web3js.eth.Contract(collectionABI, collectionAddress);

   updateCollection();
   }

這是我在 Windows 電腦上傳入的內容:

  • 紗線精簡版伺服器
  • 紗線節點
  • 紗線節點gyp
  • 紗線網3
  • 紗線 web3-eth

這是 package.json:

{“名稱”:“測試”,“版本”:“1.0.0”,“主”:“index.js”,“腳本”:{“開發”:“精簡伺服器”,“測試”:“迴聲” “錯誤:未指定測試”&& 退出 1”},“儲存庫”:“https://github.com/prutovitz/Test.git”,“作者”:“Philip Rutovitz prutovitz@gmail.com”,“許可證” :“MIT”,“依賴項”:{“lite-server”:“^2.6.1”,“node”:“^16.10.0”,“node-gyp”:“^8.2.0”,“web3” : “^1.6.0”, “web3-eth”: “^1.6.0” } }

我得到實際錯誤的地方是:

// Update Collection data
function updateCollection() {

   myCollection.getNumberObjects (function(errGNO, resGNO) {

getNumberObjects 定義為:

function getNumberObjects() public view returns(uint) {
    return objects.length;
} // function getNumberObjects()

儘管我沒有收到錯誤消息,但似乎 web3 連接不正確。

誰能幫我?

謝謝!

據我所見,我在您的程式碼中的任何地方都看不到您實際呼叫該方法的語法。您有契約的實例,myCollection但您沒有正確呼叫該函式。而不是這個:

function updateCollection() {

myCollection.getNumberObjects (function(errGNO, resGNO) {

你可以試試這個:

let collection = myCollection.methods.getNumberObjects().call()

也許看看 react.js 的類組件和功能組件。我認為這比你現在擁有的方法更好。這是一個提出想法的連結:https ://www.pluralsight.com/guides/manipulating-arrays-and-objects-in-state-with-react

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