Ethereum以太坊区块链应用实践

以太坊(英语:Ethereum)是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether,又称“以太币”)提供去中心化的虚拟机(称为“以太虚拟机”Ethereum Virtual Machine)来处理点对点合约。

——维基百科《以太坊

以太坊官网:https://www.ethereum.org/

本文基于以太坊平台,实现一个简单的私有链应用。

重要参考:

https://github.com/sunnyFrank/Dapp-development

https://g2ex.github.io/2017/09/12/ethereum-guidance/

测试开发环境:Ubuntu 16.04

目录:

一、环境搭建

二、建立和测试私有链

一、环境搭建

  1. 下载钱包:https://github.com/ethereum/mist/releases
  2. 添加ethereum PPA
    sudo add-apt-repository ppa:ethereum/ethereum
    sudo apt-get update
  3. 安装geth
    sudo apt-get install ethereum
  4. 安装官方智能合约语言Solidity
    sudo apt-get install solc

二、建立和测试私有链

  1. 准备创世快,准备一个目录例如/data,在目录下创建genesis.json,输入以下内容
    {
      "config": {
        "chainID": 1024,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
      },
      "alloc": {},
      "coinbase": "0x0000000000000000000000000000000000000000",
      "difficulty": "0x400",
      "extraData": "",
      "gasLimit": "0x2fefd8",
      "nonce": "0xdeadbeefdeadbeef",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "timestamp": "0x00"
    }
  2. 比较重要的参数是chainID,chainID是区块链的网络ID,不同ID的网络节点无法互相连接,以太坊公链ID是1,为了不与公链冲突,我们随意指定一个大于1的ID就好。(会不会与其他私有链冲突?)
  3. 在/data/下创建节点文件夹,如/data/node0
  4. 初始化node0
    geth --datadir node0 init genesis.json
    
  5. 启动私有链节点,如果钱包是打开连上公链的,注意端口冲突
    geth --identity "TestNode0" --rpc --rpcport "8500" --datadir node0 --port "30300" --nodiscover console
    
  6. 启动之后便进入控制台,创建账户,输入两遍密码便创建成功
    > personal.newAccount()
  7. 有了账户便可以挖矿了
    > miner.start(1)
    

    参数1表示启用一个线程 小锤子图标表示挖矿成功,后面有区块编号

  8. 挖到区块之后停止挖矿
    > miner.stop()
    
  9. 查看账户余额
    > eth.getBalance(eth.accounts[0])
  10. 参考步骤3~6,创建第二个节点node1,记下node1里的账户名,即0x…的字符串,用于接下来的转账步骤
  11. 解锁账户
    > personal.unlockAccount(eth.accounts[0])
  12. 货币转换> amount = web3.toWei(5,’ether’)
  13. 转账
    eth.sendTransaction({from:eth.accounts[0],to:"0x0c920cf228fe46d77f3e0d4712be85cb6b7dfacf",value:amount})

    将to后面的账户名替换成步骤10的账户名

  14. 挖矿(记账),转账之后的交易记录只是在交易表里,要生成区块才算交易完成,此时如果node0和node1建立了连接,在任意一个节点执行挖矿——也就是记账都行,不过在哪个节点记账,挖矿的奖励就会发给哪个节点的账户。节点之间连接参考步骤
    miner.start(1);admin.sleepBlocks(1);miner.stop();
  15. 查看节点encode信息
    > admin.nodeInfo.enode
  16. 添加节点
    admin.addPeer("encode://.....")

    有说需要将[::]替换成127.0.0.1,我这边测试并不需要,如果无法添加节点可以尝试一下,我这边出现不能添加节点的情况是端口冲突,更改节点的端口之后就Ok了。

  17. 查看是否添加成功的两个方法
    > admin.peers
    
    > eth.peerCount
  18. 重新启动节点,添加参数ipcpath,只有添加了这个参数,钱包才能对应到私有链
    geth --identity "TestNode0" --rpc --rpcport "8500" --datadir node0 --port "30300" --nodiscover --ipcpath $HOME/.ethereum/geth.ipc console
    

    点击Launch Application进入钱包

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据