1. 程式人生 > >區塊鏈學堂(14):Browser-solidity 5–Token基於賬戶的代幣合約

區塊鏈學堂(14):Browser-solidity 5–Token基於賬戶的代幣合約

基於賬戶地址的Token合約

pragma solidity 0.4.9;
contract Token {
  mapping (address => uint) public balancesOf;
  function Token() {
    balancesOf[msg.sender] = 10000;
  }
}

mapping 關鍵詞的定義

Mapping types are declared as mapping(_KeyType => _ValueType). Here _KeyType can be almost any type except for a mapping, a dynamically sized array, a contract, an enum and a struct. _ValueType can actually be any type, including mappings.

Mappings can be seen as hashtables which are virtually initialized such that every possible key exists and is mapped to a value whose byte-representation is all zeros: a type’s default value. 引用自here

address的定義:

address: Holds a 20 byte value (size of an Ethereum address). Address types also have members and serve as base for all contracts.
members of addresses: balance

 and send
引用自here

這裡的address簡單地說就是geth中的賬戶的地址(公鑰)
因此此處的程式碼mapping (address => uint) balancesOf 代表定義了一個 key為address型別, value為uint型別的hashtable,名字為 balancesOf.

所以任何在區塊鏈私鏈上的賬戶都可以通過balancesOf[address] 來查詢他們的代幣數量。

msg 的定義

msg就是指誰呼叫該智慧合約時候發來的資訊,之前說過智慧合約也是一個賬戶。因此在以太坊中呼叫智慧合約從底層看來就是一個賬戶給智慧合約賬戶傳送了一個transaction,裡面包含了誰傳送的,傳送了多少以太幣,傳送了多少gas
下面是msg的一些變數

msg.data (bytes): complete calldata
msg.gas (uint): remaining gas
msg.sender (address): sender of the message (current call)
msg.sig (bytes4): first four bytes of the calldata (i.e. function identifier)
msg.value (uint): number of wei sent with the message 引用自here

最主要的就是msg.sender,代表那個賬戶呼叫該智慧合約。msg.value

  • 因此balancesOf[msg.sender] = 10000; 代表給msg.sender也就是建立該合約的地址賦予一個初始值 10000;

一個帶transfer & 挖礦的Token合約

pragma solidity 0.4.9;
contract Token {
  mapping (address => uint) public balancesOf;
  address public owner;
  function Token() {
    owner = msg.sender;
    balancesOf[msg.sender] = 10000;
  }

  function transfer(address _to, uint _value) {
    if (balancesOf[msg.sender] < _value) throw; //避免轉移出去的代幣超過當前的存貨
    if (balancesOf[_to] + _value < balancesOf[_to]) throw; //避免自己呼叫自己,或者遞迴呼叫
    balancesOf[msg.sender] -= _value;
    balancesOf[_to] += _value;
  }

  function mint(uint _amount) {
    balancesOf[owner] += _amount;
  }
}
  • 在上面的程式碼中,我們設定一個public owner, 儲存下建立合約的msg.sender, 記錄下建立者的地址。
  • function transfer()中,我們設定了兩個條件,避免轉移出去的代幣超過存貨的情況,以及自己轉移給自己的問題。
  • function mint()中,我們給合約的owner增加我們定義的代幣。從而讓其方便的分給別人。
以上合約程式碼在Browser-solidity上除錯通過,檢視下圖

  • 我們在程式碼中將owner = msg.sender,因此owner就是建立合約的地址。我們可以看到balancesOf[owner] 的資料為10000,和程式碼相同。

  • 呼叫方法mint(500),自動給balancesOf[owner] += 500;檢視存額從10000增加到10500.

  • 呼叫方法 transfer("0xccccc",300), 可以看到owner的存額減少300,balancesOf[“0xccccc”]增加300.

這個合約實現了最簡化的代幣功能,但在browser-solidity中我們可以看到一個很明顯的問題,那就是沒有和我們在第二部分中所搭建的geth中的幾個以太坊賬號結合起來。

下一章我們將介紹另一個非常有用的工具Mist,從而將智慧合約、Geth、Mist結合起來。真正在以太坊私有鏈上執行智慧合約。

QQ群:559649971 (區塊鏈學堂粉絲群)
個人微信:steven_k_colin

獲取最新區塊鏈諮詢,請關注《以太中文網》微信公眾號:以太中文網