部署代币合约

部署代币合约

参考教程

参考合约2:0Happys

以下为参考教程的合约搭建

合约编写

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
pragma solidity ^0.4.24; // wallet 只能支持到这个版本

// 这个版本只能以合约的形式创建接口
contract tokenRecipient { function receiveApproval(address _from, uint256 _value, address _token, bytes _extraData) public; }

// 代币合约
contract iiToken {
string public name = "iiToken"; // 代币全名
string public symbol = "ii"; // 代币简称
uint public initialSupply = 1000; // 代币数量
uint public decimals = 2; // 代币数量小数点后有几位
uint public totalSupply = initialSupply * 10 ** decimals; // 根据上面2个值计算的代币总量

// 存放每个地址的金额,例如 map{"0xA":"200","0xB":"300"}
mapping (address => uint256) public balanceOf;

// 存放每个地址的代理人的金额,例如 map{"0xA":{"0xB":100}}
// 可以这么理解:A的钱包有200元,他授权给B可以用他钱包里的100元
mapping (address => mapping (address => uint256)) public allowance;

// 事件,用来通知客户端交易发生
event Transfer(address indexed from, address indexed to, uint256 value);

// 事件,用来通知客户端代币被消费
event Burn(address indexed from, uint256 value);

// 构造器,构建合约的时候会调用,将钱赋值给创建者
constructor() public {
balanceOf[msg.sender] = totalSupply; // map{"0xA":1000.00}
emit Transfer(address(0), msg.sender, totalSupply); // 需要使用 emit 表示提交事件
}

// 代币交易转移的内部实现
function _transfer(address _from, address _to, uint _value) internal {
// 确保目标地址不为0x0,因为0x0地址代表销毁
require(_to != 0x0);
// 检查发送者余额
require(balanceOf[_from] >= _value);
// 确保接受者收的钱不是负数
require(balanceOf[_to] + _value > balanceOf[_to]);

// 计算一下交易前的双方总数
uint previousBalances = balanceOf[_from] + balanceOf[_to];
// 减去发送者的钱
balanceOf[_from] -= _value;
// 加上接受者的钱
balanceOf[_to] += _value;
// 广播交易
emit Transfer(_from, _to, _value);

// 用assert来检查代码逻辑。检查金额后是否与未交换钱总数一样
assert(balanceOf[_from] + balanceOf[_to] == previousBalances);
}

/**
* 代币交易转移
* 从自己(创建交易者)账号发送`_value`个代币到 `_to`账号
* ERC20标准
* @param _to 接收者地址
* @param _value 转移数额
*/
function transfer(address _to, uint256 _value) public {
_transfer(msg.sender, _to, _value);
}

/**
* 账号之间代币交易转移
* ERC20标准
* @param _from 发送者地址
* @param _to 接收者地址
* @param _value 转移数额
*/
function transferFrom(address _from, address _to, uint256 _value) public returns (bool success) {
require(_value <= allowance[_from][msg.sender]); // Check allowance
allowance[_from][msg.sender] -= _value;
_transfer(_from, _to, _value);
return true;
}

/**
* 设置某个地址(合约)可以创建交易者名义花费的代币数。
*
* 允许发送者`_spender` 花费不多于 `_value` 个代币
* ERC20标准
* @param _spender The address authorized to spend
* @param _value the max amount they can spend
*/
function approve(address _spender, uint256 _value) public
returns (bool success) {
allowance[msg.sender][_spender] = _value;
return true;
}

/**
* 设置允许一个地址(合约)以我(创建交易者)的名义可最多花费的代币数。
*-非ERC20标准
* @param _spender 被授权的地址(合约)
* @param _value 最大可花费代币数
* @param _extraData 发送给合约的附加数据
*/
function approveAndCall(address _spender, uint256 _value, bytes _extraData)
public
returns (bool success) {
tokenRecipient spender = tokenRecipient(_spender);
if (approve(_spender, _value)) {
// 通知合约
spender.receiveApproval(msg.sender, _value, this, _extraData);
return true;
}
}

/**
* 销毁我(创建交易者)账户中指定个代币
*-非ERC20标准
*/
function burn(uint256 _value) public returns (bool success) {
require(balanceOf[msg.sender] >= _value); // Check if the sender has enough
balanceOf[msg.sender] -= _value; // Subtract from the sender
totalSupply -= _value; // Updates totalSupply
emit Burn(msg.sender, _value);
return true;
}

/**
* 销毁用户账户中指定个代币
*-非ERC20标准
* Remove `_value` tokens from the system irreversibly on behalf of `_from`.
*
* @param _from the address of the sender
* @param _value the amount of money to burn
*/
function burnFrom(address _from, uint256 _value) public returns (bool success) {
require(balanceOf[_from] >= _value); // Check if the targeted balance is enough
require(_value <= allowance[_from][msg.sender]); // Check allowance
balanceOf[_from] -= _value; // Subtract from the targeted balance
allowance[_from][msg.sender] -= _value; // Subtract from the sender's allowance
totalSupply -= _value; // Update totalSupply
emit Burn(_from, _value);
return true;
}
}

安装 Ethereum Wallet 钱包

参考Geth使用教程(windows)文档的“Ethereum-Wallet的使用”部分。

使用 Wallet 部署合约

打开钱包软件

1
'.\Ethereum Wallet.exe' --rpc http://192.168.105.215:8545

确保节点有能用的账户,并且该账户有以太币

点击右上角的CONTRACTS切换至合约页面,点击DEPLOY NEW CONTRACT部署新合约

SOLIDITY CONTRACT SOURCE CODE框中粘贴上面的合约代码,在右侧下拉框中选中ii Token,点击DEPLOY即可,合约会在12个区块确认后部署成功。

部署成功后可在合约页面查看到该代币合约,点进去,可以看到当前合约详情地址以及abi以及对应合约读取的Read From Contract和调用合约方法的Write To Contract

可以在wallet页面进入有代币的账户 或者 Write To Contract选中Transfer进行代币转账

在浏览器添加 Token 显示

打开浏览器路径下的public/token.json

添加json数据

1
2
3
4
5
6
7
8
, //注意这个是json数组,需要用,号隔离每个元素
{
"address":"0x2961316bFe687987F45F3f290C697E5f22f7a586", //合约地址
"symbol":"ii", //代币简称
"name": "iiToken", //代币全称
"decimal":2, //代币精度
"abi": 这里粘贴合约页面左侧的show interface,也就是代币合约的abi
}

添加完成后,重启浏览器即可

  • 注:浏览器代币报filter错误,请参考浏览器搭建文档的错误处理
-------------------本文结束 感谢您的阅读-------------------
0%