私链搭建过程
这里我使用了JSON格式的搭建方法,并使用Geth来辅助搭建。
注意:这里使用的是MacOs系统
参考文章:https://www.cnblogs.com/lion.net/p/7809862.html
一
第一步,我们需要下载geth源码并编译。
1 首先打开https://github.com/ethereum/go-ethereum.git
2 下载压缩包到某个文件夹下
3 cd go-ethereum-master
4 make geth
5 make all
然而,当我运行geth命令,我发现并不能成功:
后来经过一番测试,我们要这样运行(找到源码的bin目录下的geth):
image.png二
之后,我们需要在某个文件夹下创建xxx.json文件:
image.png方法如下:
cat > cp.json
{
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
},
"difficulty": "4",
"gasLimit": "2100000",
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": {
"balance": "300000"
},
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": {
"balance": "400000"
}
} }
这里我们初始化了两个地址,并赋值了启动资金。
"alloc": {
"7df9a875a174b3bc565e6424a0050ebc1b2d1d82": {
"balance": "300000"
},
"f41c74c9ae680c1aa78f42e5647a62f353b7bdde": {
"balance": "400000"
}
之后,我们需要在拥有cp.json
的文件夹下运行命令:
geth init cp.json --datadir blockchainData
三
之后我们在另外一个shell中运行:
geth --networkid 123 --datadir blockchainData console
以便打开终端。
然后我们可以运行相应的命令:
由于我们在这个地址下预存了部分钱,所以能够显示余额。
image.png四
查看帐户,可以看到当前帐户是空的:
web3.eth.accounts
创建帐户的方式有两种,第一种创建帐户时直接初始化密码:
web3.personal.newAccount("123456")
image.png
其中返回的0xb2d06dc22f1bcd9f8c2f7530d955480c49be40e5
是帐户,123456
是帐户的密码。
第二种方法是先创建账户,然后输入密码:
> web3.personal.newAccount()
Passphrase:
Repeat passphrase:
此时我们查看账户情况:
image.png这个时候,我们需要设置一个miner:
miner.setEtherbase("0xb2d06dc22f1bcd9f8c2f7530d955480c49be40e5")。
之后我们开始挖矿:
得到:
image.png五
之后我们编写智能合约:
pragma solidity ^0.4.4;
contract test {
function multiply(uint a) constant returns(uint d){
return a * 7;
}
}
之后我们需要获得:
- 字节码
> var bin = "0x6060604052341561000f57600080fd5b60b18061001d6000396000f300606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820b4a0d85170cc10fb54be34cdb092932573cb7cff24711610a0b1b71a06cc34c90029"
undefined
这里注意:0x。
之后我们输入bin
。
对于abi,我们需要借助网站:http://www.bejson.com/jsonviewernew/
我们复制下面内容:
image.png点击这个:
得到:
image.png继续点击去除转义:
image.png得到:
[{"constant":true,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
复制到shell中,我们得到:
> var ab = [{"constant":true,"inputs":[{"name":"a","type":"uint256"}],"name":"multiply","outputs":[{"name":"d","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]
image.png
> abi
[{
constant: true,
inputs: [{
name: "a",
type: "uint256"
}],
name: "multiply",
outputs: [{
name: "d",
type: "uint256"
}],
payable: false,
stateMutability: "view",
type: "function"
}]
之后我们需要查询这个函数需要的gas值:
web3.eth.estimateGas({data: bin})
image.png
之后
> var my = eth.contract(abi)
undefined
> var contract = my.new({from:cp0,data:bin,gas:100000});
INFO [12-25|21:07:30.564] Submitted contract creation fullhash=0xbd82da7cfd303de1c5abcc74352bb09fb421b6329cca4583cd69ff5e14fc5d8d contract=0xA87B6429EC4A7bADDC033014B37b12B970bc1D5f
undefined
这里cp0我曾经运行过 cp0 = web3.eth.accounts[0]
。
之后运行contract
。
> contract
{
abi: [{
constant: true,
inputs: [{...}],
name: "multiply",
outputs: [{...}],
payable: false,
stateMutability: "view",
type: "function"
}],
address: undefined,
transactionHash: "0xbd82da7cfd303de1c5abcc74352bb09fb421b6329cca4583cd69ff5e14fc5d8d"
}
然而这个私链机制需要我们进行挖矿才能得到后续的动作:
> miner.start()
INFO [12-25|21:08:49.037] Updated mining threads threads=4
INFO [12-25|21:08:49.037] Transaction pool price threshold updated price=1000000000
null
之后查看区块状态:
> txpool.status
{
pending: 0,
queued: 0
}
查看这个合约的地址:
> eth.getCode(contract.address)
"0x606060405260043610603f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063c6888fa1146044575b600080fd5b3415604e57600080fd5b606260048080359060200190919050506078565b6040518082815260200191505060405180910390f35b60006007820290509190505600a165627a7a72305820b4a0d85170cc10fb54be34cdb092932573cb7cff24711610a0b1b71a06cc34c90029"
之后我们运行合约:
image.png即部署成功。
网友评论