罗韭菜的超详细dapp从零实战(一)-- 如何1分钟获得5k以太币

写在前面:
标题误:其实就是以太坊私链搭建(围笑)

罗韭菜的超详细dapp从零实战(一)-- 如何1分钟获得5k以太币_第1张图片
image.png

本币圈小韭菜,借写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)


罗韭菜的超详细dapp从零实战(一)-- 如何1分钟获得5k以太币_第2张图片
image.png

其中将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,但是一会儿我们要部署智能合约,为了看合约部署成功日志方便起见,建议采用输入日志的方法。
  • 启动成功结果:


    image.png

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

eth:包含一些跟操作区块链相关的方法;
net:包含一些查看p2p网络状态的方法;
admin:包含一些与管理节点相关的方法;
miner:包含启动&停止挖矿的一些方法;
personal:主要包含一些管理账户的方法;
txpool:包含一些查看交易内存池的方法;
web3:包含了以上对象,还包含一些单位换算的方法。

7.创建账户及相关

  • 查看账户

> personal.listAccounts
[]

  • 创建账户

>personal.newAccount('密码')

  • 也可以用以下命令查看账户,默认eth.accounts[0]是coinbase,也就是挖矿获得的以太币奖励会自动转入coinbase账户


    image.png
  • 查看账户余额

    image.png

    -getBalance()返回值的单位是wei,wei是以太币的最小单位,1个以太币=10的18次方个wei。要查看有多少个以太币,可以用web3.fromWei()将返回值换算成以太币。

  • 启动&停止挖矿
    启动:miner.start()

    罗韭菜的超详细dapp从零实战(一)-- 如何1分钟获得5k以太币_第3张图片
    image.png

其中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

你可能感兴趣的:(罗韭菜的超详细dapp从零实战(一)-- 如何1分钟获得5k以太币)