在 Ethereum Pet Shop 中跟踪所有者和價格
我一直在關注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)