以太坊搭建私有链(非常详细!!!)(一)
我的系统:CentOS7 64位
环境需要:Go 1.9以上版本
geth工具
WARN [11-04|09:34:47.411] System clock seems off by -10h15m43.047110838s, which can prevent network connectivity
WARN [11-04|09:34:47.411] Please enable network time synchronisation in system settings.
一.环境搭建
1.安装Go
下载源码 https://golang.org/dl/
找到适合自己操作系统的版本,必须1.9版本以上。我安装的是1.9.5
解压到/usr/local下
tar -zxvf go1.9.5.linux-amd64.tar.gz -C /usr/local/
创建软链接
ln -s /usr/local/go/bin/go /usr/bin/go
测试是否成功
go version
#go version go1.9.5 linux/amd64
2.安装geth工具
下载geth源码
git clone https://github.com/ethereum/go-ethereum.git
解压到/usr/local/下
unzip -d /usr/local/ go-ethereum-master.zip
编译源码
cd /usr/local/go-ethereum
make
成功的话会出现如下:
Done building.
Run "/usr/local/go-ethereum-master/build/bin/geth" to launch geth.
创建软链接 这样我们可以直接用geth命令,而不用输入路径
ln -s /usr/local/go-ethereum-master/build/bin/geth /usr/bin/geth
make过程中 如果出现以下错误:
exec: “gcc”: executable file not found in $PATH
则是没有安装gcc的原因,执行
yum install gcc
二.搭建私有链
1.创建用户
mkdir geth
cd geth
进入geth控制台
geth --datadir db --nodiscover console
创建用户
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> personal.newAccount()
Passphrase:
Repeat passphrase:
"0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"
查看用户余额
> eth.getBalance(eth.accounts[0])
0
> eth.getBalance(eth.accounts[1])
0
给用户创建别名
> yujuan=eth.accounts[0]
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> hcb=eth.accounts[1]
"0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"
可以看到在db目录下,有个keystore目录,里面已经存了我们刚刚创建的两个账户。
[root@localhost mychain]# tree
.
├── geth
│ ├── chaindata
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ ├── LOCK
│ ├── nodekey
│ ├── nodes
│ │ ├── 000001.log
│ │ ├── CURRENT
│ │ ├── LOCK
│ │ ├── LOG
│ │ └── MANIFEST-000000
│ └── transactions.rlp
├── geth.ipc
└── keystore├── UTC--2018-11-04T16-02-52.181405978Z--12844bb3206f10a331557bffb7c8d34ee4ca8b65└── UTC--2018-11-04T16-03-15.055116889Z--a6faa81cad6a3b038d9a51db80cedbe65184c7e2
2.传世区块配置文件
cd mychainvim gensis.json
在gensis.json中输入如下内容
{"alloc": {"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65": {"balance": "999000000000000000000"}},"config":{"chainId":15,"homesteadBlock":0,"eip155Block":0,"eip158Block":0},"nonce":"0x0000000000000001","mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000","difficulty": "0x01","coinbase":"0x0000000000000000000000000000000000000000","timestamp": "0x00","parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000","extraData": "0x777573686f756865","gasLimit":"0xffffffff"
}
注意这里的alloc后的地址要用之前创建的地址
2.初始化
准备好创世区块配置文件后,需要初始化区块链,将上面的传世区块信息写入到区块链中。
始初始化区块
geth --datadir “./mychain/” init ./mychain/gensis.json
–datadir 指定数据存放目录
可能出现如下错误,原因是前面启动私有链时已经创建了默认的创世区块
Fatal: Failed to write genesis block: database already contains an incompatible genesis block
如下删除数据
geth removedb
成功的话可以看到如下结果
[root@localhost blockchain]# geth --datadir "./mychain/" init ./mychain/gensis.json
WARN [11-04|11:59:11.370] Sanitizing cache to Go's GC limits provided=1024 updated=324
INFO [11-04|11:59:11.380] Maximum peer count ETH=25 LES=0 total=25
INFO [11-04|11:59:11.383] Allocated cache and file handles database=/home/blockchain/mychain/geth/chaindata cache=16 handles=16
INFO [11-04|11:59:11.411] Writing custom genesis block
INFO [11-04|11:59:11.412] Persisted trie from memory database nodes=1 size=149.00B time=230.093µs gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-04|11:59:11.412] Successfully wrote genesis state database=chaindata hash=481cfe…9fd026
INFO [11-04|11:59:11.412] Allocated cache and file handles database=/home/blockchain/mychain/geth/lightchaindata cache=16 handles=16
INFO [11-04|11:59:11.425] Writing custom genesis block
INFO [11-04|11:59:11.426] Persisted trie from memory database nodes=1 size=149.00B time=1.090266ms gcnodes=0 gcsize=0.00B gctime=0s livenodes=1 livesize=0.00B
INFO [11-04|11:59:11.427] Successfully wrote genesis state database=lightchaindata hash=481cfe…9fd026
3.测试基本的操作
1)此时再查看余额,可以看到
> eth.accounts
["0x12844bb3206f10a331557bffb7c8d34ee4ca8b65", "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"]
> eth.getBalance(eth.accounts[0])
999000000000000000000
2)转账
> a1=eth.accounts[0]
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> a2=eth.accounts[1]
"0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2"
我们从账户a1转10个以太币给a2
转账之前需要先对账户a1解锁
> personal.unlockAccount(a1,"123456")
true
转账
> eth.sendTransaction({from:a1, to:a2, value:web3.toWei(10,"ether")})
INFO [11-04|12:28:37.209] Setting new local account address=0x12844bB3206F10A331557bFfB7c8D34eE4ca8b65
INFO [11-04|12:28:37.210] Submitted transaction fullhash=0x21d4e590f240322b2ab16b750f6e7ded187242ecdfb17c49cb5d229649f1bc56 recipient=0xA6fAA81cAD6A3b038D9a51DB80CEDbe65184c7E2
"0x21d4e590f240322b2ab16b750f6e7ded187242ecdfb17c49cb5d229649f1bc56"
交易已经成功执行,最后一排即是交易的hash值
那我们再来看一下两个账户的余额
> eth.getBalance(a1)
999000000000000000000
> eth.getBalance(a2)
0
奇怪,为什么账户的余额根本就没有变呢。那是因为这里没有矿工参与,所以也没有人来将交易打包写入区块。
3)启动节点
geth --datadir "./mychain" --rpc --rpcaddr=0.0.0.0 --rpcport 8545 --rpccorsdomain "*" --rpcapi "eth,net,web3,personal,admin,ssh,txpool,debug,miner" --nodiscover --maxpeers 30 --networkid 1981 --mine --minerthreads 1 --etherbase "0x12844bb3206f10a331557bffb7c8d34ee4ca8b65" console
这样我们就成功运行了一个私有链,再稍过一会儿
就会发现出现了斧头,说明已经开始挖矿了
这个时候我们再来看刚刚转账后的账户余额
> web3.fromWei(eth.getBalance(eth.accounts[0]))
994
> web3.fromWei(eth.getBalance(eth.accounts[1]))
10
web3.fromWei是将Wei转换成ether
因为我们设置的矿工奖励地址是accounts[0],所以这里的账户余额是994,而不是989
4) 交易
通过attach命令,连接一个已经启动的节点,启动JS命令环境
geth --datadir './mychain/' attach ipc:./mychain/geth.ipc
成功进入
[root@localhost blockchain]# geth --datadir './mychain/' attach ipc:./mychain/geth.ipc WARN [11-04|14:01:44.332] Sanitizing cache to Go's GC limits provided=1024 updated=324Welcome to the Geth JavaScript console!instance: Geth/v1.8.18-unstable/linux-amd64/go1.9.5coinbase: 0x12844bb3206f10a331557bffb7c8d34ee4ca8b65at block: 1 (Sun, 04 Nov 2018 12:43:43 EST)datadir: /home/blockchain/mychainmodules: admin:1.0 debug:1.0 eth:1.0 ethash:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
现在开始挖矿
可以通过miner.setEtherbase(eth.accounts[0])来设置挖矿奖励地址
> eth.accounts
["0x12844bb3206f10a331557bffb7c8d34ee4ca8b65", "0xa6faa81cad6a3b038d9a51db80cedbe65184c7e2", "0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"]> a2=eth.accounts[2]"0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"
> a0=eth.accounts[0]
"0x12844bb3206f10a331557bffb7c8d34ee4ca8b65"
> personal.unlockAccount(a0)
Unlock account 0x12844bb3206f10a331557bffb7c8d34ee4ca8b65
Passphrase: true> eth.sendTransaction({from:a0,to:a2,value:web3.toWei(20,"ether")})
"0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745"
将账户a2设置为挖矿奖励地址
> miner.setEtherbase(a2)true
> eth.coinbase
"0x0cdba6a391a52155042d4709a90fbc9ed3b72f06"
>
现在已经有一个未打包进区块的交易在交易池中。txpool.status返回正在等待打包的交易。pending表示已经提交还未被处理的交易
> txpool.status
{pending: 1,queued: 0
}
查看pending交易详情
> txpool.inspect.pending
{0x12844bB3206F10A331557bFfB7c8D34eE4ca8b65: {1: "0x0CDBA6A391a52155042D4709A90fBC9ed3B72F06: 20000000000000000000 wei + 90000 gas × 1000000000 wei"}
}
5)挖矿
要使交易被处理,必须要挖矿,
这里启动挖矿,然后等到挖到第一个区块之后就停止挖矿
miner.start(1);admin.sleepBlocks(1);miner.stop();
6)区块
之前交易的hash值0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745
得到发起交易时的详情
eth.getTransaction("0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745")
下面是交易被打包进区块时详细信息:
eth.getTransactionReceipt("0x0d711995130df3809294b5e8f62652a91cd9154188282b10c250fc99a6d06745")
查看当前区块总数
eth.blockNumber
查询最新区块
eth.getBlock(‘latest’)
返回区块number的信息
eth.getBlock(0)
4远程节点管理
重新开一台机子(当然贫困的我是重开了一个虚拟机)
依照上面配置环境后启动节点。注意gensis.block需要一样。
添加其他节点
可以通过admin.addPeer()方法连接到其他节点,两个节点要想联通,必须保证网络是连接的,并且启动时指定的networkid相同。
通过下面的命令获得另一个节点的ecode信息
> admin.nodeInfo.enode
"enode://c56903836723db6d643a2b9fb13e11ed30e53618606c600f7c0ebab89246d24b381df7ef6f08b19461b423b72d88d62dcbf6aa2989024093b24536633977515a@127.0.0.1:30303?discport=0"
链接节点2:
> admin.addPeer("enode://c56903836723db6d643a2b9fb13e11ed30e53618606c600f7c0ebab89246d24b381df7ef6f08b19461b423b72d88d62dcbf6aa2989024093b24536633977515a@192.168.183.137:30303?discport=0")
true
注意这里需要把ip地址改成节点2的ip地址。
连接成功后,节点二会开始同步节点一的区块,同步完成后,任意一个节点开始挖矿,另一个节点会自动同步区块。
查看已连接到的节点
以太坊搭建私有链(非常详细!!!)(一)相关推荐
- Windows搭建以太坊的私有链环境
Windows搭建以太坊的私有链环境 1.下载Geth.exe 运行文件,并安装 https://github.com/ethereum/go-ethereum/releases/ 下载后,只有一个G ...
- 以太坊《私有链和联盟链的机会与挑战》报告
以太坊平台评估 私有链和联盟链的机会与挑战 作者:Vitalik Buterin 翻译:万向区块链实验室/ChinaLedger 联盟 排版/校对:区块链铅笔(ChainB.com) (注:本文属 ...
- 【以太坊】私有链和测试网的区别
一.概述 我们想要学习一门新技术,那么一般都是先网上查查相关概念,然后下载下来demo进行测试,本地跑通之后就可以尝试在项目中使用.那么学习以太坊该如何学习呢? 博主也是一位初学者,这里和大家一起学习 ...
- Ethereum Bootstrap 以太坊本地私有链开发环境搭建
通过本文所述方法和项目中的脚本,我们可以快速的搭建好自己的私链进行开发测试. 仓库中包含的工具有: 一个测试账户导入脚本,在首次部署时将五个测试账户私钥导入以太坊节点. 一个genesis.json配 ...
- 如何在geth中创建genesis.json_基于以太坊的私有链搭建,mist+geth实现
以前让学生做毕业设计,今天有人问起来,就写一个小教程,说一说基于eth的私有链如何搭建.非常简单. 一.geth,mist 客户端下载 1.这里我给大家介绍下,以太坊客户端,以太坊客户端主要分成两类. ...
- 以太坊搭建联盟链详细教程
虫洞社区签约作者介绍 风逝 区块链 云旗天下 安装以太坊geth客户端 需要先安装go环境 安装教程 下载以太坊源码 github.com/ethereum/go-ethereum 进入 go-eth ...
- geth 转账_以太坊1 - 私有链部署、挖矿、转账
总结一下以太坊私有链搭建的过程,已经遇到的问题. 我们使用了LINUX,MAC OSX,WINDOWS三种平台,运行go-ethereum. 一.go语言安装 LINUX 命令行输入sudo gedi ...
- 以太坊搭建联盟链_区块链知识普及:什么是以太坊
以太坊(Ethereum)是下一代密码学账本,可以支持众多的高级功能,包括用户发行货币,智能协议,去中心化的交易和设立去中心化自治组织(DAOs)或去中心化自治公司(DACs).以太坊并不是把每一单个 ...
- 以太坊搭建联盟链_转载:以太坊联盟链quorum搭建(一)
原文链接:https://blog.csdn.net/zhj_fly/article/details/80560744 关于quorum的介绍可以看一些这几篇文章: 官网教程中创建了7个节点,由这7个 ...
最新文章
- Python 中的魔术方法(双下划线开头和结尾的方法)
- 【 Verilog HDL 】正确的变量访问思路
- @RequestParam @RequestBody @PathVariable 等参数绑定注解详解
- 【数据集】自动驾驶都有什么测试基准?
- ZOJ-Crashing Balloon
- C++11标准库 - array
- leetcode 买卖股票的最佳时机 II
- 【报告分享】2019年中国首席营销官(CMO)调查白皮书.pdf(附下载链接)
- Siri 自动拨打 911、Google 建筛查网站、IBM 测药物成分,国际抗疫在行动!
- ubuntu 12.04 以固定 IP 地址连接网络并配置DNS
- Qt 动图 播放png阵列 避免使用gif导致失真
- jdk6版本下载地址
- 17分钟过桥,过桥最短时间问题
- inv在线计算机,INV3062A
- 拿火柴游戏(拿子游戏)
- “影子公司” 汇润成功入主深航
- 25行代码带你爬取4399小游戏数据,看下童年的游戏是否还在
- Red Hat Linux 基础命令大全
- QT图形对象:常规界面设计
- html+js实现音频上传并能播放(支持多个文件上传)
热门文章
- 纷享销客荣获“2022医疗健康行业CRM数字化最佳服务商”
- 【程序源代码】音乐小程序
- JAVA怎么给手机发短信对接验证码短信接口DEMO示例
- 关于stm32F030的ADC异常的原因
- 第六次自考总结——英语二
- oracle 数据块修复工具,BBED (Oracle Block Brower and EDitor Tool) :数据块修复工具
- 什么是文件目录,文件目录项的主要内容是什么?
- Ubuntu16.04 系统下的pytorch库(cpu版)安装与demo测试
- docker系列一 docker 安装和常用命令
- 怎么修复Win11中的AMD驱动程序崩溃?修复win11驱动崩溃方法