Web3js
從 web3/Meteor Dapp 呼叫智能合約功能時耗電
以下智能合約函式在Remix-Solidity IDE中呼叫並連接到testrpc時起作用。
function submitAsset(string ownerName, string assetName, string assetDesc, string barcode, string sku, string countryOrigin) public returns (bool success) { if (!map_assets[msg.sender].initialized) { map_assets[msg.sender] = Asset(msg.sender, ownerName, assetName, assetDesc, barcode, sku, countryOrigin, true); assetAddresses.push(msg.sender); noOfAssets = assetAddresses.length; AssetSubmitted(msg.sender, ownerName, assetName, assetDesc, barcode, sku, countryOrigin, true); return true; } return false; }
但是,從 Meteor/web3 應用程序呼叫時,我擺脫**了氣體錯誤。**以下是我的 javascript 文件中的程式碼:
instance.contract.submitAsset(ownerName, assetName, assetDesc, barcode, sku, countryOrigin).call({gas: estimateGas}, function(error, result) { if(!error) { console.log("yeah!: " + result); } else { console.log("ooops!: " + error); } });
請注意,估計的 gas 為 260385(參考 Solidity IDE)。所以,然後我在javascript文件中將estimatedGas設置為300000 - 只是為了確保它能夠通過。仍然無濟於事。
再次,如果有人能指出我的提示/建議,我將不勝感激。謝謝你。
我讓它與以下行一起工作,
instance.contract.submitAsset.sendTransaction(prnName, assetName, assetDesc, barcode, sku, countryOrigin, {gas: estimateGas});
使用
contract.methodName.sendTransaction(params, options)
而不是
contract.methodName(params).call()
是的,因為
call
andsendTransaction
(orsend
) 在 web3 上是不同的。致電:醫生
將呼叫“常量”方法並在 EVM 中執行其智能合約方法,而不發送任何交易。注意呼叫不能改變智能合約狀態。
發送事務:文件
將向智能合約發送交易並執行其方法。請注意,這可能會改變智能合約狀態。
PS:文件連結指向 web3 1.0,如果在您的問題中認為您指的是 web3 < 1.0,則文件在這裡