您好,登錄后才能下訂單哦!
這篇文章主要講解了“ERC20代幣合約怎么實現”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“ERC20代幣合約怎么實現”吧!
ERC20是Fabian Vogelsteller在2015年末提出的以太坊改進建議,它是許多流行的合約都在遵循的標準。 ERC20使通證智能合約的行為非常類似于傳統的加密貨幣,例如在不同賬戶之間發送和接收、 查看通證總供應量或者查看某個地址可用的通證余額,就像比特幣或以太幣一樣。這類似于用以太坊錢包 發送和接收以太幣、查看流通中的以太幣總量、查看特定錢包的貨幣余額等。
ERC20定義了一些標準的接口函數:balanceOf 、 totalSupply 、transfer 、transferFrom 、approve和allowance 。 以及一些可選的字段,例如通證名稱、符號以及小數保留位數等。你可以在github 查看ERC-20全文。
下面的代碼聲明一個簡明的ERC20智能合約:
contract ERC20 { function totalSupply() constant returns (uint theTotalSupply); function balanceOf(address _owner) constant returns (uint balance); function transfer(address _to, uint _value) returns (bool success); function transferFrom(address _from, address _to, uint _value) returns (bool success); function approve(address _spender, uint _value) returns (bool success); function allowance(address _owner, address _spender) constant returns (uint remaining); event Transfer(address indexed _from, address indexed _to, uint _value); event Approval(address indexed _owner, address indexed _spender, uint _value); }
合約中每個字段的描述及示例如下。
盡管與比特幣一樣,通證供給總量可以很容易地固定下來,但此函數允許合約實例計算 并返回存在于流通中的通證總量。
contract MyERCToken { //在本示例中,通證供給量是固定的,但也可以將其設定為可修改的 uint256 _totalSupply = 1000000; function totalSupply() constant returns (uint256 theTotalSupply) { //函數聲明中已經定義了返回變量theTotalSupply theTotalSupply = _totalSupply; return theTotalSupply; } }
該函數允許智能合約返回指定賬戶地址的通證余額。 該函數接受一個地址作為參數, 所以任何地址的通證余額都是公開的。
contract MyERCToken { //創建映射表來記錄賬戶余額 mapping(address => uint256) balances; // Owner of this contract //合約擁有者 address public owner; function balanceOf(address _owner) constant returns (uint256 balance) { //返回指定地址的通證余額 return balances[_owner]; } }
此函數的調用方授權給定的地址可以從其地址中提款。
在這里,以及后面的代碼片段中,你可能會看到一個變量msg 。 這是由外部應用程序(如錢包)提供 的隱含字段,以便更好地與合約進行交互。 以太坊虛擬機(EVM)允許我們使用該字段來存儲和處理 由外部應用程序提供的數據。
在這個例子中, msg.sender是合約方法調用方的地址。
contract MyERCToken { //創建映射表記錄通證持有者、被授權者以及授權數量 mapping(address => mapping (address => uint256)) allowed; function approve(address _spender, uint256 _amount) returns (bool success) { allowed[msg.sender][_spender] = _amount; //當授權時觸發Approval事件 Approval(msg.sender, _spender, _amount); return true; } }
該函數讓調用方將指定數量的通證發送到另一個地址,就像加密貨幣交易一樣。
contract MyERCToken { mapping(address => uint256) balances; //返回值為true時,表示轉賬成功 function transfer(address _to, uint256 _amount) returns (bool success) { //如果發送方有足夠的資金并且發送數量非0 ,則發送給指定地址 if (balances[msg.sender] >= _amount && _amount > 0 && balances[_to] + _amount > balances[_to]) { balances[msg.sender] -= _amount; balances[_to] += _amount; //觸發Transfer事件 Transfer(msg.sender, _to, _amount); return true; } else { return false; } } }
該函數允許智能合約自動執行轉賬流程并代表所有者發送給定數量的通證。
看到這的時候你可能會有點困惑:為什么有了transfer(),還需要transferFrom()?。
回一下在日常生活中,通過轉賬來支付賬單的情況。 通常你需要自己去辦轉賬匯款來支付賬單,這 就像使用transfer() :你需要自己執行,沒有其他人的幫助。
在另一種情況下,你可以與銀行簽訂自動代支付協議。 這就像使用transferFrom() : 銀行的機器會自動以你的名義進行轉賬支持。 有了這個函數,合約就可以代表你自動 發送通證到另一個地址,而無需你的干預。
contract MyERCToken { mapping(address => uint256) balances; function transferFrom(address _from, address _to, uint256 _amount) returns (bool success) { if (balances[_from] >= _amount && allowed[_from][msg.sender] >= _amount && _amount > 0 && balances[_to] + _amount > balances[_to]) { balances[_from] -= _amount; balances[_to] += _amount; Transfer(_from, _to, _amount); return true; } else { return false; } } }
name
是一個可選字段,但許多流行的通證都定義了這個字段,以便像Mist和MyEtherWallet 這樣的錢包能夠識別它們:
contract MyERCToken { string public constant name = "My Custom ERC20 Token"; }
symbol
是另一個用于標識通證的可選字段,通常采用三到四個字母的縮寫,就像BTC、ETH、AUG或SJCX一樣,
contract MyERCToken { string public constant symbol = "MET"; }
這是一個可選字段,用于確定通證數量的小數位數。 最常見的小數位數是18。
contract MyERCToken { uint8 public constant decimals = 18; }
這個ERC20通證的源代碼可以在Github找到。
ERC20標準開辟了一套新的智能合約,可以像比特幣或以太坊一樣創建和分發,而且, 這些代幣可以在交易所托管,像其他資產一樣進行交易,因此投資者也可以輕松地購買和出售這些代幣。
感謝各位的閱讀,以上就是“ERC20代幣合約怎么實現”的內容了,經過本文的學習后,相信大家對ERC20代幣合約怎么實現這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。