美文网首页
Ethereum-1 Create a private chai

Ethereum-1 Create a private chai

作者: Kylin824 | 来源:发表于2019-07-12 11:09 被阅读0次

    以太坊网络类型

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

    目标

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

    所需软件

    • Geth

      This is the Go implementation of an Ethereum node, and is the basis for any interactions with the Ethereum blockchain. Running this locally will allow you to easily interact with the Ethereum blockchain. Read the go-ethereum installation instructions.

      以太坊的客户端,通过Geth可以实现以太坊的各种功能,如账户的新建编辑删除,开启挖矿,ether 币的转移,智能合约的部署和执行等等。

    • MetaMask

      MetaMask is an extension for accessing Ethereum enabled distributed applications, or "Dapps" in your normal Chrome browser!

      MetaMask是一个轻量级的以太坊钱包,它是一个Chrome插件,因此使用MetaMask可以非常方便地在浏览器中完成以太坊转账等操作。

    操作步骤

    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"
          }
      

      ​ 如下图:

    • 初始化创世区块
      cd到privateChain路径中
      geth --datadir "." init genesis.json
      

      命令的主体是geth init,表示初始化区块链,命令可以带有选项和参数,其中 —datadir 选项后面跟一个目录名,这里指定为当前目录, genesis.jsoninit 命令的参数。运行上面的命令,会读取 genesis.json 文件,根据其中的内容,将创世区块写入到区块链中。如果看到 log 信息中含有 Successfully wrote genesis state 字样,说明初始化成功。

      如下图:

     初始化成功后的目录如下:
    
     其中 `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
      

    相关文章

      网友评论

          本文标题:Ethereum-1 Create a private chai

          本文链接:https://www.haomeiwen.com/subject/eqelkctx.html