主页 > imtoken钱包网址 > Ethereum Bootstrap 以太坊本地私有链开发环境搭建

Ethereum Bootstrap 以太坊本地私有链开发环境搭建

imtoken钱包网址 2023-04-27 06:28:23

通过本文介绍的方法和项目中的脚本,我们可以快速搭建自己的私有链进行开发和测试。

存储库中包含的工具是:

测试账号的私钥是Github上的公开数据,不得在正式环境和公链上使用。 如果您在测试环境之外使用这些私钥,您的资金就会被盗!

准备在本地安装go-ethereum和solc,执行geth和solc命令。 如果操作系统是ubuntu,直接安装以太坊官方安装包即可。 通过git clone命令将这个仓库下载到本地。 安装 expect,它被工具脚本用来自动化一些流程。 例如在ubuntu上: sudo apt-get install expect 启动geth 进入仓库目录: cd ethereum-bootstrap 导入测试账户私钥: ./bin/import_keys.sh 初始化区块链: ./bin/private_blockchain_init.sh 输出结果为类似下面,$(DIR))代表你的下载路径:

 INFO [09-25|11:07:26] Allocated cache and file handles         database=$(DIR)/ethereum-bootstrap/data/geth/chaindata cache=16 handles=16
 INFO [09-25|11:07:26] Successfully wrote genesis state         database=chaindata                                      hash=194258…f0efa3
 INFO [09-25|11:07:26] Allocated cache and file handles         database=$(DIR)/ethereum-bootstrap/data/geth/lightchaindata cache=16 handles=16
 INFO [09-25|11:07:26] Successfully wrote genesis state         database=lightchaindata                                      hash=194258…f0efa3

为了解决后续操作锁定账户的问题,修改该目录下的bin/private_blockchain.sh文件,在$geth后添加--unlock 0 --password值。 0表示解锁第0个账号,值包括你在步骤2中设置的密码文件的地址路径需要你自己创建。 这样就不需要再次解锁账户了。 启动私有区块链节点:./bin/private_blockchain.sh。 启动成功后,可以看到类似如下的输出:

private-started.png

此时以太坊交互控制台已经启动,我们可以开始测试和开发了。

注意:工具脚本假定你的geth安装在默认位置,可以直接通过geth执行。 如果 geth 命令安装在非标准位置,您可以设置 geth 环境变量来指定 geth 可执行文件的路径。 例如:

GETH=/some/weird/dir/geth ./bin/import_keys.sh

通过挖矿为账户发行以太币

查看账户余额:

> web3.eth.getBalance(web3.eth.accounts[0])
2e+30

您可以通过挖矿向第一个账户发行以太币:

> miner.start(1)
I0822 17:17:43.496826 miner/miner.go:119] Starting mining operation (CPU=1 TOT=3)
I0822 17:17:43.497379 miner/worker.go:573] commit new work on block 30 with 0 txs & 1 uncles. Took 527.407µs

需要调用 miner.stop 停止挖矿:

> miner.stop()
true
> web3.eth.getBalance(web3.eth.accounts[0])
2.000000000105e+30

使用前解锁您的帐户:

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

使用以太坊控制台编译和部署智能合约

在contracts目录下有一个智能合约示例文件Token.sol,通过Solidity语言实现了基本的token功能。 合约持有人可以发行代币,用户可以相互转账。

我们可以使用以太坊控制台来编译和部署这个合约。 以太坊控制台是最基本的工具,用起来会比较麻烦。 社区还提供了其他更方便的部署工具,这里不再赘述。

第一步,我们先编译合约代码。 新建一个ssh会话,切换到geth用户环境su-geth,输入:echo "var tokenCompiled=`solc --optimize --combined-json abi,bin,interface contracts/Token.sol`" > token.js。 (这一步是编译合约代码,将生成的内容放到当前路径下的token.js文件中)

切换到以太坊控制台并加载 js 文件:

loadScript("token.js")

通过tokenCompiled.contracts["contracts/Token.sol:Token"].bin可以看到编译后的二进制代码,通过tokenCompiled.contracts["contracts/Token.sol:Token"]可以看到合约的ABI。阿比。

以变​​量的形式取出合约的二进制代码和ABI。

var tokenContractsBin = "0x" + tokenCompiled.contracts["contracts/Token.sol:Token"].bin;
var tokenContractsAbi = tokenCompiled.contracts["contracts/Token.sol:Token"].abi;

接下来,我们需要将编译好的合约部署到网络中。

首先,我们使用 ABI 在 javascript 环境中创建一个合约对象:

var contract = web3.eth.contract(JSON.parse(tokenContractsAbi));

我们通过合约对象来部署合约:

var initializer = {from: web3.eth.accounts[0], data: tokenContractsBin, gas: 300000};
var token = contract.new(initializer);

contract.new 方法的第一个参数设置了新合约创建者的地址,新合约的代码数据,以及创建新合约所用的 gas。 Gas是一个预估值,只要超过所需的gas,剩余的gas会在合约创建后返还给合约创建者。

contract.new 方法的第二个参数设置了一个回调函数,告诉我们部署是否成功。

contract.new 执行时会提示输入钱包密码。 成功执行后,我们的合约 Token 已经广播到网络中。 至此,我们只需要等待矿工将我们的合约打包保存到以太坊区块链中,部署就完成了。

在公链上,矿工打包平均需要15秒以太坊重启挖矿,但在私链上,需要我们自己来完成。 首先开始挖矿:

miner.start(1)

这时候需要等待一段时间,以太坊节点会生成挖矿所需要的数据,这些数据会保存在内存中。 数据生成后,就会开始挖矿,稍后你可以在控制台输出中看到这样的内容:

:hammer:mined potential block

,这意味着一个区块已经被挖出以太坊重启挖矿,并且合约已经部署到以太坊网络上! 此时我们可以关闭挖矿:

miner.stop()

接下来我们可以调用合约。 首先通过token.address获取部署合约的地址,可以在新建合约对象时使用。 这里我们直接使用原来的合约对象:

// 本地钱包的第一个地址所持有的token数量
> web3.eth.getBalance(web3.eth.accounts[0])
0
// 发行100个token给本地钱包的第一个地址
> token.issue.sendTransaction(web3.eth.accounts[0], 100, {from: web3.eth.accounts[0]});
I1221 11:48:30.512296   11155 xeth.go:1055] Tx(0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c
"0xc0712460a826bfea67d58a30f584e4bebdbb6138e7e6bc1dbd6880d2fce3a8ef"
// 发行token是一个transaction, 因此需要挖矿使之生效
> miner.start(1)
:hammer:mined potential block
> miner.stop()
// 再次查询本地钱包第一个地址的token数量
> token.getBalance(web3.eth.accounts[0])
100
// 从第一个地址转30个token给本地钱包的第二个地址
> token.transfer.sendTransaction(web3.eth.accounts[1], 30, {from: web3.eth.accounts[0]})
I1221 11:53:31.852541   11155 xeth.go:1055] Tx(0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b) to: 0x37dc85ae239ec39556ae7cc35a129698152afe3c
"0x1d209cef921dea5592d8604ac0da680348987b131235943e372f8df35fd43d1b"
> miner.start(1)
:hammer:mined potential block
> miner.stop()
> token.getBalance(web3.eth.accounts[0])
70
> token.getBalance(web3.eth.accounts[1])
30

其他

私有链的所有数据都会放在仓库根目录下的data目录下。 删除该目录可以清除所有数据并重新启动新环境。 solidity_compiler_helper,可以使用这个小工具来部署,比较方便。