Ethereum-1 Create a private chai

2019-07-12  本文已影响0人  Kylin824

以太坊网络类型

类型 特点
主网络 MainNet 官方的、全球化的、真实交易、300w+节点、同步慢、不适合测试
测试网络 TestNet 官方的、全球化的测试环境,同步慢
本地私有网络 local private testnet 私人的、本地的、节点少、方便测试

目标

本地搭建以太坊私有网络并进行挖矿与交易

所需软件

操作步骤

  1. 创建创世区块

    • 配置json

      以太坊支持自定义创世区块,要运行私有链,我们就需要定义自己的创世区块,创世区块信息写在一个 json 格式的配置文件中。首先新建一个文件夹命名privateChain,创建一个 json 文件,命名genesis.json,内容如下:

        {
          "config": {
                "chainId": 10, 
                "homesteadBlock": 0,
                "eip155Block": 0,
                "eip158Block": 0
            },
          "alloc"      : {},
          "coinbase"   : "0x0000000000000000000000000000000000000000",
          "difficulty" : "0x20000",
          "extraData"  : "",
          "gasLimit"   : "0x2fefd8",
          "nonce"      : "0x0000000000000042",
          "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
          "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
          "timestamp"  : "0x00"
        }
    

    ​ 如下图:

 初始化成功后的目录如下:
 其中 `geth/chaindata` 中存放的是区块数据,`keystore` 中存放的是账户数据。
  1. 启动私有链

    geth --rpc --rpcapi "db,eth,net,web3,personal" --datadir "." console 2>> testPrivate.log
    

    使用--rpc表示启用HTTP-RPC,我们可以指定监听地址以及端口,如果不写--rpcaddr--rpcport的话,就是默认的http://localhost:8545--rpcapi表示基于HTTP-RPC接口提供的API,默认只有eth,net,web3。命令的主体是 geth console,表示启动节点并进入交互式控制台,2>> testPrivate.log是把日志信息输出到testPrivate.log文件中以便查看,在linux环境中可以再开一个终端执行tail -f testPrivate.log来实时查看日志。

    运行结果将启动节点并进入JavaScript Console:

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

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

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

  1. 创建新账户

    查看账户:

    > eth.accounts
    []
    

    一开始没有账户,接下来使用 personal 对象来创建一个账户:

    > personal.newAccount()
    > Passphrase:
    > Repeat passphrase:
    "0xa3331d791e2d650044d246ac92c3b0dd48a5950a"
    

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

    > personal.newAccount()
    > Passphrase:
    > Repeat passphrase:
    "0x5d72ca56edd44e4c8345054d2cbce325d78494a7"
    

    这时候再去看账户,就有两个了。

    > eth.accounts
    ["0xa3331d791e2d650044d246ac92c3b0dd48a5950a","0x5d72ca56edd44e4c8345054d2cbce325d78494a7"]
    

    账户默认会保存在数据目录的 keystore 文件夹中。查看目录结构,发现 data0/keystore 中多了两个文件,这两个文件就对应刚才创建的两个账户,这是 json 格式的文本文件,可以打开查看,里面存的是私钥经过密码加密后的信息。

查看账户余额:

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

目前两个账户的以太币余额都是 0,要使账户有余额,可以从其他账户转账过来,或者通过挖矿来获得以太币奖励。

  1. MetaMask导入账户

    • MetaMask选择本地网络

依次选择keystore文件夹中的两个json文件进行导入

  1. 开始挖矿

    查看当前区块数:

    > eth.blockNumber
    0
    

    当前区块数为0

    启动挖矿
    > miner.start()
    null
    

    Windows命令行测试时会返回null,此时实际上已经开始执行挖矿,查看测试日志如下:

可见已经开始进行挖矿,再次查看区块数:

> eth.blockNumber
129

此时查看第一个账户的余额可以看到变化:

> eth.getBalance(eth.accounts[0])
1.66e+21

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

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

此时查看MetaMask中账户0的余额:

  1. 发起交易

    通过账户0转10个以太币给账户1

    > eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(10,'ether')})
    Error: authentication needed: password or unlock
        at web3.js:3143:20
        at web3.js:6347:15
        at web3.js:5081:36
        at <anonymous>:1:1
    

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

    > personal.unlockAccount(eth.accounts[0])
    Unlock account 0xa3331d791e2d650044d246ac92c3b0dd48a5950a
    Passphrase:
    true
    

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

    > eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(10,'ether')})
    "0xd107a556d40695f2d31826692b4e907787de6f881c725abf0116fd0722560e2b"
    

    交易成功。(进行交易时需保证miner在挖矿,否则交易会被中止,等待矿工挖矿才能完成)

    查看账户1余额:

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

    查看MetaMask余额:

由于节点一直进行挖矿,所以账户0的余额会不断增加,账户1的余额为10个以太币

  1. 通过MetaMask发起交易

...

  1. 停止挖矿

    > miner.stop()
    
  2. 退出geth

    > exit
    
上一篇下一篇

猜你喜欢

热点阅读