Balances
如何創建契約來管理客戶餘額?
我想實現這樣的事情:測試在賬戶之間進行乙太幣轉移的條件。3 個帳戶
我在傳遞函式方面遇到困難。
要以穩固的方式發送 Ether,您只需要執行以下操作:
recipient.transfer(amount);
where
recipient
是類型的變數address
。請注意,這既可以是外部擁有的賬戶(通常是人類),也可以是智能合約。例如,要將合約餘額中的錢匯給交易的發送者,您可以:
msg.sender.transfer(amount);
poly 填充在哪裡
msg.sender
,它是簽署發送到契約的交易的帳戶。您可以在文件中閱讀更多相關資訊:
沒有辦法寫一份契約來從別人的賬戶中消費。合約可以接收資金、持有資金、賬戶資金和發送資金。
ATM 可能是最簡單的支架。“客戶”可以存取資金。資金在 ATM 內“混合”,其中有一個總計(手頭資金又名
address(this).balance
)。ATM 的工作是處理會計,因此它會釋放所有欠個人的錢,但不會超過應有的金額。pragma solidity 0.4.25; contract ATM { mapping(address => uint) public balances; // balances of all users event LogDeposit(address sender, uint amount); event LogWithdrawal(address receiver, uint amount); // send money to the contract function depositFunds() public payable returns(bool success) { // we accept all funds require(msg.value > 0); // needs to make sense balances[msg.sender] += msg.value; // credit the sender account emit LogDeposit(msg.sender, msg.value); // emit event return true; // return success } // take money from the contract function withdrawFunds(uint amount) public returns(bool success) { require(amount > 0); // needs to make sense require(balances[msg.sender] >= amount); // requester is owed money? balances[msg.sender] -= amount; // debit requester account emit LogWithdrawal(msg.sender, amount); // emit event msg.sender.transfer(amount); // send funds return true; // return success } }
如果不清楚,這
public
mapping
意味著任何人都可以檢查欠任何地址的餘額。這意味著 Alice 和 Bob 可以檢查合約持有的資金。他們可以使用該withdrawFunds()
功能提取資金。如果您想要一個合約來調解 Alice 和 Bob 之間的交易,您需要 Alice 和 Bob 將資產轉移到合約的安全保管中。然後,當觸發事件發生時,更新內部會計。出於技術原因,通常最好使用 ATM 範例中的“提款模式”。如果 Alice 和 Bob 想從合約中刪除資金,他們將與合約互動以請求他們的資金。
希望能幫助到你。