Tokens

帶有erc20介面的buytoken功能

  • March 25, 2019

我正在學習一個可以購買 erc20 代幣的教程,現在我被困在將代幣轉移到買家賬戶中,我需要更多說明。所以基本上,買家賬戶正在嘗試購買一些代幣。就是這樣。

例如,有一個實現 erc20 功能的合約

contract DappToken {
   //...
   mapping(address => uint256) public balanceOf;

   function DappToken (uint256 _initialSupply) public {
       balanceOf[msg.sender] = _initialSupply;
       totalSupply = _initialSupply;
   }

   function transfer(address _to, uint256 _value) public returns (bool success) {
       require(balanceOf[msg.sender] >= _value);

       balanceOf[msg.sender] -= _value;
       balanceOf[_to] += _value;

       Transfer(msg.sender, _to, _value);

       return true;
   }
}

還有另一個合約將DappToken合約作為其建構子的參數。

contract DappTokenSale {
//...

   function DappTokenSale(DappToken _tokenContract, uint256 _tokenPrice) public {
       admin = msg.sender;
       tokenContract = _tokenContract;
       tokenPrice = _tokenPrice;
   }

   function buyTokens(uint256 _numberOfTokens) public payable {
       require(msg.value == multiply(_numberOfTokens, tokenPrice));
       require(tokenContract.balanceOf(this) >= _numberOfTokens);
       require(tokenContract.transfer(msg.sender, _numberOfTokens));

       tokensSold += _numberOfTokens; 

       Sell(msg.sender, _numberOfTokens);
   }
}

這是我的問題,買家如何通過低於buyTokens功能要求?

require(tokenContract.transfer(msg.sender, _numberOfTokens));

我的理解是..

  1. 當買方嘗試購買代幣時,它將呼叫合約中的transfer函式,DappToken傳遞買方的帳戶地址(msg.sender)和要購買的代幣數量(_numberOfTokens)。
  2. transfer契約中的功能DappToken將檢查買方是否有現有餘額。require(balanceOf[msg.sender] >= _value);

但我不明白為什麼要檢查買家是否有現有餘額?如果這是買家第一次購買代幣怎麼辦?那麼買家最初不會有現有的代幣在balanceOf變數中。

還是msg.senderintransfer函式 aDappTokenSale的合約地址?

讓我解釋一下,但首先,當一個contract呼叫另一個函式的任何函式時contractmsg.sender將是呼叫函式的地址。現在讓我解釋以下內容。當買家想要購買代幣時,他會致電:

  function buyTokens(uint256 _numberOfTokens) public payable {
       require(msg.value == multiply(_numberOfTokens, tokenPrice));
       require(tokenContract.balanceOf(this) >= _numberOfTokens);
       require(tokenContract.transfer(msg.sender, _numberOfTokens));

       tokensSold += _numberOfTokens; 

       Sell(msg.sender, _numberOfTokens);
   }

如指示買方將指定他想購買多少代幣_numberOfTokens。由於功能是payable買方需要在呼叫的同時發送一些乙太幣,這將由 指示msg.value,首先檢查隨呼叫發送的乙太幣是否等於代幣的實際數量。第二行會讓你感到困惑。

this是智能合約本身的地址,tokenContract.balanceOf(this)正在從合約中檢查DappTokenSale合約賬戶的餘額DappToken。換句話說,DappTokenSale裡面有多少餘額DappToken,它應該等於或大於_numberOfTokens(第2行)。

最後,第三行呼叫了一個以(買家地址)為參數的transfer函式,如下函式所示:DappToken``msg.sender``to``_numberOfTokens``value

function transfer(address _to, uint256 _value) public returns (bool success) {
       require(balanceOf[msg.sender] >= _value);

       balanceOf[msg.sender] -= _value;
       balanceOf[_to] += _value;

       Transfer(msg.sender, _to, _value);

       return true;
   } 

現在,第一行msg.sender屬於DappTokenSale合約地址並且_value_numberOfTokens並且檢查DappTokenSale餘額是否大於或等於_numberOfTokens。然後在以下幾行中只是將帳戶轉移到_numberOfTokens帳戶。DappTokenSale``buyer

注意:合約也是賬戶,可以視為地址。合約賬戶也可以有另一個合約的餘額。地址沒有餘額檢查buyer。在上面的範例DappTokenSale中,充當sender從 向買家發送代幣的角色DappToken

希望它會清楚。

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