Go-Ethereum

Web3:執行合約功能但只接收交易雜湊或錯誤值

  • October 19, 2017

我正在嘗試在我自己的 geth 測試網上展示一個功能。我部署了在http://solidity.readthedocs.io/en/develop/types.html?highlight=crowdfunding找到的範例契約。

pragma solidity ^0.4.11;

contract CrowdFunding {
   // Defines a new type with two fields.
   struct Funder {
       address addr;
       uint amount;
   }

   struct Campaign {
       address beneficiary;
       uint fundingGoal;
       uint numFunders;
       uint amount;
       mapping (uint => Funder) funders;
   }

   uint numCampaigns;
   mapping (uint => Campaign) campaigns;

   function newCampaign(address beneficiary, uint goal) returns (uint campaignID) {
       campaignID = numCampaigns++; // campaignID is return variable
       // Creates new struct and saves in storage. We leave out the mapping type.
       campaigns[campaignID] = Campaign(beneficiary, goal, 0, 0);
   }

   function contribute(uint campaignID) payable {
       Campaign storage c = campaigns[campaignID];
       // Creates a new temporary memory struct, initialised with the given values
       // and copies it over to storage.
       // Note that you can also use Funder(msg.sender, msg.value) to initialise.
       c.funders[c.numFunders++] = Funder({addr: msg.sender, amount: msg.value});
       c.amount += msg.value;
   }

   function checkGoalReached(uint campaignID) returns (bool reached) {
       Campaign storage c = campaigns[campaignID];
       if (c.amount < c.fundingGoal)
           return false;
       uint amount = c.amount;
       c.amount = 0;
       c.beneficiary.transfer(amount);
       return true;
   }
}

“契約”引用已部署的契約。我設置了我的預設帳戶並執行了 newCampaign 功能:

> contract.newCampaign(eth.accounts[0], 100)
"0x0122973cbcb7df227e8d625c6ee4a831d716b8b69398e4431ec14f89951fdc25"

所以我有事務雜湊。並且應該已經為與我的帳戶關聯的地址創建了一個新的廣告系列。但是當我嘗試呼叫“checkGoalReached”函式時,我總是得到“真”,儘管對於我的競選活動,它應該返回假,因為沒有人做出貢獻。

(我嘗試了 0 和 1,因為它基於 id)

> contract.checkGoalReached.call(0)
true
> contract.checkGoalReached.call(1)
true

然後我嘗試發送事務並記錄此函式的結果:

> contract.checkGoalReached(0, function(e, result) {console.log(result)})
0xe1bf7a275a62fb3bc2cdd12ff280cde5e9064ddbfeb51ba6713a713cd356c8cc
undefined
> contract.checkGoalReached(1, function(e, result){console.log(result)})
0x613c5973733cde57d4b7325bbab2d841d2fa6c95e371e77ca24a2f5a54768fd3
undefined

應該返回“false”,所以我一定是在 web3 控制台中做錯了什麼。在控制台中測試這些功能的正確方法是什麼?

我在 Remix 中玩弄了你的契約,以確認它確實做到了它似乎在做的事情。由於資料結構,它有一些意想不到的行為。例如,對於任何未定義的合約,它都會返回true因為0不小於0.

所謂“緊”,我的意思是對一個不存在的活動進行調查throw,而不是返回一個誤導性的結果。您可能會考慮使用帶有索引的映射結構來收緊它。(Solidity 是否有很好解決且簡單的儲存模式?)。

無論如何,我確認它會false按預期返回一個全新的廣告系列,目標是100. 這與您呼叫它的結果不同,我認為這與嘗試同步使用它有關。

基本上,您必須等待結果,否則會誤導。例如:

var contract;
MyContract.deployed().then(function(instance) { contract = instance; });

現在您可以繼續contract表示已部署的契約。您需要等待承諾返回,因此,請嘗試以下方式:

contract.checkGoalReached().call(0).then(function(response) { console.log(response); });

我假設你正在使用 Truffle。:-)

希望能幫助到你。

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