一般来说有这些用法
1. Address a = msg.sender //谁调用合约
2. Address b = this //当前合约的地址
Address类型的方法:
1. Balance
2. Transfer
Mapping是一种Hashtable,由一个key对应一个value
定义方式主要常见的有
• Mapping (bytes32 => uint) a;
• Mapping (address => uint) b;
一般怎么用Mapping?(address=>数据类型)用户注册、金额纪录
代码示例一:
Step 1: 首先是定义一个mapping(bytes32=>uint) public balances
pragma solidity 0.4.10;
contract demo{
mapping (bytes32 => uint)public balances;
}
Step 2: 添加一个构造函数
pragma solidity 0.4.10;
contract demo{
mapping (bytes32 => uint)public balances;
function demo() {
balances["steve"]= 100;
balances["nathan"]= 1000;
}
}
Step 3: 添加一个方法 Add()
function add(bytes32 usr,uintamount) {
balances[usr] += amount;
}
Step 4: 添加一个 update()
function update(bytes32 usr,uint amount) {
balances[usr] = amount;
}
Step 5: 添加一个 del()
function del(bytes32 usr) {
balances[usr] = 0;
}
示例2:
我们通过mapping (bytes32 => uint) public balances;
实现了一个简单的mapping的hashtable. 但这样的hashTable无法部署在geth上面,也无法完成互相之间的代币转化。
撰写一个简单的合约
- Step 1: 创建一个基础合约
pragma solidity 0.4.7;
contract Coin {
address public minter;
mapping (address => uint) public balances;
}
这里我们定义了一个address 作为key, uint做为value的hashTable balances; 我们还定义了一个address的变量minter;
- Step 2: 添加一个构造函数Coin()
function Coin() {
minter = msg.sender;
}
这里的代码minter = msg.sender; 代表创建这个合约的账户地址,被赋值给变量minter.
- Step 3: 添加一个挖矿合约
function mint(address receiver, uint amount) { if (msg.sender != minter) throw; balances[receiver] += amount; }
这里的核心代码在于,如果调用这个方法的账户,不是minter, 也就是创建合约的账户的话,这个mint()
将无法被执行。 只有是创建合约的账户,也就是minter
才可以执行它
- Step 4: 添加一个function send() 也就是从A转移X代币到B账户。代码如下:
function send(address receiver, uint amount) { if (balances[msg.sender] < amount) return; balances[msg.sender] -= amount; balances[receiver] += amount; }
这个非常简单的转移货币的代码,也就是说msg.sender减少一定代币,接受者receiver增加一定代币
- Step 5: 定义一个事件 Sent()
event Sent(address from, address to, uint amount); function send(address receiver, uint amount) { if (balances[msg.sender] < amount) return; balances[msg.sender] -= amount; balances[receiver] += amount; Sent(msg.sender, receiver, amount); }
完整代码如下:
pragma solidity 0.4.7;
contract Coin {
address public minter;
mapping (address => uint) public balances;
event Sent(address from, address to, uint amount);
function Coin() {
minter = msg.sender;
}
function mint(address receiver, uint amount) {
if (msg.sender != minter) throw;
balances[receiver] += amount;
}
function send(address receiver, uint amount) {
if (balances[msg.sender] < amount) return;
balances[msg.sender] -= amount;
balances[receiver] += amount;
Sent(msg.sender, receiver, amount);
}
}