pragma solidity 0.4.9;
contract Token {
mapping (address => uint) public balancesOf;
function Token() {
balancesOf[msg.sender] = 10000;
}
}
这里的
address
简单地说就是geth中的账户的地址(公钥)因此此处的代码
mapping (address => uint) balancesOf
代表定义了一个 key为address
类型, value为uint
类型的hashtable,名字为balancesOf
。所以任何在区块链私链上的账户都可以通过
balancesOf[address]
来查询他们的代币数量。msg就是指谁调用该智能合约时候发来的信息,之前说过智能合约也是一个账户。因此在以太坊中调用智能合约从底层看来就是一个账户给智能合约账户发送了一个transaction,里面包含了谁发送的,发送了多少以太币,发送了多少gas。
最主要的就是
msg.sender
,代表哪个账户调用该智能合约。因此balancesOf[msg.sender] = 10000;
代表给msg.sender
也就是创建该合约的地址赋予一个初始值 10000。
pragma solidity 0.4.20;
contract Token {
mapping(address => uint) public balancesOf;
// 设置一个owner, 保存下创建合约的msg.sender, 记录下创建者的地址
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;
}
// 给合约的owner增加我们定义的代币。从而让其方便的分给别人
function mint(uint amount){
balancesOf[owner] += amount;
}
}
在Browser-solidity上运行:
第一个红框处,Token at表示的是智能合约的地址。点击owner显示的是创建合约的账户地址。
将账户地址复制粘贴到红框处查看余额。注意一定要加"",否则显示余额为0。
- 输入金额点击mint为账户增加5000余额。
- 查看余额:15000。
- 向账户"0xccccc"转账7000。
- 查看余额:8000.
参考:区块链学堂(14):Browser-solidity 5–Token基于账户的代币合约
作者:以太中文网