zoukankan      html  css  js  c++  java
  • 在Ubuntu平台搭建以太坊私有链

    要求:

    在Ubuntu平台搭建以太坊私有链,并进行挖矿

     1、安装go语言环境

    (1)下载Linux下go的安装包

    wget https://studygolang.com/dl/golang/go1.10.3.linux-amd64.tar.gz

     (2)下载完后,进入到下载目录,将其解压到 /usr/local 文件夹下

    sudo tar -C /usr/local -xzf go1.10.3.linux-amd64.tar.gz

     在HOME下创建文件夹go

    (3)配置环境变量

    使用sudo vi ~/.bashrc命令编辑bashrc文件。

     将以下命令放入到bashrc文件中

    export G0ROOT=/usr/1ocal/go
    export GOBIN=$GOROOT/bin
    export GOPATH=$HOME/go
    export PATH=$PATH:$GOBIN

     

     使得环境变量生效

     此时go语言环境已经安装完成,输入go version查看安装成功

     安装geth环境

    依次输入以下代码

    sudo apt-get update
    sudo apt-get install software-properties-common
    sudo add-apt-repository -y ppa:ethereum/ethereum
    sudo add-apt-repository -y ppa:ethereum/ethereum-dev
    sudo apt-get update
    sudo apt-get install ethereum

     

     

      

     

     输入geth -h检查以下版本,说明geth客户端安装成功!

     2、安装以太坊客户端Ethereum

    (1)新建一个文件夹,例如mydata,用来保存私有链的数据。创建一个初始化的创世块文件genesis.json

     

     然后将如下的配置信息写入到创世块文件genesis.json中

    {
      "nonce": "0x0000000000000042",
      "difficulty": "0x40000",
      "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "coinbase": "0x0000000000000000000000000000000000000000",
      "timestamp": "0x00",
      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
      "extraData": "0x11bbe8db4e347b4e8c937c1c8370e4b5ed33adb3db69cbdb7a38e1e50b1b82fa",
      "gasLimit": "0xffffffff",
      "alloc": {
        "3282791d6fd713f1e94f4bfd565eaa78b3a0599d": {
          "balance": "1337000000000000000000"
        },
        "17961d633bcf20a7b029a7d94b7df4da2ec5427f": {
          "balance": "229427000000000000000"
        }
      },
      "config": {
            "chainId": 15,
            "homesteadBlock": 0,
            "eip155Block": 0,
            "eip158Block": 0
        }
    }

     保存退出

     (2)初始化创世区块,并指定数据存放路径

     

     这里我用的老师给的创世区块发现是错误的。

    这里我将创世区块换成以下内容:

    {

      "config": {

        "chainId": 666,

        "homesteadBlock": 0,

        "eip150Block": 0,

        "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000",

        "eip155Block": 0,

        "eip158Block": 0,

        "byzantiumBlock": 0,

        "constantinopleBlock": 0,

        "petersburgBlock": 0,

        "istanbulBlock": 0,

        "ethash": {}

      },

      "nonce": "0x0",

      "timestamp": "0x5ddf8f3e",

      "extraData": "0x0000000000000000000000000000000000000000000000000000000000000000",

      "gasLimit": "0x47b760",

      "difficulty": "0x00002",

      "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000",

      "coinbase": "0x0000000000000000000000000000000000000000",

      "alloc": { },

      "number": "0x0",

      "gasUsed": "0x0",

      "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000"

    }

    编辑genesis.json保存并退出

    现在正式开始初始化创世区块,并指定数据存放路径,这里放在我们刚刚建的文件夹mydata下

     (3)启动私有链节点,并将日志输入到mychain.log

    geth --networkid 3 --datadir mydata --identity "mychain" --rpc --rpcaddr 0.0.0.0 --rpcport 8545 --rpcapi "admin,debug,eth,miner,net,personal,shh,txpool,web3" --port 30303 --rpccorsdomain "*" --nodiscover console 2>>mychain.log

     以太坊私有链环境已经搭好,接下在进行简单测试。

    首先这里说一下,其实我这是第二次挖矿了,第一次开始挖矿都会返回null,其实是因为节点版本问题。
    所以接下来我重新启动私有链节点,在启动geth命令行的时候需要添加这两个参数:
    geth
    --datadir "./ethdev" --nodiscover console 2>>get.log --dev --dev. period 1 #添加--dev 参数,启动的时候便产生了一个账户,并且已经挖矿有余额。

     

     4、测试

    (1)创建新账户

    创建新用户之前查看当前账户

     这里是因为我们添加-dev参数后就会自动添加一个账户,并且这个账户是有挖矿余额的。

    接下来开始创建我们需要挖矿的账户

    personal.newAccount("xixi1")      #这里的xixi1是账户的密码

    创建成功将返回账户的地址

    (2)查找已创建的账户

    > eth.accounts

    > personal.listAccounts #两者都可以查询到已经创建的账户

    (3)查询账户余额

    eth.getBalance("账户地址")

     这里查找我创建的第一个账户的余额,引号内输入密码为xixi1对应的账户地址0xc0fac76bfe99f3e68cdd630bd02e180560b6c7ba。

     可以看到显示的是0,是因为我们还没有开始挖矿,所以没有余额。

    #这里我将第一个用户设置成user1,第二个用户设置成user2,以便于后面好操作,不然老是去输入用户的地址很麻烦。

    接下来直接可查询user1和user2账户余额

    (4)开始挖矿

    在挖矿前,先设置挖矿奖励地址(如果不设置的话默认奖励地址为第一个用户)

    miner.setEtherbase(eth.accounts[0])    #这里的0是指的第一个账户,那么第二个账户就是1

     可以看到显示true,说明第二个账户存在。

    再查询一下奖励的地址

    eth.coinbase

     可以看到正是我们第二个账户。

    设置成功后,我们就开始挖矿,调大虚拟机内存,我这里设置的是4g。

    其实在这之前我每次开始挖矿都会返回null,其实是因为节点版本问题。在启动geth命令行的时候需要添加这两个参数。
    在dev环境下验证发现,当执行miner.start()时,返回null。但其实miner已经执行,只不过它在等待你发送交易之后才会生成新的区块。也就是说执行了miner.start(),它一直在等待,这是发送一笔交易,再查看区块高度发现已经增加一块。

     虽然miner.start 还是返回null,但是 eth.blockNumber 却增长了,因此说明可以挖矿了。

    (5)转移以太币

    目的:将0.01以太币从 user1 转移到user2   转移数量为0.01以太币

    amount = web3.toWei(0.01)                                  #首先需要设置转移的以太币数量amount

    eth.sendTransaction({from:user1,to:user2,value:amount}) #将0.01以太币从 user1 转移到user2   转移数量为0.01以太币

     现在查询user2的余额,发现不是0了!

    注意:如果这里查询到user2还是没有余额,就说明没有进行挖矿操作,以致于交易未成功。需要miner.start()开始挖矿,再查询下区块高度即可。挖矿之后就会有余额啦。

     再次转移,可以看到user2余额发生变化

  • 相关阅读:
    EffectiveC#17--装箱和拆箱的最小化
    EffectiveC#16--垃圾最小化
    EffectiveC#15--使用using和try/finally来做资源清理
    NET基础课--对象的筛选和排序(NET之美)
    Objective-C浅拷贝和深拷贝
    IOS viewdidload 方法在 init 方法之前调用
    [iOS]为什么不要在init初始化方法里调用self.view
    为什么init方法里有self.view就会先跑viewdidload方法
    IOS开发中重写init方法使用需谨慎
    The file “XXX.app” couldn’t be opened because you don’t have permission to view it.
  • 原文地址:https://www.cnblogs.com/xixi3/p/12496694.html
Copyright © 2011-2022 走看看