帶有erc20介面的buytoken功能
我正在學習一個可以購買 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));
我的理解是..
- 當買方嘗試購買代幣時,它將呼叫合約中的
transfer
函式,DappToken
傳遞買方的帳戶地址(msg.sender
)和要購買的代幣數量(_numberOfTokens
)。transfer
契約中的功能DappToken
將檢查買方是否有現有餘額。require(balanceOf[msg.sender] >= _value);
但我不明白為什麼要檢查買家是否有現有餘額?如果這是買家第一次購買代幣怎麼辦?那麼買家最初不會有現有的代幣在
balanceOf
變數中。還是
msg.sender
intransfer
函式 aDappTokenSale
的合約地址?
讓我解釋一下,但首先,當一個
contract
呼叫另一個函式的任何函式時contract
,msg.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
。希望它會清楚。