• 如何搭建以太坊的私有链


    首先进入到这个Mychains目录中,执行初始化命令


    cd Mychains
    geth --datadir data0 init genesis.json
    上面命令的主体是geth init ,表示初始化区块链,命令可以带有选项和参数,其中--datadir选项后面跟着一个目录名,这里面为data0,表示后面指定的数据存放的目录为data0,genesis.json是init命令的参数
    运行上面的命令,会读取genesis.json(传世区块),根据其中的内容,将传世区块写入到区块链中,如果看到log信息中有 Successfully wrote genesis state ,则说明初始化成功

    其中geth/chaindata中存放的是区块数据,keystore中存放的是账户数据。


    启动私有链节点
    初始化完成后,就有了一条自己的私有链,之后就可以启动自己的私有链节点并做一些操作,在终端中输入以下命令即可启动节点:

    geth --datadir data0 --networkid 1108 console
    上面命令的主体是geth console,表示启动节点并进入交互式控制台,–datadir选项指定使用data0作为数据目录,–networkid选项后面跟一个数字,这里是1108,表示指定这个私有链的网络id为1108。网络id在连接到其他节点的时候会用到,以太坊公网的网络id是1,为了不与公有链网络冲突,运行私有链节点的时候要指定自己的网络id(上面命令可能会运行失败,我直接重启mac,再进入到privateChain目录中,简单粗暴)。


    运行上面的命令后,就启动了区块链节点并进入了Javascript Console:


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

    eth:包含一些跟操作区块链相关的方法
    net:包含以下查看p2p网络状态的方法
    admin:包含一些与管理节点相关的方法
    miner:包含启动&停止挖矿的一些方法
    personal:主要包含一些管理账户的方法
    txpool:包含一些查看交易内存池的方法
    web3:包含了以上对象,还包含一些单位换算的方法

     


    查看私有链里面有没有自己的账户
    > eth.accounts
    []

    此时没有账户,接下来使用personal对象来创建一个账户
    Passphrase其实就是密码的意思,输入两次密码后,就创建了一个账户。再次执行命令:重复两次创建两个账户
    > personal.newAccount()
    Passphrase:
    Repeat passphrase:
    "0x259ab3438cbc45395c907963ce02f702b22d5ac8"
    >

    此时再去看账户就存在了两个账户
    > eth.accounts
    ["0x259ab3438cbc45395c907963ce02f702b22d5ac8"]

    账户默认会保存在数据目录的keystore文件夹中。查看目录结构,发现data0/keystore中多了两个文件,这两个文件就对应刚才创建的两个账户,这是json格式的文本文件,可以打开查看,里面存的是私钥经过密码加密后的信息。

    eth对象提供了查看账户余额的方法:
    > eth.getBalance(eth.accounts[0])查看的是第一个账户的余额
    0
    > eth.getBalance(eth.accounts[1])查看的是第二个账户的余额
    0

    目前两个账户的以太币余额都是0,要使账户有余额,可以从其他账户转账过来,或者通过挖矿来获得以太币奖励。

     


    启动&停止挖矿
    通过miner.start()来启动挖矿:

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

    如果想停止挖矿,并且进度已经达到100%之后,可以在js console中输入

    miner.stop():


    miner.start(10)开始10个线程
    start的参数表示的挖矿所使用的线程数,第一次启动挖矿会生成所需要的挖矿的DAG文件,这个过程有点慢,当进度达到100%的时候。就会开始挖矿,此时屏幕会被挖矿信息刷屏,如果想停止挖矿,并且在进度到100%的时候,可以再控制台中输入miner.stop()

    注意:输入的字符会被刷屏信息冲掉,没有关系,只要输入完整的miner.stop()之后回车,就可以体质挖矿

    挖到第一个区块之后会奖励5个以太币,挖矿所得到的奖励会进入到矿工的账户中,这个账户叫做coinbase,默认情况下coinbase是本地账户中的第一个账户

    eth.coinbase默认挖矿所得到的放入第一个账户中:

    现在的coinbase的账户是0,要想使挖矿奖励放入其他账户中,可以通过miner.setEtherbase()将其他账户设置为coinbase即可
    > miner.setEtherbase(eth.accounts[1])设置coinbase为账户1
    true
    > eth.coinbase
    "0x528ae340112a80de3ca4cee097c023dea24ede85"

    挖到区块之后,账户0应该有余额了
    > eth.getBalance(eth.accounts[0])
    650000000000000000000

    getBalance()返回值的单位是wei,wei是以太币的最小单位,一个以太币=10的18次方个wei,要查看有多少个以太币,可以用web3.fromWei()将返回值换算成以太币
    > web3.fromWei(eth.getBalance(eth.accounts[0]),'ether')
    650


    可以通过发送一笔交易,从账户0转移10个以太币到账户1:
    > eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
    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 0x259ab3438cbc45395c907963ce02f702b22d5ac8
    Passphrase:
    true
    >
    解锁账户0成功,输入的是之前创建账户时设置的密码,就可以解锁成功,然后在发送交易


    > eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:amount})
    INFO [04-02|02:00:02.565] Setting new local account address=0x259ab3438cbC45395C907963CE02f702B22D5ac8
    INFO [04-02|02:00:02.572] Submitted transaction fullhash=0xc1c91f3e9d1dc03789408512bf95227085d4dd7bc3da15ace410c25ff10a7bc9 recipient=0x528aE340112A80DE3Ca4CEE097C023DEA24ede85
    "0xc1c91f3e9d1dc03789408512bf95227085d4dd7bc3da15ace410c25ff10a7bc9"

     

    我们去查看账户1中的余额:

    > eth.getBalance(eth.accounts[1])
    0
    发现还没转过去,此时交易已经提交到区块链,但还未被处理,这可以通过查看txpool来验证:

    > txpool.status
    {
    pending: 1,
    queued: 0
    }
    >

    在区块链中等待被处理的状态,其中有一条pending的交易,pending表示已提交但还未被处理的交易。
    要使交易被处理,必须要挖矿。这里我们启动挖矿,然后等待挖到一个区块之后就停止挖矿:


    miner.start(1);admin.sleepBlocks(1);miner.stop();

    当miner.stop()返回true后,txpool中pending的交易数量应该为0了,说明交易已经被处理了,而账户1应该收到币了:

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

    > txpool.status
    {
    pending: 0,
    queued: 0
    }
    >
    此时的pedding的状态也为0了,已经处理完毕了


    eth对象封装了查看交易和区块信息的方法。

    查看当前区块总数

    > eth.blockNumber
    138

    通过区块号查看区块
    > eth.getBlock(32)
    {
    difficulty: 132928,
    extraData: "0xda83010817846765746888676f312e31312e358777696e646f7773",
    gasLimit: 130086343,
    gasUsed: 0,
    hash: "0x1031bea90c9b00acff1c9811feedd88c4c783f53619a418297bcf53e938ae586",
    logsBloom: "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    miner: "0x259ab3438cbc45395c907963ce02f702b22d5ac8",
    mixHash: "0xd17858d584c0a38c01f41240addc5a43115216c701cebac8ee78fdfa94ce9801",
    nonce: "0x64f8bf8de6f36ebc",
    number: 32,
    parentHash: "0x7aaba62e3d27c963fc4fdb962f44ab5be7ef50490f7ff0a84645e8a7afea369e",
    receiptsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
    sha3Uncles: "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347",
    size: 539,
    stateRoot: "0xf1d3d95f619d7af088aaf4147f2b611f768ea91ce990404943b5d8ada9f05a3c",
    timestamp: 1554140288,
    totalDifficulty: 4223552,
    transactions: [],
    transactionsRoot: "0x56e81f171bcc55a6ff8345e692c0f86e5b48e01b996cadc001622fb5e363b421",
    uncles: []
    }
    > eth.getBlock(320)
    null
    >

    通过交易hash查看交易:

    > eth.getTransaction("0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6")
    {
    blockHash: "0x1cb368a27cc23c786ff5cdf7cd4351d48f4c8e8aea2e084a5e9d7c480449c79a",
    blockNumber: 463,
    from: "0x4a3b0216e1644c1bbabda527a6da7fc5d178b58f",
    gas: 90000,
    gasPrice: 18000000000,
    hash: "0x1b21bba16dd79b659c83594b0c41de42debb2738b447f6b24e133d51149ae2a6",
    input: "0x",
    nonce: 0,
    r: "0x31d22686e0d408a16497becf6d47fbfdffe6692d91727e5b7ed3d73ede9e66ea",
    s: "0x7ff7c14a20991e2dfdb813c2237b08a5611c8c8cb3c2dcb03a55ed282ce4d9c3",
    to: "0x46b24d04105551498587e3c6ce2c3341d5988938",
    transactionIndex: 0,
    v: "0x38",
    value: 10000000000000000000
    }

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    委托的另一种写法
    List集合基于某个字段排序
    js进阶
    DBlink与同义词
    iOS汤姆猫素材
    Objective-C 变量和基本的数据类型
    OC基础语法之方法
    16进制数
    kmp算法原理自我理解
    bfs广度遍历搜索模版
  • 原文地址:https://www.cnblogs.com/yunxintryyoubest/p/10640260.html
Copyright © 2020-2023  润新知