主页 > imtoken官方版 > 以太坊(Ethereum)构建私有区块链

以太坊(Ethereum)构建私有区块链

imtoken官方版 2023-02-01 07:54:35

加载自:

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 以太币

不明确的

矿工。 停止()

真的