Solidity

每個合約允許多少功能?+ 堅固性

  • September 23, 2021

我向 ropsten 部署了一個契約,並嘗試從前端呼叫一個方法,但得到了

TypeError:無法讀取未定義的屬性“呼叫”

所以我檢查了我的實例this.Test.deployed().then((instance) => { console.log(instance) },看看我是否有這個功能,但是這個特定的功能不存在!

這是一個public view returns返回布爾值的函式。我在契約中有幾個public view returns功能,但我不知道為什麼省略了這個。在創建 ropsten 契約時,我什至沒有遇到錯誤。有限制還是什麼?

編輯

從前端:

 checkPrizeReceived(id: number, price: number): Promise<any> { 
   this.Test.setProvider(this.web3.currentProvider); 
   return this.Test.deployed().then((instance) => {
     console.log(instance)
       return instance.checkPrizeReceived.call(id, price);
   })
   .then((value) => {  
     return value;
   })
   .catch((e) => {
       console.log(e);
   });
 }

堅固性:

 function checkPrizeReceived(uint256 id, uint price) public view returns (bool) {
   for (uint i = 0; i < better[msg.sender].length; i++) {   
     if (better[msg.sender][i].id == id && better[msg.sender][i].price == price) {
       if (better[msg.sender][i].receivedPrize) {
         return true;
       }
     }
   }

   return false;
 }

問題可能出在“web3”上。檢查您使用的 web3 版本。

在 1.0 版中,呼叫契約使用 .call() 方法 https://web3js.readthedocs.io/en/1.0/web3-eth.html#id74

在 0.2.xx 版本中,您可以直接從合約實例中呼叫方法

myContractInstance.myMethod(param1 [, param2, ...] [, transactionObject] [, defaultBlock] [, callback]);

0.2 版本的文件在這裡https://github.com/ethereum/wiki/wiki/JavaScript-API

沒有函式的最大數量之類的東西,只有每個塊的最大氣體量,在任何情況下都包括合約的整個字節碼。

首先,如果該函式不在 ABI 中,但在您的 solidity 程式碼中,您將不得不重新編譯並重新生成 ABI(並可能重新部署合約)。如果在此過程中沒有錯誤,則該函式這次應該在 ABI 中。

其次,我認為您以錯誤的方式訪問該功能。它應該如下:

instance.checkPrizeReceived(id, price).call({from: "0x.........."});

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