Solidity

在 Ethereum Pet Shop 中跟踪所有者和價格

  • March 31, 2019

我一直在關注Ethereum Pet Shop教程,我對所有這些是如何工作的非常著迷。

不過,我有幾個問題。

在我開始之前,這是程式碼:

pragma 可靠性 ^0.4.17;

contract Adoption {
   Pet[16] pets;

   struct Pet {
       address owner;
       uint256 price;
   }

   function returnEth() public payable {
   msg.sender.transfer(msg.value);
   }
   // Adopting a pet
   function adopt(uint petId) public payable returns (uint) {
       require(petId >= 0 && petId <= 15);
       require(msg.value >= pets[petId]['price'] * 0.5);
       pets[petId] = Pet({owner: msg.sender, price: 100});
       return petId;
       //return value;
   }
   // Retrieving the adopters
   function getAdopters() public view returns (Pet[16]) {
       return pets;
   }


}

我了解共有 16 隻寵物,數字 ID 的範圍為 0-15(含)。我也明白只有一個人能夠一次“擁有”一隻寵物。

寵物的目前所有者是不可變的嗎?如果是這樣,我該如何更改此屬性?

假設使用者“購買”了一隻寵物後,我想將寵物的價格更改為 0.5 * initialPrice,initalPrice目前不存在該價格。然後將合約中剩餘的 eth 餘額返還給第一個買家。這種邏輯會是什麼樣子?

我假設我會initialPrice在契約中的某處聲明一些變數,例如initialPrice等於 wei 中的某個任意值,然後添加類似於以下行的內容:

require(msg.value == initialPrice * .5);

那麼我將如何將剩餘的 eth 歸還給以前的所有者?

如果有任何不清楚的地方,請告訴我。

編輯:我一直在嘗試使用第一個答案的程式碼,但無法編譯契約。我得到的錯誤如下:

Adoption.sol:19:17: TypeError: Type address is not implicitly convertible to expected type struct Adoption.Pet storage ref. pets[petId] = msg.sender; ^--------^

目前所有者不是一成不變的。為了改變它,只需adopt()從不同的地址呼叫函式。

關於價格,如果您想為所有寵物提供相同的價格,您的方法是可行的。為了對不同的寵物有不同的價格,您可以定義 a pet struct,如下所示:

struct Pet {
 address owner;
 uint256 price;
}

而不是像這樣儲存采用者,而是像這樣address[16] public adopters;保存它們:

Pet[16] pets;

然後要求價格大於或等於price * .5並最終提高價格:

require(msg.value >= pets[petId].price * 0.5);
pets[petId].price = pets[petId].price * 0.5;

為了將資金發送給以前的所有者,您可以在設置新所有者之前發送它們:

pets[petId].owner.send(your_amount)

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