Go-Ethereum
Web3:執行合約功能但只接收交易雜湊或錯誤值
我正在嘗試在我自己的 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。:-)
希望能幫助到你。