1. 程式人生 > >[區塊鏈]詳解以太坊標準發行通證Token程式碼(技術面看待ICO)

[區塊鏈]詳解以太坊標準發行通證Token程式碼(技術面看待ICO)

/*
This creates a public tradeable fungible token in the Ethereum Blockchain.
https://github.com/ethereum/wiki/wiki/Standardized_Contract_APIs
這是一套標準的具有固定市值的以太坊密碼合約。最新程式碼可以forkgithub的以下標準合約APIs地址。

Unmodified this will create a cryptoasset with a fixed market cap
wholly owned by the contract creator. You can create any function
to change this contract, like allowing specific rules for the issuance,
destruction and freezing of any assets. This contract is intended for
educational purposes, you are fully responsible for compliance with
present or future regulations of finance, communications and the
universal rights of digital beings.
不需要進行修便能建立一個具有固定市值的token。其所有權由合同創造者全權擁有。您可以建立任何功能改變這個合同,比如允許發行的具體規則,破壞和凍結任何資產。本合同適用於教育目的,您完全有責任遵守目前或未來的金融,通訊和管理條例數字生存的普遍權利。

Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
任何人都可以自由複製,修改,釋出,使用,編譯,出售或者以原始碼形式或以編譯形式分發此軟體二進位制,出於任何目的,商業或非商業,以及任何目的手段。

In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
在承認版權法的司法管轄區中,作者或作者本軟體的任何和所有版權利益軟體都將貢獻到公共領域。我們為此付出了我們的努力。根據版權法,此貢獻行為是我們自己的一種公開的行為永遠放棄所有現在和將來的權利軟體。

THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

本軟體按“原樣”提供,不提供任何形式的擔保,明示或暗示,包括但不限於保證
適銷性,針對特定用途的適用性和不侵權。在任何情況下,作者均不對任何索賠,損害或責任負責其他責任,無論是在合同行為,侵權行為還是其他方面,來自,與本軟體或使用有關的或與之相關的軟體中的其他交易。

For more information, please refer to http://unlicense.org
更多資訊請參考http://unlicense.org
*/
/* 定義函式我的通證LekkoToken */
contract LekkoToken {

/* 定義LekkoToken通證的變數包含 字串定義的名稱name,字串定義的識別符號symbol和8位無符號整型位decimals */
string public name;
string public symbol;
uint8 public decimals;

/* 定義了一個數組,用來表徵合約所有餘額的balanceOf */
mapping (address => uint256) public balanceOf;

/* 定義一個區塊鏈上的一個公共事件Transfer來通知客戶,其三個引數包含來源地址,去向地址和數值value */
event Transfer(address indexed from, address indexed to, uint256 value);

/* 通過對函式LekkoToken設定引數如通證總量的無符號256位整數_supply,通證名稱字串_name,通證縮寫字母字串_symbol以及無符號8位整數的代幣精度對整個合約進行初始化 */
function LekkoToken(uint256 _supply, string _name, string _symbol, uint8 _decimals) {

    /* 如果沒有對通證總量_supply進行設定,則預設設定為最小的100萬個通證數量,當然這裡在程式碼裡面可以進行自定義最小數量額度。 */
    if (_supply == 0) _supply = 1000000;

    /* 如果增加其他函式對這些變數進行修改的話,這些定義的通證總量,名稱和識別符號是不會進行變更的*/
    balanceOf[msg.sender] = _supply;
    name = _name;
    symbol = _symbol;

    /* 如果你想要對通證的精度進行更細的分割或者粗放化,你可以在這個定義中進行修改,然後新增基本單位的小數位數  */
    decimals = _decimals;
}
    /* 以下是定義轉賬通證的函式transfer,主要包含傳送目的地地址_to和256位無符號整型_value   */
function transfer(address _to, uint256 _value) {
    /* 根據以太坊規則,如果傳送者傳送超過其本身擁有餘額以上的通證到其他地址取得時候,會判定失敗throw掉。另外,對於傳送目的地的餘額加上獲得的值_value小於傳送目的地的餘額的情況下,也會判定失敗throw掉。第二個邏輯的目的即為傳送的餘額不能為負數。強調下,基本上一些比較低階的安全漏洞通過這個地方進行攻擊。因為有些專案想要設定特定業務的時候,往往會在傳送代幣的邏輯上進行定製化,這樣很容易造成漏洞被攻擊並轉移掉balance。因此要特別小心。   */
    if (balanceOf[msg.sender] < _value) throw;
    if (balanceOf[_to] + _value < balanceOf[_to]) throw;

    /* 這裡是基本邏輯的定義,主要是對通證轉移前後,原有_value的擁有者balanceOf[msg.sender]如果傳送通證成功,應該在總額上減去轉移的通證數量。相應的,通證轉移的接收者balanceOf[_to]應該增加相應的數額_value。從邏輯上來說,如果上述邏輯成功,是不用判定轉移後balanceOf[msg.sender]小於0的情況。如果特定業務邏輯需要修改的時候,對於0的判斷還是很重要的,注意任何漏洞形成的可能。 */
    balanceOf[msg.sender] -= _value;
    balanceOf[_to] += _value;

    /* 對任何監聽此次轉賬的人進行通知,區塊鏈上更多的是通知滿足條件進行此項智慧合約作業的礦工 */
    Transfer(msg.sender, _to, _value);
}

}

整個發幣的合約詳解到此結束。其實可以看出來任何一個核心智慧合約的編寫並不是很難,邏輯其實也很簡單。但是處於安全性的考慮,對於任何需要定製化的智慧合約來說,一定要注意,對通證進行轉賬定義的時候,餘額進出的控制。比較有名的幾次攻擊,尤其是歷史上第一大案DAO的攻擊,都基本問題出在這個地方。有興趣的可以看我之前對DAO詳解的文章。https://blog.csdn.net/lsttoy/article/details/70156527

如果有任何心得也歡迎留言。