sudo yum update -y && yum install git wget bzip2 vim gcc-c++ ntp epel-release nodejs cmake -y
cd /opt/module
mkdir blockchain
## install key and repository
sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc
sudo sh -c 'echo -e "[code]\nname=Visual Studio Code\nbaseurl=https://packages.microsoft.com/yumrepos/vscode\nenabled=1\ngpgcheck=1\ngpgkey=https://packages.microsoft.com/keys/microsoft.asc" > /etc/yum.repos.d/vscode.repo'
## update
yum check-update
sudo yum install code
wget https://studygolang.com/dl/golang/go1.7.3.linux-amd64.tar.gz
tar -zxvf go1.7.3.linux-amd64.tar.gz
vi ~/.bashrc
export GOPATH=/opt/module/blockchain/Go
export GOROOT=/opt/module/blockchain/go
export PATH=$PATH:$GOROOT/bin
注意: 圈出部分根据自己下载的路径灵活修改,如果用这种方式出错,应该是没有安装bashrc相关的组件,直接在etc/profile中修改,效果一样。
git clone https://github.com/ethereum/go-ethereum.git
git checkout v1.7.2
make geth
make all
vi ~/.bashrc
geth version
geth -h
mkdir cmake
cd cmake/
wget https://cmake.org/files/v3.12/cmake-3.12.3.tar.gz
tar -zxvf cmake-3.12.3.tar.gz
cd cmake-3.12.3/
注意: 这个时候进行安装,会一直出错,下面先进行下面的操作,避免错误的发生。
先修改默认安装路径,找到图片中内容,默认路径修改一下。
vi bootstrap
sudo ./bootstrap && make && make install
如果使用这个命令安装出错,分别执行下面命令
sudo ./bootstrap
sudo make
sudo make install
至此,应该就可以安装成功了。
vi ~/.bashrc
source ~/.bashrc
cmake -version
systemctl stop firewalld
systemctl disable firewalld
systemctl enable ntpd
systemctl start ntpd
至此,环境准备完毕,下面可以开始搭建私有链
mkdir blockchain-test-1
touch genesis.json
vi genesis.json
添加以下内容:
{
"nonce": "0x0000000000000042",
"timestamp": "0x00",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x00",
"gasLimit": "0x80000000",
"difficulty": "0x400",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x2D356ee3F5b8718d8690AFCD31Fe2CB5E602677e",
"alloc": {},
"config": {
"chainId": 15,
"homesteadBlock": 0,
"eip155Block": 0,
"eip158Block": 0
}
}
geth --datadir node0 init genesis.json
geth --datadir node0 console 2>> geth.log
personal.newAccount(“111111”)
personal.newAccount(“222222”)
新建了两个账户,111111,222222分别是两个账户的密码。
tail -f geth.log
刚开始两个账号金额都是0,两个账户额度都是0,此时是不能交易的,先挖矿,让accounts[0]有点币,一般开启挖矿默认将挖到的币存入到accounts[0]中,也可以使用miner.setEtherbase(eth.accounts[1])设置coinbase为账户1,这里不执行这个操作,就用默认的,让accounts[0]中有点钱
miner.start(3)
当出现successfully时,说明挖到了,再查看账号accounts[0]时,已经有金额了
可以观察到每次挖到一个新的区块都需要经历四个阶段。分别是commit new mining work => successfully sealed new block => block reached canonical chain => mined potential block,即先提交要打包某个区块的任务,然后成功打包该区块,该区块接到主链上(主链最后一个区块号一般会比当前的目标区块小一些,因为有分叉),成功完成挖矿。每条记录后面的number指明的是当前挖矿的目标区块序号。
现在accounts[0]有额度了
从accounts[0]向accounts[1]转账
先解锁accounts[0],否则会报错
personal.unlockAccount(eth.accounts[0])
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:999999)
miner.start(3)
tail -f geth.log
挖矿未完成之前,accounts[1]额度还是0
等了几分钟,日志出现了successfully,看一下交易是否完成了
查看资源池状态,可以看见pending从1变成0,再看accounts[1]是不是转进了999999
txpool.status
eth.getBalance(eth.accounts[1])
此时accounts[1]已经有一笔交易进入,金额999999,和预期效果一样。
好了,交易完成,停止挖矿吧
miner.stop
注: 只要实际上有在挖矿,start返回null或true都无所谓。
geth --datadir node1 init genesis.json
geth --datadir node0 -networkid 2018 -rpc console 2>> geth.log
另开一个终端(作为node1节点)启动新节点的rpc服务,把网络id设置成2018(要相同),rpc的端口默认8545,节点监听的端口默认是30303,这两个端口都被上一个节点占用了(因为我是在一台机器上),因此这个新节点的这两个端口都要手动设置(我这里分别设成8546和30304),ip地址仍是默认。
geth --datadir node1 -networkid 2018 -rpc -rpcport 8546 -port 30304 console 2>> geth.log
admin.nodeInfo.enode
在另一个终端上(node0的终端上),进入上一个节点的console,加入新节点(注意,这里复制的内容会不一样,看生成的是什么就复制什么,不要复制这个)
admin.addPeer("enode://d0c1d8ac14393a00151585bd4c93a251cf682d503a13ed222ce55009d7200640f5ecd9baefaac5e818caf23cbcd0bbd2290b5c02fc4bb110a79ef5259ae5a686@[::]:30304")
编写合约,使用remix,谷歌浏览器打开这个网站 https://remix.ethereum.org/#optimize=false
官方在线编译器:
https://ethereum.github.io/browser-solidity
https://remix.ethereum.org
pragma solidity ^0.4.18;
contract Test{
string public name;
function Test() public {
name = "zch";
}
function getName() public view returns (string) {
return name;
}
function setName(string _name) public {
name = _name;
}
}
• 点击complie Test.sol
• 点compliation Details找到WEB3DEPLOY一项,拷贝里面的代码
• 将上述代码直接黏贴进console,或者可以保存在某个js文件中再load进来(比较优雅)。如果报错说没有unlock则需要先解锁一个账户。
personal.unlockAccount(eth.accounts[0])
然后开始挖矿进行部署,否则合约实例的address是undefined。
miner.start()
tail -f geth.log
test.getName.call()
其他操作和交易时是一样的,交易前记得解锁账户,产生交易后记得挖矿。
写操作
• 为该节点设置默认账户,这样在调用set函数时就会自动让你付款。这种方法适用于只有一个账户的节点或者只有一个账户经常使用的多账户节点。
eth.defaultAccount=eth.accounts[0]
test.setName("ch")
执行后,查看名字还是原来的,因为写操作需要通过矿工对链做出更改和同步,有代价,所以要启动挖矿,挖矿结束后再次查看,发现名字已经修改过来了。最后停止挖矿。
https://blog.csdn.net/Wonderful_sky/article/details/83898257
https://www.cnblogs.com/yunxintryyoubest/p/10640260.html