zoukankan      html  css  js  c++  java
  • 以太坊私有链挖矿操作指南

    什么是Ethereum(以太坊)

      以太坊(Ethereum)并不是一个机构,而是一款能够在区块链上实现智能合约、开源的底层系统,以太坊从诞生到2017年5月,短短3年半时间,全球已有200多个以太坊应用诞生。以太坊是一个平台和一种编程语言,使开发人员能够建立和发布下一代分布式应用。 以太坊可以用来编程,分散,担保和交易任何事物:投票,域名,金融交易所,众筹,公司管理, 合同和大部分的协议,知识产权,还有得益于硬件集成的智能资产。

    以太坊的几个基本概念:

    以太坊简单来说就是区块链与智能合约的结合,是基于solidity语言实现的。在以太坊中,智能合约也有一个帐户地址。

    • EVM

      以太坊虚拟机(EVM)是以太坊中智能合约的运行环境。它不仅被沙箱封装起来,事实上它被完全隔离,运行在EVM内部的代码不能接触到网络、文件系统或者其它进程。甚至智能合约之间也只有有限的调用。

    • Accounts

      以太坊中有两类账户,它们共用同一个地址空间。外部账户,该类账户被公钥-私钥对控制。合约账户,该类账户被存储在账户中的代码控制。 外部账户的地址是由公钥决定的,合约账户的地址是在创建合约时确定的。

      每个账户都有一个以太币余额(单位是“Wei”),该账户余额可以通过向它发送带有以太币的交易来改变。

    • Transactions

      每一笔交易都是一条信息,可以通过交易,将余额从一个帐户发至另一个帐户。

    • Gas

      每一笔交易需要支付一定的gasgas price是由创建者设置的,调用合约的发送账户需要交易费用 = gas price * gas amount。

      

    • Go-Ethereum

      Go-Ethereum是由以太坊基金会提供的官方客户端软件。它是用Go编程语言编写的,简称Geth

    • Geth 客户端

      当你开始这个客户程序,它连接到其他客户端(也称为节点)的网络下载同步区块。它将不断地与其他节点进行通信来保持它的副本是最新的。它还具有挖掘区块并将交易添加到块链的能力,验证并执行区块中的交易。它还可以充当服务器,您可以通过RPC来访问暴露的API接口。

    • Geth 终端

      这是一个命令行工具,可以让您连接到正在运行的节点,并执行各种操作,如创建和管理帐户,查询区块链,签署并将交易提交给区块链等等

    先总体说一下创建以太坊私有链的步骤:

    1.操作系统准备 linux(centos6.7)

    2. golang安装

    3.下载以太坊

    4. 安装以太坊

    5. 创世区块文件的准备

    6. 创世区块初始化

    7. 以太坊启动

    =====================================

    1.最好是centos6.5以上的操作系统

    2. 使用yum命令安装golang语言

    先更新下yum 源:
     [root@localhost src]# rpm -ivh http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm

      [root@localhost src]# yum install golang

    3. 下载以太坊源码,演示用的链接是 https://github.com/ethereum/go-ethereum/archive/v1.7.3.zip

      [root@localhost src]# wget  https://github.com/ethereum/go-ethereum/archive/v1.7.3.zip

      [root@localhost src]#  unzip v1.7.3.zip

      [root@localhost src]#  cd go-ethereum-1.7.3/

    4. 安装以太坊

      [root@localhost src]#  make

     

    5. 创世区块文件的准备

    在go-ethereum-1.7.3/build/bin目录下创建init.json的文本文件,内容如下:

    { "config": 
      {
        "chainId": 10,
        "homesteadBlock": 0,
        "eip155Block": 0,
        "eip158Block": 0
      },
    "alloc" : {},
    "coinbase" : "0x0000000000000000000000000000000000000000",
    "difficulty" : "0x02000000",
    "extraData" : "",
    "gasLimit" : "0x2fefd8",
    "nonce" : "0x0000000000000042",
    "mixhash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
    "timestamp" : "0x00"
    }
    参数名称参数描述
    mixhash 与nonce配合用于挖矿,由上一个区块的一部分生成的hash。注意他和nonce的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, 
    nonce nonce就是一个64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊的Yellow paper, 4.3.4. Block Header Validity, 
    difficulty 设置当前区块的难度,如果难度过大,cpu挖矿就很难,这里设置较小难度
    alloc 用来预置账号以及账号的以太币数量,因为私有链挖矿比较容易,所以我们不需要预置有币的账号,需要的时候自己创建即可以。
    coinbase 矿工的账号,随便填
    timestamp 设置创世块的时间戳
    parentHash 上一个区块的hash值,因为是创世块,所以这个值是0
    extraData 附加信息,随便填,可以填你的个性信息
    gasLimit 该值设置对GAS的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。

      

    6. 创世区块初始化

    在go-ethereum-1.7.3/build/bin目录下执行以下命令以完成创世区块的创建:

    [root@localhost bin]# ./geth  --datadir "/root/chain" init init.json

    注意:上面命令中–datadir后面的 /root/chain可以任意指定,无需提前创建,但是一定要保证有足够的磁盘空间。init.json是我们在上一步创建的文件,注意文件名要一致。

    7. 以太坊启动

    [root@localhost bin]# ./geth --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 100000 console
    注意:上面命令中–datadir 后的”/root/chain”要跟我们上一步的–datadir 参数一致。
    一直到出现Welcome to the Geth JavaScript console! 句话,并自动进入geth的命令行则说明以太坊私有链安装成功了。

    到目前为止,我们的私有链就搭建成功了。

    8. 启动网络时间同步:

    Linux的时间分为System Clock(系统时间)和Real Time Clock (硬件时间,简称RTC)。
    
    系统时间:指当前Linux Kernel中的时间。
    
    硬件时间:主板上有电池供电的时间。
    
    查看系统时间的命令: #date
    
    设置系统时间的命令: #date –set(月/日/年 时:分:秒)
    
    例:#date –set “10/11/10 10:15”
    
    查看硬件时间的命令: # hwclock
    
    设置硬件时间的命令: # hwclock –set –date = (月/日/年 时:分:秒)
    
    上述提到的是手动设置时间到一个时间点,可能与当前网络的时间有误差。下面介绍一下与时间服务器上的时间同步的方法
    
    1.  安装ntpdate工具
    
    # yum -y install ntp ntpdate
    
    2.  设置系统时间与网络时间同步
    
    # ntpdate cn.pool.ntp.org
    
    3.  将系统时间写入硬件时间
    
    # hwclock --systohc

     参考:http://blog.csdn.net/xc70203/article/details/77988473



    9.查看日志的方法
    启动以太坊的时候使用命令:
    ./geth --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 100000 console 2>>eth_output.log
    

    这样启动后日志记录到 文件eth_output.log

    查看日志:

    tail -f eth_output.log
    

      

    10. 查看帐户余额

    开始挖矿后通过命令查看账户钱包有多少矿
    eth.getBalance(eth.accounts[0])
    

      或者web3.eth.getBalance(eth.accounts["0x6c24c7e7114726a73b217af292681de445e071c7"])

    查询查看格式化的以太币余额

    web3.fromWei(eth.getBalance(eth.coinbase), "ether")  

    如果有多个账户可以一起查看:

    定义一个这样的函数:

    function checkAllBalances() {
         var totalBal = 0;
         for (var acctNum in eth.accounts) {
             var acct = eth.accounts[acctNum];
             var acctBal = web3.fromWei(eth.getBalance(acct), "ether");
             totalBal += parseFloat(acctBal);
             console.log("  eth.accounts[" + acctNum + "]: 	" + acct + " 	balance: " + acctBal + " ether");
         }
         console.log("  Total balance: " + totalBal + " ether");
     };
    //可以保存到一个脚本里,使用命令载入脚本:loadScript('/path/script/here.js')

    使用命令查看所有账户余额:

    11. 转账

    先对账户解锁:

    personal.unlockAccount("0x6c24c7e7114726a73b217af292681de445e071c7", "123456");
    

      或者

    personal.unlockAccount(eth.accounts[0], "123456");

    每次记一长串的地址很麻烦,我们可以通过设置变量来acc0表示帐户10xbe323cc4fde114269a9513a27d3e985f82b9e25d,acc1表示帐户20x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70

    > acc0 = web3.eth.accounts[0]
    "0xbe323cc4fde114269a9513a27d3e985f82b9e25d"
    > acc1 = web3.eth.accounts[1]
    "0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70"
    > web3.eth.getBalance(acc0)
    1.245e+21
    > web3.eth.getBalance(acc1)
    0
    

      

    然后查看余额:

    > function checkAllBalances() {
         var totalBal = 0;
         for (var acctNum in eth.accounts) {
             var acct = eth.accounts[acctNum];
             var acctBal = web3.fromWei(eth.getBalance(acct), "ether");
             totalBal += parseFloat(acctBal);
             console.log("  eth.accounts[" + acctNum + "]: 	" + acct + " 	balance: " + acctBal + " ether");
         }
         console.log("  Total balance: " + totalBal + " ether");
     };
    > checkAllBalances()
      eth.accounts[0]:  0xbe323cc4fde114269a9513a27d3e985f82b9e25d  balance: 1245 ether
      eth.accounts[1]:  0x3b0ec02b4193d14abdc9cc5b264b5e3f39624d70  balance: 0 ether
      Total balance: 1245 ether
    

    解锁完成之后,即可执行转账操作:

    web3.eth.sendTransaction({from:acc0,to:acc1,value:web3.toWei(3,"ether")})

    执行转账后要进行挖矿操作,才会把转账真正完成
    可以再次查看余额,验证是否转账成功



    多个节点创建:
    第一台主机:
    ./geth --rpc --rpcaddr 192.168.31.149 --rpcport 9000 --datadir /root/chain --port 30303  --networkid 100000 console
    第二台主机:ip不同
    ./geth --rpc --rpcaddr 192.168.31.40 --rpcport 9000 --datadir /root/chain --port 30303  --networkid 100000 console
    查看节点信息:
    admin.nodeInfo.enode
    admin.peers
    查看节点数
    net.peerCount
    添加节点:admin.addPeer("enode://.........@ip:port")






  • 相关阅读:
    并发编程(线程)
    并发编程(进程)
    并发编程(操作系统的介绍)
    模块与包
    网络编程
    Django项目的创建与管理和pycharm与Github的秘密
    python解释器配置和python常用快捷键
    代码的调试.运行
    57. 三数之和
    1347. 尾随零
  • 原文地址:https://www.cnblogs.com/beyang/p/8469227.html
Copyright © 2011-2022 走看看