首先安装go环境 https://golang.org/dl/ 直接用安装包安装。
完成后看下
go env
然后关注下gopath路径,
GOPATH="/Users/MacPro/box/
我们要把go版客户端放这里,go编译器执行都是去设定好的目录执行。以后写go的时候项目也要放这里。
下载go版以太坊客户端
git clone https://github.com/ethereum/go-ethereum
cd go-ethereum
make geth
编译成功以后开始以太坊本地测试
先用命令看下,是否成功,
build/bin/geth -h
如果直接用geth 需要做下环境变量
export PATH=$PATH:/全路径/build/bin/geth
开始搭建私有测试链
1 找一个目录存放挖矿数据 /home/vagrant/
2 创建创世块配置文件
vim genesis.json
{
"config": {
"chainId": 1024,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"nonce": "0x0000000000000042",
"difficulty": "0x020000",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x0000000000000000000000000000000000000000",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
"gasLimit": "0xffffffff",
"alloc": {}
}
3 初始化配置
geth --datadir data init genesis.json
4 启动节点
geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console
各参数代表的含义如下:
networkid 设置当前区块链的网络ID,用于区分不同的网络,1表示公链
rpc 表示启动rpc通信,可以进行智能合约的部署和调试
console 表示启动命令行模式,可以在Geth中执行命令
执行成功后将进入区块链的JavaScript控制台环境
5 Geth JavaScript控制台环境使用说明
创建新账号
personal.newAccount() 或 personal.newAccount("123456")
查看节点信息
admin.nodeInfo
挖矿
开始挖矿 miner.start(1)
停止挖矿 miner.stop()
查看当前矿工账号
eth.coinbase
默认为第一个账户
修改矿工账号
miner.setEtherbase(eth.accounts[1])
查看账户信息
eth.accounts[0]
查看账户余额
eth.getBalance(eth.accounts[0]) 或者 web3.fromWei(eth.getBalance(eth.accounts[0]), "ether")
解锁账号
personal.unlockAccount(eth.accounts[0])
使用账户资金前都需要先解锁账号
转账eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(3,"ether")})
使用txpool.status
可以看到交易状态
查看区块数据
eth.blockNumber
eth.getTransaction("0x0c59f431068937cbe9e230483bc79f59bd7146edc8ff5ec37fea6710adcab825")
eth.getBlock(1)
通过区块号查看区块
可以开一个窗口挖矿,再开一个窗口做交易。
build/bin/geth attach ipc:/Users/MacPro/go_project/src/github.com/ethereum/go-ethereum/data/geth.ipc
6 智能合约
创建一个solidity 编写的 Token.sol 文件,内容如下:
contract Token {
address issuer;
mapping (address => uint) balances;
event Issue(address account, uint amount);
event Transfer(address from, address to, uint amount);
function Token() {
issuer = msg.sender;
}
function issue(address account, uint amount) {
if (msg.sender != issuer) throw;
balances[account] += amount;
}
function transfer(address to, uint amount) {
if (balances[msg.sender] < amount) throw;
balances[msg.sender] -= amount;
balances[to] += amount;
Transfer(msg.sender, to, amount);
}
function getBalance(address account) constant returns (uint) {
return balances[account];
}
}
这份代码实现了一个简单的Token合约功能。
issue 函数可以向账户直接存放token
transfer 函数可以向其他账号发送token
getBalance 函数可以获取某个账号的token余额
从这个合约就能了解到,erc20协议就是在以太坊上存一个数字,然后加减所谓交易,其他的其实也做不了更多。
7部署合约
先到http://remix.ethereum.org/上编译测试合约,会生成一个web3格式的部署代码
先解锁
personal.unlockAccount(eth.accounts[0])
点击details 左边WEB3DEPLOY下代码复制到geth窗口
然后贴代码回车
成功以后 执行 token 看下abi数据
开始执行合约方法
此时挖矿程序要一直工作
>token.issue(eth.accounts[0],30,{from: eth.accounts[0]})
"0xae0fafd672cfcbaf3bf717a2dee49db3017d4da87cb3e087f2b3e2f28f933cf7"
>token.getBalance(eth.accounts[0])
100
> token.transfer(eth.accounts[1], 30, {from: eth.accounts[0]})
"0x0df5fb59e8c96cb0884db40163f50fba9d65ad6e03080c21ba7d9fc2ca9663f0"
> token.getBalance(eth.accounts[1])
30