开发环境:Linux
目录
环境配置
安装git
安装geth
安装solc
私有节点的创建
创世区块的构建
初始化创世区块
启动节点
创建用户进行挖矿
智能合约的编写和部署
简单智能合约的编写
在Remix上debug智能合约
solc获取合约相关信息
合约的部署
之后的安装需要用到git,在终端下输入以下命令安装git
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
上述过程完成后输入 git --version 返回版本号即可确认安装完成。
终端中输入以下命令
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install ethereum
上述过程完成,输入 geth --help 返回geth的用法,即确认安装完成。
终端输入
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install solc
上述过程完成后输入 solc --version 返回版本号即可确认安装完成。
编辑好一个名为genesis.json的创世区块文件以定义私有链的信息
{
"config": {
"chainId": 666,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"alloc" : {},
"coinbase" : "0x0000000000000000000000000000000000000000",
"difficulty" : "0x00000001",
"extraData" : "",
"gasLimit" : "0xffffff",
"nonce" : "0x0000000000000042",
"mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
"timestamp" : "0x00"
}
各字段的含义如下:
config |
私链的相关配置,这里用来设置chainId等的值,其中chainId不能为0 |
alloc |
用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以这里不需要预置有币的账号,需要的时候创建即可以。 |
coinbase |
矿工账号 |
difficulty |
当前区块额难度,设为1,使得私链挖矿简单点。 |
extraData |
附加信息 |
gasLimit |
当前区块能够消耗的最大的总gas值 |
nonce |
nonce是一个随机数,用于挖矿 |
mixhash |
与nonce配合用于挖矿,由上一个区块的一部分生成的hash。和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, (44)章节所描述的条件。 |
parentHash |
上一个区块的hash值,因为这里是创世区块,所以parentHash为0 |
timestamp |
设置创世区块的时间戳,从0开始 |
geth --datadir data init genesis.json
上述命令的字段含义如下:
字段 | 含义 |
---|---|
init | 表示初始化区块,后面跟着创世块的配置文件genesis.json |
datadir | 数据存放的位置 |
geth --datadir data --networkid 123456 --rpc --rpccorsdomain "*" --nodiscover console
上述命令各字段的含义如下:
字段 | 含义 |
---|---|
identity | 区块链的标示,随便填写,用于标示目前网络的名字 |
port | 网络监听端口 |
rpc | 启动rpc通信,可以进行智能合约的部署和调试 |
rpcapi | 设置允许连接的rpc的客户端,一般为db,eth,net,web3,默认情况下,Geth允许web3 |
networkid | 设置当前区块链的网络ID,用于区分不同的网络,是一个数字 |
console | 启动命令行模式,可以在Geth中执行命令 |
rpccorsdomain | 设置请求ip白名单 * 为所有 |
nodiscover | 使用这个参数,你的节点就不会被其他人发现,除非手动添加你的节点。否则,就只有一个被无意添加到一个陌生区块链上的机会,那就是跟你有相同的genesis文件和networkID。 |
可以使用把输出日志输出到文件里,下面命令表示把输出日志输出到detail.log文件里,其中 --verbosity 4 表示输出的日志详细程度,可以省略
geth --datadir data --verbosity 4 console 2>>detail.log
如果不想把日志输出到文件内,也可以直接使用命令 geth --datadir data console,此时 日志将在终端输出
1、创建新用户
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"
Passphrase:
Repeat passphrase:
两段后输入的是此用户的密码(随意)
"0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"为用户的哈希地址,之后要用到。
也可以直接使用命令 personal.newAccount("xxx") 来直接初始化用户的密码
2、查看用户余额
> myAddress = "0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"
"0xf45fd17e0535d97ab291b91ee3f675d403ca5efb"
> eth.getBalance(myAddress)
0
3、进行挖矿赚取工钱以满足后续部署智能合约需要
miner.start();admin.sleepBlocks(1);miner.stop()
上面命令意思是当成功挖到一个矿就停止挖矿。
编写一个简单的智能合约,以下为求两个数的和。
pragma solidity ^0.4.7;
contract test3 {
uint x;
uint y;
function set(uint _x, uint _y) public {
x = _x;
y = _y;
}
function getAdd() public view returns(uint) {
return x + y;
}
}
在这不一一列举,可以转至Remix用法查看。
打开另一个终端进入合约文件保存目录,输入以下命令
$ solc --bin test.sol
======= test.sol:test3 =======
Binary:
608060405234801561001057600080fd5b5060f68061001f6000396000f3006080604052600436106049576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680631ab06ee514604e578063d14d42ba146082575b600080fd5b348015605957600080fd5b506080600480360381019080803590602001909291908035906020019092919050505060aa565b005b348015608d57600080fd5b50609460bc565b6040518082815260200191505060405180910390f35b81600081905550806001819055505050565b6000600154600054019050905600a165627a7a72305820f923c2e4a50417a6f982efc6cf547f573d8b80be1bbe394bb0f4aaa5dd42ae1e0029
$ solc --abi test.sol
======= test.sol:test3 =======
Contract JSON ABI
[{"constant":false,"inputs":[{"name":"_x","type":"uint256"},{"name":"_y","type":"uint256"}],"name":"set","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getAdd","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
1、在geth命令行下定义变量 code 和 abi 来保存上面solc获取到的合约信息,其中 code = “0x***”,0x表示十六进制,0x后面接的是solc --bin test.sol 返回的十六进制串。abi = solc --abi test.sol 命令返回的 json 串。
2、解锁当前用户:
personal.unlockAccount(myAddress)
3、发送部署合约的交易:
myContract = eth.contract(abi)
contract = myContract.new({from: myAddress, data: code, gas: 1000000})
4、查询交易池的状态:
txpool.status
此时返回一个json文件,里面的pending的值为1,表示当前还有一个交易待确认。
5、挖矿确认上述交易:
miner.start();admin.sleepBlocks(1);miner.stop()
此时再查看交易池的状态,发现pending的值为0,表示当前没有交易待确认。
6、在私链上调用智能合约
contract.set.sendTransaction(4, 5, {from:myAddress})
以上set为合约的函数,senTransaction函数里的参数前面的数合约的函数的输入参数,最后一个参数为用户地址,表示该交易由其发起。调用上述函数后庙会返回一串哈希值,为交易的哈希值,可以通过使用命令:eth.getTransaction(交易哈希地址)来获取这笔交易的相关信息。
contract.getAdd.sendTransaction({from:myAddress})
以上调用合约的getAdd函数。
谢谢阅读。
参考资料