Web3js

從 web3/Meteor Dapp 呼叫智能合約功能時耗電

  • March 3, 2022

以下智能合約函式在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()

是的,因為calland sendTransaction(or send) 在 web3 上是不同的。

致電醫生

將呼叫“常量”方法並在 EVM 中執行其智能合約方法,而不發送任何交易。注意呼叫不能改變智能合約狀態。

發送事務文件

將向智能合約發送交易並執行其方法。請注意,這可能會改變智能合約狀態。

PS:文件連結指向 web3 1.0,如果在您的問題中認為您指的是 web3 < 1.0,則文件在這裡

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