Solidity
每個合約允許多少功能?+ 堅固性
我向 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.........."});