写在前面:
标题误:其实就是以太坊私链搭建(围笑)
本币圈小韭菜,借写dapp毕设之名实发交友帖,同时作为毕设文字与图片记录来源
如果有一起在写以太坊dapp的小伙伴请猛烈地戳笔者❤️加v❤️信❤️
由于网上基于以太坊dapp开发的中文教程较杂且简略(小白不友好),甚至大多已过时,故整合并根据实战整理之,有些地方有疑问,求高手赐教。
注:由于本文作者为二级代码残废,实战时基本遇到了所有教程里有或者没有的报错,因此本文将列举可能会遇到的所有的报错及解决方案,内容较繁,可能引起大神不适,请绕道。
本系列需要你了解区块链和以太坊基本常识(不了解跟着做也ojbk),可关注本文作者的其他文章(也许没有)
本系列均为mac系统上操作
1. 写dapp为什么要搭私链?
因为在以太坊公有链上要智能合约,而智能合约要发起交易就要花费gas。但如果搭私链,通过修改配置,就可以随心所欲更改所有行为的gas费用。既不用同步公有链的庞大数据,也不用花钱购买以太币,很方便测试智能合约,也可以很容易切换接口部署到以太坊公有链上。
2. 工具准备
mac os包管理工具 homebrew here(很重要,安装geth的时候不会走弯路)
geth :即go-ethereum, 以太坊的客户端 here(别尝试下面的方法)
3. 运行以太坊节点
- 查看当前geth节点:
geth account list
- 打开终端,以开发方式启动geth
geth --datadir “~/ethdev” --dev
- 输入以下命令,若成功显示输出帮助,则表示已安装成功
geth -h
4. 建立创世块
- 创建一个private的根目录(这里会存入所有私链的内容),在里面新建创世genesis.json文件。具体内容here
超级重要的创世文件!网上有很多genesis.json, 但是一定要从官网下最新的,因为同一个网络中,创世块必须是一样的,否则无法联通。
因此如何配置genesis.json,是非常关键的,如果产生错误,有些会导致无法初始化私链,也会发生很多奇怪的错误。
以下格式json文件适用geth (v 1.8.1)
其中将chainId 从0改成10,否则后面部署智能合约会有问题!!
需要注意的参数:
- difficulty: 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度。以太坊公有链15s出一个块,一个块5个以太币,这里随心所欲地改,届时就可享受如标题所述快感
- coinbase: 矿工的账号,随便填,反正也可以改。
- timestamp: 设置创世块的时间戳
- gasLimit: 设置对gas消耗总量的限制,用来限制区块能包含的交易信息总和,因为私有链,填最大即可
5. 创建私有链
geth --datadir "./" init genesis.json
在这一步,你可能会遇到以下我都遇到过的报错!!!
(1) Fatal: invalid genesis file: missing 0x prefix for hex data
解决:16进制数据需要加上0x前缀,也就是coinbase difficulty gaslimit 之类的地方。
(2) Fatal: invalid genesis file: hex string has odd length
解决:从v1.6开始,设置的十六进制数值,不能是奇数位, 比如不能是0x0,而应该是0x00。
(3) Error: invalid sender undefined
解决:这个错误不会导致初始化失败,但是会在以后的转账(eth.sendTransaction),或者部署智能合约的时候产生。解决方法就是chainId 不能设置为0。 如果你完全按照github上给的官方配置文件,就会产生这个错误。
(4) Fatal: failed to write genesis block: genesis has no chain configuration
解决: 这个错误信息,就是说,你的json文件中,缺少config部分。看到这个信息,那就是你下的是过时教程里的json文件了hiahia。
结果:(目录结构)
private
├── chain
│ ├── geth
│ │ └── chaindata
│ │ │ ├── 000055.log
│ │ │ ├── CURRENT
│ │ │ ├── LOCK
│ │ │ ├── LOG
│ │ │ └── MANIFEST-000000
│ │ ├── lightchaindata
│ │ ├── LOCK
│ │ └── nodekey
│ └── keystore
└── genesis.json
6.启动
-
geth --datadir "./" --nodiscover console 2>>geth.log
注意,这一句是输入了log日志,之后启动挖矿时会返回null。
不要慌!!!要查看输出,需要进入到private目录:tail -f geth.log
- 如果直接要在终端看输出,去掉尾部即可:
geth --datadir "./" --nodiscover console
,但是一会儿我们要部署智能合约,为了看合约部署成功日志方便起见,建议采用输入日志的方法。 -
启动成功结果:
这是一个交互式的 JavaScript 执行环境,在这里面可以执行 JavaScript 代码,其中 > 是命令提示符。在这个环境里也内置了一些用来操作以太坊的 JavaScript 对象,可以直接使用这些对象。这些对象主要包括:
eth:包含一些跟操作区块链相关的方法;
net:包含一些查看p2p网络状态的方法;
admin:包含一些与管理节点相关的方法;
miner:包含启动&停止挖矿的一些方法;
personal:主要包含一些管理账户的方法;
txpool:包含一些查看交易内存池的方法;
web3:包含了以上对象,还包含一些单位换算的方法。
7.创建账户及相关
- 查看账户
> personal.listAccounts
[]
- 创建账户
>personal.newAccount('密码')
-
也可以用以下命令查看账户,默认eth.accounts[0]是coinbase,也就是挖矿获得的以太币奖励会自动转入coinbase账户
-
查看账户余额
-getBalance()
返回值的单位是wei,wei是以太币的最小单位,1个以太币=10的18次方个wei。要查看有多少个以太币,可以用web3.fromWei()
将返回值换算成以太币。 -
启动&停止挖矿
启动:miner.start()
其中start的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的DAG文件,这个过程有点慢,不要慌!!等进度达到100%后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。
停止挖矿:miner.stop()
输入的字符会被挖矿刷屏信息冲掉,没关系!!
- 这时候再查看一下eth.accounts[0]的余额,有惊喜!
8.发送交易
amount = web3.toWei(5,'ether')
"5000000000000000000"
eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
Error: account is locked
at web3.js:3119:20
at web3.js:6023:15
at web3.js:4995:36
at:1:1
报错是因为账户**每隔一段时间就会被锁住,要发送交易,必须先解锁账户,因此我们要解锁账户:
personal.unlockAccount(eth.accounts[要解锁的账户索引],'密码')
正确的情况下返回交易的哈希值
> eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
"0xed629a75b4127d0a075393f667b62b5ebc578bd358ce8000029deb6d66e9696b"
若要查看该笔交易的内容,则复制上面的哈希值,使用getTransaction查看具体内容
> eth.getTransaction("0xed629a75b4127d0a075393f667b62b5ebc578bd358ce8000029deb6d66e9696b")
{
blockHash: "0x1f126ad8efc32b82fc078e2b0fac9954f62642a593d06f6e4780f8e9faed0826",
blockNumber: 1,
from: "0xcffe5bd058e725e8ee3d0a1d9bb7a5794a9ddc7b",
gas: 90000,
gasPrice: 1,
hash: "0xed629a75b4127d0a075393f667b62b5ebc578bd358ce8000029deb6d66e9696b",
input: "0x",
nonce: 0,
r: "0x155833eb7260c79dc910b66b6c3b32058f7245c0ea25a24c2e575d3f9f8c42ed",
s: "0x6b4a5f97262b8ea32d9c58be3360377a64373ef468f526860f672c76c76f7427",
to: "0xc2dec5a4c6e0e55651baaf9be4f91dbf2aadc017",
transactionIndex: 0,
v: "0xa96",
value: 5000000000000000000
}
>
本来想日更三篇,写到智能合约与web的交互,但是笔者实在太累了(女大学生的日常放弃)...
感谢下浙大炒币团杨老板,如果有一起在写以太坊dapp的小伙伴请猛烈地戳笔者❤️加v❤️信❤️
ref:
here
here