Dapp-Development

將結構添加到區塊鏈中的數組的函式在被另一個函式呼叫時不會執行

  • January 18, 2018

我有一個可能非常基本的問題,但我似乎無法解決問題

function _CreateBike(uint id, uint generation, string model, string ability, uint8 tier) internal returns(Bike){
   Bike memory bike = Bike(id, generation, 1, tier, model, ability, msg.sender);
   garage.push(bike);
   return bike;
}

我上面有這個函式,它創建一個結構並將其推送到一個數組,它按預期工作

function BuyBike(string model, string ability, uint8 tier) public payable costs(basePrice*tier) {
   Bike memory bike = _CreateBike(garage.length, current_generation, model, ability, tier);
   ownedBikes[msg.sender] = [bike.id];
}

但是,當我執行這個呼叫早期函式的函式時,該結構不會被添加到數組中。我認為這與區塊鏈與本地記憶體中的引用變數和儲存有關,但在檢查 stackoverflow 和solidity 文件後,我仍然無法弄清楚如何解決問題。有人可以告訴我發生了什麼嗎?

將評論總結為答案:

問題是costs修飾符,它可能會測試msg.value. 由於在使用 JavaScript VM 時無法(據我所知)將 ether 附加到 Remix 中的事務,因此無法滿足msg.value要求,因此該函式可能是reverted。

添加到 smarx 的答案中,在更像生產的環境中進行測試的一種方法是使用私有網路,wch 可以是 ganache 或 ganache-cli,也可以是使用 geth 建構的自定義私有測試網。我確定還有其他選項,但那些是我使用並且知道工作的選項。

友好的免責聲明:一些私有測試網有它們自己的問題(例如 ganache 不支持 websocket,因此事件不適用於 web3 1.0,帶有 geth 的私有測試網可以有與主網不同的共識算法),所以不要使用它們作為將程式碼發送到主網之前的最終測試,除非您確定您的程式碼將以相同的方式工作。

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