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

    0x01 Ubuntu环境下的以太坊安装

    一. 基本环境配置:

    1. 命令行安装
    打开终端依次输入以下命令
    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

    2.源码编译Ubuntu和Mac下编译
    cd go-ethereum
    make geth   或者 make all
    配置环境变量
    将 geth 添加到环境变量中
    # ubuntu下
    vim ~/.bashrc
    # 打开配置文件后,把以下内容添加到文件中
    exportGETH="$GOPATH. c/http://github.com/ethereum/go-ethereum/build"
    exportPATH="$PATH:$GETH/bin"
    然后执行,使配置生效。
    source ~/.bashrc
    export GETH="$GOPATH/home/(具体地址)"
    export PATH="$PATH:$GETH/bin"
    3.安装完成后,输入geth -h,如果有列出信息则说明安装成功,可查看列出信息,方便后续的操作

    二.安装geth

    1.Geth安装好:

     

    2. 创建新的账户

     

    3. 编辑genesis.json文件:

     

    4. 编辑好以后,

    在终端输入【geth --datadir data --networkid 20140628 --rpc --rpccorsdomain "*" init ./genesis.json】

    需要说明的是,

    --networkid 20140628,为私链id,可以任意修改为自己的id,以太坊主网id为1,后续要搭建私链下的其他节点,networkid必须相同

    --datadir data 中data是文件夹的名称,私链数据会存储在这个文件夹内,当要在同一计算机中创建其他私链节点时,可创建另外的文件夹,例如data2,然后通过--datadir data2区分不同的私链节点,如果未设置--datadir,则会读取以太坊主网的数据,默认位置在/root/.ethereum中。

    5. 开启geth私链客户端:

    geth --datadir data --networkid 20140628 --rpc --rpccorsdomain "*" --nodiscover --port 16333 --rpcport 8546 console

    如果启用第二个测试节点,port以及rpcport应与第一个节点不同

     

    6. 接下来是一气呵成

     

    7. 停止挖矿

     
     

    8. 创建一个新的账户挖一下

    personal.account(“3zzz”)#创建了一个密码为3zzz的账户,这里请记住给的账户地址

    eth.getBalnce(“ ”)#中间放刚刚的账户地址

    miner.Etherbase(“ ”)#准备挖矿

    miner.start(1)#开始挖矿,线程为1;

    ----

    出现了可爱的小榔头,挖矿成功

    ----

    看一下我们的收益:

     

    9.  转账

    (网站说以太坊默认挖矿是放在第一个账户,我不是特别赞同,毕竟我的第二个账户有矿)

    web3.fromWei(web3.eth.getBalance(web3.eth.accounts[0]),"ether")#查询0号账户

    web3.fromWei(web3.eth.getBalance(web3.eth.accounts[1]),"ether")#查询1号账户

     

    【备注:eth单位】

    kwei (1000 Wei)

    mwei (1000 KWei)

    gwei (1000 mwei)

    szabo (1000 gwei)

    finney (1000 szabo)

    ether (1000 finney)

    ether =wei * 10^18

    wei转ether:

        > web3.fromWei(10000000000000000,"ether")

        "0.01"

    ether转wei:”

        > web3.toWei(1)

        "1000000000000000000"

    9.2. 第2个账户转账给第3个账户

    web3.eth.sendTransaction({from:web3.eth.accounts[1] , to: web3.eth.accounts[2],value: web3.toWei(1, "ether")})

     

    保存进度:

    需要输入密码,我的3zzz不行,加了密的文档不行。。我不行了。。。

    https://blog.csdn.net/w88193363/article/details/79402074

    personal.unlockAccount(web3.eth.accounts[0])#正确应该提示true

     

     

    0x02. Windows平台下以太坊私有链搭建及钱包部署和运行

    一、安装环境准备

    1、安装Ethereum-Wallet

    (1)在D盘新建文件夹Eth,专门放置以太坊开发环境

    (2)把下载的Ethereum-Wallet-win64-0-8-10.zip压缩包win-unpacked解压到D:Eth目录下

    2、安装geth

    (1)geth下载:https://ethereum.github.io/go-ethereum/downloads/

    (2)安装geth,安装在D:Eth 目录下

    (3)在D:Eth目录下创建privatechain文件,用以存放区块链数据。

     

    二、以太坊私有链搭建

    1、创建第一个节点

     (1)在D:Eth 目录下创建创世块文件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

        }

    }

    Coinbase: 旷工账户

    Difficulty: 挖矿难度,0x400,这个是简单。

    extraData:相当于备注

    gasLimit:最小消耗gas

    nonce : 64位随机数,用于挖矿,注意他和mixhash的设置需要满足以太坊黄皮书中的要求

    parentHash : 上一个区块的Hash值,因为是创世块,石头里蹦出来的,没有在它前面的,所以是0

    Timestamp : 时间戳

     

    (2)打开cmd,进入D:Eth 目录下(该目录下有geth.exe和genesis.json文件,便于运行geth命令),创世块文件初始化命令如下:

    geth -datadir "%cd%privatechain ode1" init genesis.json

     

    --datadir:后面跟本节点数据存放的目录。

    genesis.json:是init命令的参数。

    执行该命令后会在D:Ethprivatechain下自动新建node1文件夹,并在node1下生成geth和keystore两个文件夹。其中geth存放的是区块信息,keystore中存放的是账户信息。

    初始化完成以后你就拥有一条自己的私有链了,之后就可以启动自己的私有链进行一些操作。

     

    (3)启动私有链节点:geth --targetgaslimit 4294967295 --rpc --rpcport "8101" --port "30301" --rpcapi "eth,web3,personal" --networkid 2020 --identity 2020 --nodiscover --maxpeers 5 --datadir "%cd%privatechain ode1" --unlock 0 --rpccorsdomain "*" console

    注释:

     --targetgaslimit:每个块的gas上限,这里可以暂时理解为容量

    --rpc:启动rpc通信,可以进行智能合约的部署和调试

    --rpcaddr:rpc接口的地址

    --rpcport:rpc接口的端口号

    --port:网络监听端口,用于节点之间通信

    --rpcapi:设置rpc的范围,暂时开启eth,web3,personal足够

    --networkid:设置当前区块链的网络ID,是一个数字,可以随便写

    --identity:区块链的标示,随便填写,用于标示目前网络的名字

    --nodiscover:禁止被网络中其它节点发现,需要手动添加该节点到网络

    --maxpeers:最大节点数量

    --datadir:设置当前区块链网络数据存放的位置

    --unlock:解锁某用户(此处用用户坐标来控制,解锁后的用户调用接口发起交易时,不要需要提供密码),0代表存储在账号数组中的第一个账号,如果一开始没有创建账号,改参数可以去掉,不然会报错,找不到该账号。

    --rpccorsdomain:限制rpc访问源的ip,代表不限制

    --mine:允许挖矿

    --console:启动命令行模式,可以在Geth中执行命令*

    172.25.240.22:要改为自己的IP

     

    该命令的主体是geth consoal,表示启动该节点并进入交互控制台。其中--networkid 2020 表示私有链的网络id。网络id在连接到其他接点时也会用到。以太坊公网的id是1,为了不产生冲突,这里要指定自己的网络id。

     

    如果解除锁定以后还是错的,跟着网上教程:

     

    https://blog.csdn.net/luhuiwan1314/article/details/79623998

    但是:这样启动后,如果挖不了矿,就回到启动节点那一步,第一次没有创建用户还是要记得解除锁定,一般情况下都打得开。

    【注意】

    如果之前创建了用户,在启动过程中会提示输入密码:XXXXXX(即之前创建的账号)

    运行成功后,就启动了区块链节点并进入了Javascript Console。

     

    【我在Windows10虚拟机上重新搭建的】

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

    如果带参数--mine启动,耐心等一会时间!!!自动显示挖矿,挖矿一会时间(如果不带--mine参数启动则不会挖矿)

    停止挖矿命令:miner.stop(),不要在意输出的刷屏,只管输入完成后回车即可,如果输入正确,回车后会输出“true”。(其实这里建议启动一个CPU挖矿:miner.start(1) ,以后交易需要矿工确认,在这里挖了坑…)

    挖矿命令:miner.start(1)

    miner命令括号中的1表示用一个线程进行挖矿,如果不配置,就会让CPU全速运行,影响计算机的使用。

    1.创建账户:

     

    此时为0个;

    2.输入密码创建账号

     

    再次发现,果然存在

     3.Miner.start()

    第一次会初始化:

     

    初始化到100 【以后注意,如果数字有顺序,可能是初始化,不要不小心暂停了】

    三、支持的操作指令

    1) 查询钱包余额指令:eth.getBalance(eth.accounts[0]),查询的是第一个账户的余额,当我们挖矿时,奖励金存储默认的是第一个账户

    2)转账指令: eth.sendTransaction({from:"第一个账户的账号",to:"第二个账户的账号",value:web3.toWei(1000000,"ether")})

    当直接执行此方法时会抛出异常:

    account is locked

        at web3.js:3119:20

        at web3.js:6023:15

        at web3.js:4995:36

        at <anonymous>:1:1

     【原因】

    账号被锁住

    【解锁指令】

    personal.unlockAccount("第一个账户的账号","设定的密码")

    3)创建账号

    personal.newAccount()

    4)查看账号

    eth.accounts

    5)查看账号余额

    eth.getBalance(eth.accounts[0])

    6)启动&停止挖矿

    启动挖矿:
    miner.start(1)

    其中 start 的参数表示挖矿使用的线程数。第一次启动挖矿会先生成挖矿所需的 DAG 文件,这个过程有点慢,等进度达到 100% 后,就会开始挖矿,此时屏幕会被挖矿信息刷屏。

    停止挖矿,在 console 中输入:
    miner.stop()
    挖到一个区块会奖励5个以太币,挖矿所得的奖励会进入矿工的账户,这个账户叫做 coinbase,默认情况下 coinbase 是本地账户中的第一个账户,可以通过 miner.setEtherbase() 将其他账户设置成 coinbase。

    7)转账

    目前,账户 0 已经挖到了 3 个块的奖励,账户 1 的余额还是0:

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


    我们要从账户 0 向账户 1 转账,所以要先解锁账户 0,才能发起交易:

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

     

    发送交易,账户 0 -> 账户 1:
    amount = web3.toWei(5,'ether')
    "5000000000000000000"
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})

    需要输入密码 123456

     INFO[09-12|07:38:12]Submitted transaction fullhash=0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce recipient=0x02bee2a1582bbf58c42bbdfe7b8db4685d4d4c62

    "0x9f5e61f3d686f793e2df6378d1633d7a9d1df8ec8c597441e1355112d102a6ce"

     

    此时如果没有挖矿,用 txpool.status 命令可以看到本地交易池中有一个待确认的交易,可以使用 eth.getBlock("pending", true).transactions 查看当前待确认交易。

     

    使用 miner.start() 命令开始挖矿:
    miner.start(1);admin.sleepBlocks(1);miner.stop();

    新区块挖出后,挖矿结束,查看账户 1 的余额,已经收到了账户 0 的以太币:

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

     

    最后两步我没走,因为点错了终端就卡机了,然后重启,发现账户2(1a)已经收到转账了

    0x03 安装智能合约

    前提:将geth.exe拷到Unpacked文件夹,然后点击该文件夹里的wallet.exe,关闭提示更新的窗口

    测试一下钱包页面:

    1. 添加账号

     

     

    提示钥匙文件的储存位置:

     

    2.转账:

    地址是点击账户复制的

     

    转账以后要打开geth命令行页面,开始挖矿才会转账成功

     

     3.部署智能合约

     

    但是方框中的代码我不知道如何填,那天忘记记录了。旁边的选项第一次试验有(可能是复制了其他代码显示的),现在没有了。第一次的智能合约是deploy成功了的。

    接下来打开geth页面挖矿,会显示我刚刚的2wei币:

     

     4.运行智能合约

     

    *我这里刚开始报错:

    No visibility specified. Defaulting to "public".

        function MyToken(uint256 _supply, string _name,string _symbol, uint8 _decimals){

    ^

    Spanning multiple lines.

    解决方法:

     

    因为前面是public

    https://stackoverflow.com/questions/47959564/no-visibility-specified-defaulting-to-public-function-transferaddress-recei

    将所有function transfer()external {}

    *第二个报错:

     

    这里是“throw”废弃了,然后我使用的require(balanceOF…..)

    然后这边修改好以后,上面加external的地方又报错,然后就去搜资料,有新的智能合约代码,我试了一下貌似是对的:

    pragma solidity ^0.4.18;//版本一定对得上号。0.4.18不能错!

    contract Token {

      mapping (address => uint) public balancesOf;

      address public owner;

      function Token() public {

        owner = msg.sender;

        balancesOf[msg.sender] = 10000;

      }

      function transfer (address _to, uint _value) public {

        require (balancesOf[msg.sender] > _value);  //避免转移出去的代币超过当前的存货

        require (balancesOf[_to] + _value > balancesOf[_to]);  //避免自己调用自己,或者递归调用

        balancesOf[msg.sender] -= _value;

        balancesOf[_to] += _value;

      }

      function mint(uint _amount) public {

        balancesOf[owner] += _amount;

      }

    }

    但是我这里只有一个选项:

     

    不管了,deploy一下:

     

    最后geth页面挖矿(真正激活合约)

    5.调用智能合约

    进入页面,这里有我们刚刚部署且运行过的智能合约了,第二个就是我们刚刚第四步从main账户创建的智能合约。

     

    点击第二个账户,测试一下其功能:

     

    选择一个转账吧:

     

    还是老样子,转账金额选择à输入转款地址的密码à挖矿;

    ??我的钱呢??

     

    这里是跑进了第二个账户,而不是智能合约的第二个账户

     

    我的理解是智能合约是一种协议,目的是为了可信交易,主要是验证身份,所以智能合约是不是不做存钱功能。

     

    这里的交易记录也可以看到,确实是转过给第二个智能合约

  • 相关阅读:
    vue 路由
    CSS篇-dispaly、position、定位机制、布局、盒子模型、BFC
    CSS篇-样式表、选择器、权重、伪类
    vue-cli3.0 开发环境构建
    Vue 全家桶学习资源(转)
    vue全家桶常用命名
    服务拆分
    分布式事务及其解决方法
    java mvc 及其缓存
    java 面试经典题
  • 原文地址:https://www.cnblogs.com/TEAM0N/p/12068624.html
Copyright © 2011-2022 走看看