本次的範例simple token,是Solidity document上其中一個example,筆者覺得這個example在解釋所謂Token概念是比較直白的,雖然跟真實ERC20 Protocol所建立的Token比起來,在真實交易邏輯上還相差很遠,安全性也不夠,不過在語法上有使用到一些常用且特殊的solidity語法,會是比較好說明的範例之一。
Simple Token smart contract主要提供三個功能 創建token數量、查詢指定用戶token餘額、傳送token給指定用戶
Simple Token reference
pragma solidity^0.4.25;
contract SimpleToken{
address owner;
uint public totalSupply;
mapping(address => uint) balances;
constructor(uint _initialSupply)public{
totalSupply = _initialSupply;
owner = msg.sender;
balances[owner] = totalSupply
}
function balanceOf(address _someone)public view returns(uint){
return balances[_someone];
}
function transfer(address _to,uint _value) public return(bool){
require(_value > 0);
require(balances[msg.sender] >= _value);
balances[msg.sender] -= _value;
balances[_to] += _value;
return true;
}
}
address owner
address
type 代表blockchain帳戶的型別,格式為 20 bytes (40個字元)所組成
uint public totalSupply;
uint
為 unsign integer的意思,也就是沒有負數符號的整數,在solidity uint預設值為uint256 = 2**256
;public
在solidity代表這個function 可以被外部、內部呼叫或者是繼承。
mapping(address=>uint)balances;
mapping
為映射的意思,以key-value的形式紀錄資料,小弟習慣把它形容是在solidity 的JSON object,以這個例子解釋balances = {address type : uint type}
,balance中文意思為餘額,在這個contract代表的意義就是指address有多少token,也就是這個address對應的數字為多少
constructor(uint _initialSupply)
constructor是一個function,會在deploy contract的時候同步執行。以目前的例子來看,constructor (uint _initialSupply)
代表要在deploy的時候輸入uint
type的參數,代表這個Token的初始供給量,並且設定deploy contract 的address為owner
function balanceOf(address _someone) { return balances[_someone]; }
balanceOf function 主要功能是查詢指定address 的token餘額,輸入address
type 的參數,return balances[_someone]
回傳某個address所對應的數字
require(_value > 0);
require
為solidity判斷錯誤的語法,只要條件不符合require內的設定,EVM就會回傳ERROR,完整寫法是require(_value > 0,"_value need more than 0")
,在條件後面輸入字串,可以在回傳錯誤時夾帶提示訊息,並回傳剩餘的gas
require(balances[msg.sender] >= _value);
判斷執行transfer function的address,擁有的Token必須大於要傳送的value
balances[msg.sender] -= _value;
balances[_to] += _value;
當所規定的條件都符合時,就會將雙方的所記錄的balances餘額,進行增加token和扣除token的動作