Solidity

在智能合約中接受乙太幣

  • January 17, 2019

我想創建一個簡單的智能合約,用於將使用者註冊到比賽中,當使用者可以支付契約費用時,將從他的帳戶中扣除 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)增加合約中的乙太幣。

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