一、合约代码。
官方文档:https://solidity.readthedocs.io/en/develop/index.html
巴比特文档:http://book.8btc.com/books/6/solidity-zh/_book/solidity-example.html
pragma solidity 0.4.16;
contract Token {
mapping (address => uint) public balancesOf;
address public owner;
//这里是创建合约的时候调用。msg.sender就是eth.account[0],也可以改编译后的代码指定。其他地方谁调用msg就是调用者
function Token() {
owner = msg.sender;
balancesOf[msg.sender] = 10000;
}
//msg就是调用者
function transfer(address _to, uint _value) {
//避免转移出去的代币超过当前的存货
if (balancesOf[msg.sender] < _value) revert();
//避免自己调用自己,或者递归调用
if (balancesOf[_to] + _value < balancesOf[_to]) revert();
balancesOf[msg.sender] -= _value;
balancesOf[_to] += _value;
}
function mint(uint _amount) {
balancesOf[owner] += _amount;
}
}
- address:简单地说就是geth中的账户的地址(公钥)
mapping (address => uint) balancesOf
代表定义了一个 key为address类型, value为uint类型的hashtable。在区块链私链上的账户都可以通过balancesOf[address] 来查询某个账户的代币数量。- msg就是指谁调用该智能合约时候发来的信息,智能合约也是一个账户。因此在以太坊中调用智能合约从底层看来就是一个账户给智能合约账户发送了一个transaction,里面包含了谁发送的,发送了多少以太币,发送了多少gas。
下面是msg的一些变量
msg.data (bytes): complete calldata
msg.gas (uint): remaining gas
msg.sender (address):当前发送信息的人
msg.sig (bytes4): first four bytes of the calldata (i.e. function identifier)
msg.value (uint): 发送这个消息花费多少wei 引用自herebalancesOf[msg.sender] = 10000;
代表给msg.sender也就是创建该合约的地址赋予一个初始值 10000; - 在上面的代码中,我们设置一个public owner, 保存下创建合约的msg.sender, 记录下创建者的地址。
- 转账函数
function transfer()
中,我们设置了两个条件,避免转移出去的代币超过存货的情况,以及自己转移给自己的问题。 - 在
function mint()
中,我们给合约的owner增加我们定义的代币。从而让其方便的分给别人。 - 这里编译后的代码指定创建账号(公钥)。
二、solidity浏览器调试代码。
1、点击“Create”按钮后,可以看到owner的地址:
2、把上面的地址复制下来,并且两边加引号。调用balancesOf可以看到有10000.
增加账户余额、转账类似上面的调用。传递响应参数即可,如果是地址参数,需要把公钥加上引号传递。
参考文档:http://www.ethchinese.com/?p=790