主页 > imtoken唯一官网 > 【动手实践】如何10分钟搭建一条以太坊私链?

【动手实践】如何10分钟搭建一条以太坊私链?

imtoken唯一官网 2023-01-17 02:36:00

640?wx_fmt=jpeg

在开发以太坊时,往往需要搭建一条以太坊私有链。 作者熊立兵的这篇文章,将在10分钟内教你如何在Mac上搭建。

作者|熊立兵

整理 |

在阅读本文之前,您应该对以太坊语言有一定的了解。 如果您还不知道,我建议您阅读什么是以太坊。

go-ethereum 客户端安装

go-ethereum 客户端,通常称为 Geth,是一个命令行界面,可执行在 Go 中实现的完整以太坊节点。 Geth 得益于 Go 语言的多平台特性,支持在多个平台(如 Windows、Linux、Mac)上使用。 Geth是以太坊协议的具体实现。 通过Geth,您可以实现以太坊的各种功能,如创建、编辑和删除账户,启用挖矿,转账以太币,部署和执行智能合约等。 因此,我们选择geth工具进行开发。 由于我是mac,所以优先使用mac进行开发。 mac中的geth安装如下:

brew tap 以太坊/以太坊

酿造安装以太坊

检查是否安装成功

geth--帮助

如果输出一些帮助提示命令,则安装成功。

其他平台可以参考Geth安装

打造私链

以太坊支持自定义创世块。 要运行一条私有链,我们需要定义我们自己的创世块。 创世块信息以json格式写在配置文件中。 先将以下内容保存到一个json文件中,比如genesis.json。

json文件内容如下:

{

“配置”:{

“链号”:10,

“家园块”:0,

“eip155块”:0,

“eip158块”:0

},

“分配”:{},

“币库”:“0x0000000000000000000000000000000000000000”,

“难度”:“0x20000”,

“额外数据”:“”,

“gasLimit”:“0x2fefd8”,

“随机数”:“0x0000000000000042”,

“混合哈希”:“0x0000000000000000000000000000000000000000000000000000000000000000”,

“parentHash”:“0x0000000000000000000000000000000000000000000000000000000000000000”,

“时间戳”:“0x00”

}

向左滑动查看未显示的代码部分(下同)

初始化:写入创世块

准备好创世块json配置文件后,需要初始化区块链,将上述创世块信息写入区块链。 首先新建一个目录data0,用来存放区块链数据(其实这个目录data0相当于一个根节点,当我们根据genesis.json生成一个根节点,其他人就可以连接到这个根节点,从而进行交易) . data0目录结构如图:

640?wx_fmt=jpeg

接下来进入privatechain目录,执行初始化命令:

cd私链

geth --datadir data0 init genesis.json

上面命令的主体是geth init,意思是初始化区块链。 该命令可以有选项和参数,其中-datadir选项后跟一个目录名,这里是data0,表示指定的数据存储目录为data0,genesis.json是init命令的参数。

运行上述命令会读取genesis.json文件,并根据其内容将创世块写入区块链。 如果在日志信息中看到Successfully written genesis state字样,说明初始化成功。

初始化成功后的目录如下:

640?wx_fmt=jpeg

其中,区块数据存放在geth/chaindata,账户数据存放在keystore。

启动私有链节点

初始化完成后,你就会拥有自己的私有链,然后就可以启动自己的私有链节点,进行一些操作了。 在终端中输入以下命令启动节点:

geth --datadir data0 --networkid 1108 控制台

上面命令的主体是geth console,意思是启动节点,进入交互式控制台。 --datadir 选项指定使用 data0 作为数据目录。 --networkid 选项后跟一个数字,这里是1108,表示指定私有链的network id为1108。 连接到其他节点时将使用网络 ID。 以太坊公网的network id为1,为了不和公链网络冲突,运行私链节点时必须指定自己的network id(以上命令可能会运行失败,我直接重启mac,然后进入privateChain目录,简单粗暴)。

运行上述命令后,区块链节点启动,进入Javascript控制台:

640?wx_fmt=jpeg

这是一个交互式 Javascript 执行环境,可以在其中执行 Javascript 代码,其中 > 是命令提示符。 在这个环境中,还内置了一些操作以太坊的Javascript对象,可以直接使用这些对象。 这些对象主要包括:

eth:包含一些操作区块链相关的方法

net:包含以下方法查看p2p网络状态

admin:包含一些管理节点相关的方法

miner:包含一些启动和停止挖矿的方法

personal:主要包括一些管理账户的方法

txpool:包含一些查看交易内存池的方法

web3:包含以上对象,还包含一些单位换算的方法

使用 Javascript 控制台

进入以太坊Javascript控制台后,可以使用内置对象进行一些操作。 这些内置对象提供了很多功能,比如查看区块和交易、创建账户、挖矿、发送交易、部署智能合约等。接下来介绍几个常用的功能。 以下操作中,前面带>的表示在Javascript Console中执行的命令。

创建账户

我们之前只是建了一条私链,没有自己的账号。 可以在js控制台输入eth.accounts验证:

> eth.accounts

[]

此时没有账号,再使用个人对象创建账号:

> 个人。 新账户()

> 密码:

> 重复密码:

“0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f”

Passphrase其实就是密码的意思。 输入密码两次后,创建一个帐户。 再次执行命令:

> 个人。 新账户()

> 密码:

> 重复密码:

“0x46b24d04105551498587e3c6ce2c3341d5988938”

这时候再看账目,竟然有两个。

> eth.accounts

[“0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f”,“0x46b24d04105551498587e3c6ce2c3341d5988938”]

账号默认保存在数据目录下的keystore文件夹中。 查看目录结构,发现data0/keystore中多了两个文件。 这两个文件对应刚刚创建的两个账户。 这是一个json格式的文本文件,可以打开查看。 存储在其中的私钥是用密码加密的。 信息。

640?wx_fmt=jpeg

json文件中的信息格式如下:

{

“地址”:“4a3b0216e1644c1bbabda527a6da7fc5d178b58f”,

“加密货币”:{

“密码”:“aes-128-ctr”,

“密文”:“238d6d48126b762c8f13e84622b1bbb7713f7244c2f24555c99b76396fae8355”,

“密码参数”:{

“四”:“d0f5a3d3e6c1eeec77bf631bc938725d”

},

“kdf”:“加密”,

“kdfparams”:{

“dklen”:32,

“n”:262144,

“p”:1,

“r”:8,

“盐”:“70dc72c4eb63bea50f7637d9ff85bb53f6ca8ace17f4245feae9c0bc9abaad82”

},

“mac”:“bd7fc0c937c39f1cbbf1ca654c33b53d7f9c644c6dacfeefe1641d2f3decea04”

},

“ID”:“57803d82-0cd4-4a78-9c29-9f9252fdcf60”,

“版本”:3

}

查看账户余额

eth 对象提供了查看账户余额的方法:

> eth.getBalance(eth.accounts[0])

> eth.getBalance(eth.accounts[1])

目前两个账户的以太币余额为0以太坊区块链搭建,要使账户有余额,可以从其他账户转账,或者通过挖矿获得以太币奖励。

开始和停止挖矿

通过 miner.start() 开始挖矿:

> miner.start(10)

start参数表示用于挖矿的线程数。 第一次开始挖矿,首先会生成挖矿所需的DAG文件。 这个过程有点慢。 进度达到100%后开始挖矿,屏幕上会刷新挖矿信息。

如果进度达到100%后想停止挖矿,可以在js控制台中输入

矿工停止():

注意:输入的字符会被挖矿刷新画面信息冲掉,没关系,输入完整的miner.stop()回车即可停止挖矿。

挖出一个区块将奖励5 ETH,挖矿获得的奖励将进入矿工账户。 这个账户叫做 coinbase。 默认情况下,coinbase 是本地账户中的第一个账户:

> eth.coinbase

“0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f”

当前coinbase为0号账户,如果想将挖矿收益转移到其他账户,可以通过miner.setEtherbase()将其他账户设置为coinbase:

> miner.setEtherbase(eth.accounts[1])

真的

> eth.coinbase

“0x46b24d04105551498587e3c6ce2c3341d5988938”

挖出区块后,账户 0 中应该有余额:

> eth.getBalance(eth.accounts[0])

2.31e+21

getBalance()返回值的单位是wei,是ether的最小单位,1 ether = 10的wei的18次方。 要查看您有多少以太币,您可以使用 web3.fromWei() 将返回值转换为以太币:

> web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')

2310

发送交易

截至目前,账户1的余额仍为0:

> eth.getBalance(eth.accounts[1])

您可以通过发送交易将 10 个以太币从账户 0 转移到账户 1:

> amount = web3.toWei(10,'ether')

“10000000000000000000”

> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

错误:需要身份验证:密码或解锁

在 web3.js:3143:20

在 web3.js:6347:15

在 web3.js:5081:36

在:1:1

这里报错。 原因是帐户每隔一段时间就会被锁定。 要发送交易,必须先解锁帐户。 由于我们要从账户 0 发送交易,因此必须解锁账户 0:

> personal.unlockAccount(eth.accounts[0])

解锁账户 0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f

密码:

真的

输入创建账户时设置的密码即可成功解锁账户。 然后再次发送交易:

> amount = web3.toWei(10,'ether')

“10000000000000000000”

> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

信息 [03-07|11:13:11] 提交的交易 fullhash=0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6 收件人=0x46B24d04105551498587e398d6 CE2

“0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6”

让我们检查帐户 1 中的余额:

> eth.getBalance(eth.accounts[1])

发现还没有转账。 此时交易已经提交到区块链,但是还没有处理。 这可以通过检查 txpool 来验证:

> txpool.status

{

待定:1,

排队:0

}

其中有一个pending transaction,意思是已经提交但是还没有处理的交易。

处理交易需要挖矿。 这里开始挖矿,等待挖出一个区块后停止挖矿:

> miner.start(1);admin.sleepBlocks(1);miner.stop();

当 miner.stop() 返回 true 时,txpool 中的待处理交易数应该为 0,表示交易已经处理完毕,账户 1 应该已经收到币:

> web3.fromWei(eth.getBalance(eth.accounts[1]),'ether')

10

查看交易和区块

eth 对象封装了查看交易和区块信息的方法。

查看当前区块总数:

> eth.blockNumber

463

按块号查看块:

> eth.getBlock(66)

{

难度:135266,

额外数据:“0xd783010802846765746886676f312e31308664617277696e”,

气体限制:3350537,

使用的气体:0以太坊区块链搭建

散列:“0x265dfcc0649bf6240812256b2b9b4e3ae48d51fd8e43e25329ac111556eacdc8”,

logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",

矿工:“0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f”,

混合哈希:“0xaf755722f62cac9b483d3437dbc795f2d3a02e28ec03d39d8ecbb6012906263c”,

随机数:“0x3cd80f6ec5c2f3e9”,

数量:66,

parentHash: "0x099776a52223b892d13266bb3aec3cc04c455dc797185f0b3300d39f9fc0a8ec",

收据根:“0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421”,

sha3Uncles:“0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347”,

尺寸:535,

stateRoot:“0x0c9feec5a201c8c98618331aecbfd2d4d93da1c6064abd0c41ae649fc08d8d06”,

时间戳:1520391527,

总难度:8919666,

交易:[],

交易根:“0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421”,

叔叔们:[]

}

按交易哈希查看交易:

> eth.getTransaction("0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6")

{

块哈希:“0x1cb368a27cc23c786ff5cdf7cd4351d48f4c8e8aea2e084a5e9d7c480449c79a”,

块号:463,

来自:“0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f”,

气体:90000,

gasPrice: 18000000000,

散列:“0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6”,

输入:“0x”,

随机数:0,

r: "0x31d22686e0d408a16497becf6d47fbfdffe6692d91727e5b7ed3d73ede9e66ea",

s: "0x7ff7c14a20991e2dfdb813c2237b08a5611c8c8cb3c2dcb03a55ed282ce4d9c3",

至:“0x46b24d04105551498587e3c6ce2c3341d5988938”,

交易指数:0,

五:“0x38”,

值:100000000000000000000

}

看完就来试试吧!

关于作者:

熊立兵,牛蛙软件CTO,区块链博主,区块链博主,区块链大本营特约专栏作家。 擅长Java/Python/JavaScript语言,曾就职于创新工场(点心队)、猎豹移动,参与过Android优化大师、清理大师等移动应用开发。外号小熊,特邀专栏作家区块链大本营博士,对底层公链和区块链技术落地有深入研究。

本文原文链接:

#更多的

最新热点文章:

640?wx_fmt=png

扫描二维码加入区块链大本营读者群,群满后加微信17600222208进群

640?wx_fmt=gif