Solidity
在智能合約中接受乙太幣
我想創建一個簡單的智能合約,用於將使用者註冊到比賽中,當使用者可以支付契約費用時,將從他的帳戶中扣除 2 個乙太幣。但是當我試圖在我的本地 ganache 區塊鏈上這樣做時,只會扣除 gas 價格。
但我對如何接受從乙太坊網路賬戶到契約的付款感到困惑。
幫我..
這是程式碼
pragma solidity >=0.4.22; contract dCoders { // variables // storing contract_amount collected for the event address public owner; uint public regFee; mapping (address => uint) public balance; constructor() public { owner = msg.sender; regFee = 2 ether; } event reg(address indexed _from); // register a user in the event function register() payable public { // emit reg(_sender, owner, regFee); balance[msg.sender] -= regFee; balance[address(this)] += regFee; emit reg(msg.sender); } // distribute the amount collected to winners // register a sponser in the event }
pragma solidity >=0.4.22; contract dCoders { //variables //storing contract_amount collected for the event address public owner; uint public regFee; mapping (address => uint) public balance; constructor() public { owner = msg.sender; regFee = 2 ether; } event reg(address indexed _from); //register a user in the event function register() payable external { require(msg.value == 2 ether); balance[address(this)] += regFee; emit reg(msg.sender); } //distribute the amount collected to winners //register a sponser in the event }
假設此時您只需要草稿,就在這裡。
1)您不需要為您的使用者減少任何餘額:當他向您發送乙太幣並且您接受它們時,它會自動完成。“餘額”映射只是一個本地到你的合約變數。它是由您編寫的,以便您閱讀
2)你可以呼叫你的函式“註冊”或者你可以避免命名它。
function () payable external { ... }
這樣,您的使用者必須在不呼叫任何內容的情況下向合約發送 2 個乙太幣。這樣他就可以使用任何錢包來做到這一點。
只是為了幫助你開始……😉
在 Ethere 中接受付款只需要一個帶有
payable
關鍵字的函式。正如 Rick 提到的,最簡單的方法是有一個備用函式(沒有函式名稱),只要有人將乙太幣發送到合約時就會執行該函式 - 這樣他們就不需要直接呼叫任何函式,他們可以使用正常的乙太幣發送交易在不了解合約功能的情況下。
否則你的用法
balance
是相當..錯誤的。如果我理解正確,您想儲存每個使用者發送的乙太幣數量。在這種情況下,您可能希望將行更改為:balance[msg.sender] = msg.value;
。如果您將其儲存起來,address(this)
您將不會將發件人的地址儲存在任何地方。另一方面,如果您只是嘗試儲存通過線路接收的乙太幣數量,那麼您可以將其刪除。在沒有明確功能的情況下,您總是可以找出合約有多少乙太幣。所以有兩件事是自動的:1)減少發送者的乙太幣 2)增加合約中的乙太幣。