主页 > 华为安装imtoken > 以太坊(Ethereum)构建私有区块链
以太坊(Ethereum)构建私有区块链
加载自:
1. 什么是以太坊?
以太坊(Ethereum)不是一个机构,而是一个可以在区块链上实现智能合约并开源的底层系统。 从以太坊诞生到2017年5月,短短三年半时间,全球已有200多个以太坊应用诞生。 以太坊是一个平台和编程语言,使开发人员能够构建和发布下一代分布式应用程序。 由于硬件集成,以太坊可用于编程、去中心化、保护和交易任何东西:投票、域名、金融交易、众筹、公司治理、合同和大多数协议、知识产权和智能资产。
以太坊的白皮书:
1.2. 以太坊的几个基本概念:
以太坊简单来说就是区块链和智能合约的结合,是基于solidity语言实现的。 在以太坊中,智能合约也有一个账户地址。
EVM
以太坊虚拟机 (EVM) 是以太坊中智能合约的运行时环境。 它不仅是沙盒化的,而且实际上是完全隔离的,在 EVM 内部运行的代码无法接触网络、文件系统或其他进程。 智能合约之间甚至还有有限的调用。
帐户
以太坊中有两种类型的账户,它们共享相同的地址空间。 外部账户,由公私密钥对控制。 合约账户,此类账户由账户中存储的代码控制。 外部账户地址由公钥确定,合约账户地址在创建合约时确定。
每个账户都有一个以太币余额(以“Wei”为单位),可以通过向其发送以太币交易来更改。
交易
每笔交易都是一条信息,可用于将余额从一个账户发送到另一个账户。
气体
每笔交易都需要支付一定数量的gas。 gas价格由创建者设定,调用合约的发送账户需要交易费=gas价格*gas量。
1.3. 围绕以太坊的常用工具
Go-以太坊
浏览器稳定性
蒙蒙
测试RPC
2. 什么是Go-Ethereum?
Go-Ethereum是以太坊基金会官方提供的客户端软件。 它是用 Go 编程语言编写的,简称 Geth。 以下组件值得了解:
Geth客户端
当您启动客户端程序时以太坊区块链查询合约地址,它会连接到其他客户端(也称为节点)的网络以下载同步块。 它会不断地与其他节点通信,以保持其副本是最新的。 它还具有挖掘区块并将交易添加到区块链、验证和执行区块交易的能力。 也可以作为服务器,你可以通过RPC访问暴露的API接口。
Geth终端
这是一个命令行工具,可以让你连接到一个正在运行的节点并执行各种操作,例如创建和管理账户、查询区块链、签署和提交交易到区块链等等。更多介绍请点击这里
3、Go-Ethereum的开源地址在哪里?
4.如何安装Go-Ethereum 1.7.2
本文使用的方法是通过Git下载源码,在本地编译Go-Ethereum 1.7.2
混帐克隆
cd go-以太坊
git checkout v1.7.2
让geth
让所有
查看安装的geth版本号
➜ /Users/lion >geth 版本
盖思
版本:1.7.2-稳定
Git 提交:1db4ecdc0b9e828ff65777fb466fc7c1d04e0de9
架构:amd64
协议版本:[63 62]
网络编号:1
版本:go1.9.1
操作系统:达尔文
GOPATH=/Users/lion/my_project/_golang
GOROOT=/usr/local/Cellar/go/1.9.1/libexec
5. 开始创建以太坊私链
5.1. 初始化创世块
在初始化创世块时,首先创建一个包含以下内容的 genesis.json 文件:
创世纪.json:
{
“配置”:{
“链号”:10,
“家园块”:0,
“eip155块”:0,
“eip158块”:0
},
“币库”:“0x0000000000000000000000000000000000000000”,
“难度”:“0x20000”,
“额外数据”:“”,
“gasLimit”:“0x2fefd8”,
“随机数”:“0x00000000000000042”,
“混合哈希”:“0x0000000000000000000000000000000000000000000000000000000000000000”,
“parentHash”:“0x0000000000000000000000000000000000000000000000000000000000000000”,
“时间戳”:“0x00”,
“分配”:{},
}
参数名称 参数说明
mixhash与nonce一起用于挖矿,前一个块的一部分产生的hash。 注意him和nonce的设置需要满足黄皮书4.3.4描述的条件。 区块头有效性,以太坊 (44) 部分。
nonce nonce 是用于挖矿的 64 位随机数。 注意it和mixhash的设置需要满足黄皮书4.3.4描述的条件。 区块头有效性,(44) of Ethereum。
difficulty 设置当前区块的难度。 如果难度太高,CPU挖矿就会很困难。 在这里设置一个较小的难度
alloc 用于预先设置账号和账户中的以太币数量,因为私链挖矿相对容易,所以我们不需要预先设置一个带币的账户,需要的时候可以自己创建。
coinbase矿工账号,随便填
timestamp 设置创世块的时间戳
parentHash 前一个区块的哈希值,因为是创世区块,所以这个值为0
extraData附加信息,随便填,可以填个人信息
gasLimit 该值设置了对 GAS 总消耗量的限制,用于限制一个区块可以包含的交易信息总和。 因为我们是私链,所以我们填最大值。
接下来,我们使用 geth init ./genesis.json –datadir “./chain” 命令来初始化创世块。 当前区块链网络数据存放的位置会保存在chain目录下:
➜ /Users/lion/my_project/_eth/test >geth init ./genesis.json –datadir “./chain”
警告 [10-22|14:49:09] 没有设置 etherbase,也没有找到默认帐户
INFO [10-22|14:49:09] 分配的缓存和文件句柄数据库=/Users/lion/my_project/_eth/test/chain/geth/chaindata cache=16 handles=16
信息 [10-22|14:49:09] 编写自定义创世块
INFO [10-22|14:49:09] 成功写入创世状态数据库=chaindata hash=5e1fc7…d790e0
INFO [10-22|14:49:09] 分配的缓存和文件句柄数据库=/Users/lion/my_project/_eth/test/chain/geth/lightchaindata cache=16 handles=16
信息 [10-22|14:49:09] 编写自定义创世块
INFO [10-22|14:49:09] 成功写入创世状态数据库=lightchaindata hash=5e1fc7…d790e0
5.2. 启用私有链
使用以下命令启用私有链:
得到\
--datadir“./chain”\
--nodiscover \
控制台 2>>eth_output.log
启动后的效果如下:
➜ /Users/lion/my_project/_eth/test >geth\
--datadir“./chain”\
--nodiscover \
控制台 2>>eth_output.log
欢迎使用 Geth JavaScript 控制台!
实例:Geth/v1.6.7-stable-ab5646c5/darwin-amd64/go1.9.1
模块:admin:1.0 debug:1.0 eth:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0
>
参数名称 参数说明
datadir 设置当前区块链网络数据存放位置
console 启动命令行模式以太坊区块链查询合约地址,可以在Geth中执行命令
nodiscover 私链地址,不会在网上看到
在当前目录下执行tail -f eth_output.log可以看到输出日志。
➜ /Users/lion/my_project/_eth/test >tail -f eth_output.log
INFO [10-22|14:50:04] Bloom-bin 升级完成耗时=149.285µs
INFO [10-22|14:50:04] 初始化以太坊协议版本=”[63 62]”网络=1
INFO [10-22|14:50:04] 数据库转换成功
INFO [10-22|14:50:04] 已加载最新本地标头编号=0 hash=5e1fc7...d790e0 td=131072
INFO [10-22|14:50:04] 加载最近的本地完整块数=0 hash=5e1fc7…d790e0 td=131072
INFO [10-22|14:50:04] 加载最近的本地快速块数=0 hash=5e1fc7...d790e0 td=131072
INFO [10-22|14:50:04] 启动 P2P 网络
INFO [10-22|14:50:04] RLPx listener up self=”enode://bcc414219b7423f56da261857508771c229a5ee370e2d5bee7a9d1a3886ae9c207956a80e03f7ba44ed5f9f7777ac64db9b6939d18f3f44786dc6fc5690035b1@[::]:30303?discport=0”
信息 [10-22|14:50:04] IPC 端点打开:/Users/lion/my_project/_eth/test/chain/geth.ipc
INFO [10-22|14:50:05] 映射网络端口 proto=tcp extport=30303 intport=30303 interface=NAT-PMP(10.0.0.1)
后面章节的命令都是启动私链后在Geth javascript控制台操作
5.2.1. 添加和查看帐户
查看账户,可以看到当前账户为空
web3.eth.accounts
[]
创建账户有两种方式,第一种是在创建账户的时候直接初始化密码
web3.personal.newAccount("123456")
“0xbe323cc4fde114269a9513a27d3e985f82b9e25d”
返回的0xbe323cc4fde114269a9513a27d3e985f82b9e25d为账号,123456为账号密码
第二种方法是先创建一个账号,然后输入密码
web3.personal.newAccount()
密码:
重复密码:
“0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70”
这时候我们再查看一下账户,可以看到刚才创建的两个账户已经存在了。
web3.eth.accounts
[“0xbe323cc4fde114269a9513a27d3e985f82b9e25d”,“0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70”]
5.2.2. 开始挖矿和停止挖矿
挖矿执行以下命令:
矿工开始(1)
执行后,通过tail -f eth_output.log的方法查看刚才的日志,可以看到类似如下的日志,说明已经在进行挖矿了。
INFO [10-22|15:01:32] 提交新的挖矿工作 number=70 txs=0 uncles=0 elapsed=2.000s
INFO [10-22|15:01:34] 成功密封新区块 number=70 hash=a0cfd2…f99c06
INFO [10-22|15:01:34] �� 区块达到规范链数=65 hash=3f6d16…586aba
INFO [10-22|15:01:34] �� 挖掘出的潜在区块数=70 hash=a0cfd2…f99c06
INFO [10-22|15:01:34] 提交新的挖矿工作 number=71 txs=0 uncles=0 elapsed=163.977µs
INFO [10-22|15:01:34] 成功密封新区块 number=71 hash=f84b8a…7468e1
INFO [10-22|15:01:34] �� 区块达到规范链数=66 hash=6ca3b9 ...e959e8
INFO [10-22|15:01:34] �� 挖掘出的潜在区块数=71 hash=f84b8a…7468e1
挖矿默认保存到第一个创建的账户0xbe323cc4fde114269a9513a27d3e985f82b9e25d。
block number=66,表示我们创建了66个区块
在以太坊官方网络上,平均每 15 秒产生一个区块
要停止挖矿,请执行以下命令:
矿工。 停止()
停止挖矿后,将不会产生以太币,智能合约和转账等操作将无法进行。
5.2.3. 查看账户余额
查看账户余额的方法如下:
web3.eth.getBalance("0xbe323cc4fde114269a9513a27d3e985f82b9e25d")
1.245e+21
web3.eth.getBalance("0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70")
每次都要记住一长串地址,非常麻烦。 我们可以设置变量acc0表示账户10xbe323cc4fde114269a9513a27d3e985f82b9e25d,acc1表示账户20x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70。
acc0 = web3.eth.accounts[0]
“0xbe323cc4fde114269a9513a27d3e985f82b9e25d”
acc1 = web3.eth.accounts[1]
“0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70”
web3.eth.getBalance(acc0)
1.245e+21
web3.eth.getBalance(acc1)
使用此方法查看格式化的以太币
web3.fromWei(web3.eth.getBalance(acc0))
1245
以太的最小单位是wei(18个零)
因为geth javascript console是基于javascript的,所以也可以自己创建js函数查看所有账户余额
函数 checkAllBalances() {
变种 totalBal = 0;
对于(eth.accounts 中的 var acctNum){
变种账户=以太坊。 帐户[acctNum];
var acctBal = web3.fromWei(eth.getBalance(acct), “ether”);
totalBal += parseFloat(acctBal);
console.log("eth.accounts[" + acctNum + "]: \t" + acct + " \tbalance: " + acctBal + "ether");
}
console.log("总余额:" + totalBal + "ether");
};
检查所有余额()
eth.accounts[0]: 0xbe323cc4fde114269a9513a27d3e985f82b9e25d 余额:1245 以太币
eth.accounts[1]: 0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70 余额:0 以太币
总余额:1245 以太币
如果命令较多,可以将它们保存在脚本中,使用命令加载脚本:loadScript('/path/script/here.js')
5.2.4. 转移操作
从账户 0xbe323cc4fde114269a9513a27d3e985f82b9e25d 转移 3 个以太币到 0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70。 如果未指定 ether,则默认转账为 wei。
web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})
错误:需要身份验证:密码或解锁
在 web3.js:3104:20
在 web3.js:6191:15
在 web3.js:5004:36
在:1:1
直接执行该方法会抛出异常,提示账户被锁
解锁转账账户
web3.personal.unlockAccount(acc0,"123456")
真的
解锁完成后,即可进行转账操作。
web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})
“0x472f26a00d244b91fea9ff05d9cd5ff5259d8618301bb14af4499827eb159056”
但是这时候你去查看,你会发现收款账户还是原来的值。 此时需要执行挖矿命令完成转账。
检查所有余额()
eth.accounts[0]: 0xbe323cc4fde114269a9513a27d3e985f82b9e25d 余额:1245 以太币
eth.accounts[1]: 0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70 余额:0 以太币
总余额:1245 以太币
不明确的
miner.start()
无效的
检查所有余额()
eth.accounts[0]: 0xbe323cc4fde114269a9513a27d3e985f82b9e25d 余额:1257 以太币
eth.accounts[1]: 0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70 余额:3 以太币
总余额:1260 以太币
不明确的
矿工。 停止()
真的