Windows下私有区块链的搭建

前言

本文为自己的学习笔记整理,可能有不准确的地方。

安装Geth

官方https://geth.ethereum.org/downloads/
国内镜像https://ethfans.org/wikis/Ethereum-Geth-Mirror
关于环境变量
自己配置的时候好像win8.1会自动将Geth的安装路径添加进Path中,win10下好像需要自己手动添加。可能记得不太准确,如果不确定可以检查一下Path下是否有Geth的安装路径,没有可以自己手动添加。

编写创世区块配置文件gensis.json

(需要手动提前创建好geth工作目录)
创世区块是区块链的起点,是区块链的第一块区块-0号区块,唯一没有前任的区块。这个协议确保了没有其它节点会和你节点的区块链版本一致,除非它们的创世区块和你的一模一样。

{
    "config":{
        "chainId":15,
        "homesteadBlock":0,
        "eip155Block":0,
        "eip158Block":0
    },
    "alloc":{

        },
        "coinbase":"0x0000000000000000000000000000000000000000",
        "difficulty":"0x20000",
        "extraData":"0x777573686f756865",
        "gasLimit":"0xfffffff",
        "nonce":"0x0000000000000001",
        "mixhash":"0x0000000000000000000000000000000000000000000000000000000000000000",
        "parentHash":"0x0000000000000000000000000000000000000000000000000000000000000000",
        "timestamp":"0x00"
}

参数说明

初始化命令

(提前在geth工作目录下创建好db文件夹)
geth --datadir "./db" init gensis.json //初始化创世区块,并设置数据存储路径为db。
初始化成功后,会在数据目录db中生产geth和keystore两个文件夹,其中geth文件夹用于存放区块数据,keystore用于存放账户数据。

启动命令

geth --identity "testchain" --rpc --datadir "./db" --rpcapi "eth,net,web3,personal,admin,shh,txpool,debug,miner" --rpccorsdomain "*" --networkid 100 console
参数说明

此外,还可以使用如下参数:

进入JavaScript控制台

通过attach 命令,连接一个已经启动节点,启动js命令环境:
geth attach ipc:\.\pipe\geth.ipc(或者geth attach http://127.0.0.1:8545)
注意:需要先启动节点,另外开一个窗口。

常用命令

以太坊的JavaScript内置的一些对象:
eth:提供了操作区块链相关的方法;
net:提供了查看p2p网络状态的方法;
admin:提供了管理节点相关的方法;
minner:提供启动和停止挖矿的方法;
personal:提供了管理账户的方法;
txpool:提供了查看交易内存池的方法;
web3:除了包含以上对象中有的方法,还包含了一些单位换算的方法。

  • 创建账户
    命令:personal.newAccount("passwd") //传入的是账户的密码,执行成功会返回账户的公钥,生成的账户文件在keystore文件夹下。
  • 查看所有的账户
    命令:eth.accounts
  • 查看余额
    命令:balance=web3.fromwei(eth.getBalance(eth.accounts[0],"ether"))
    其中,eth.accounts[index]会按传入的索引返回已有的账户,eth.getBalance(address)会返回账户的余额,余额单位为wei,传入的参数是账户的公钥,web3.fromWei()进行单位转换,这里是将wei转为ether。

    (由于没有挖矿,所以余额为0.)
  • 挖矿
    miner.setEtherbase(eth.accounts[0]) //设置挖矿奖励地址,其实默认情况是设置的为eth.accounts[0]。

    eth.coinbase //查看挖矿奖励账号;

    miner.start() //开始挖矿,有时候可能看不见后台数据,但是却执行了挖矿已经。具体要看一下账户是否已经有余额。
    miner.stop() //停止挖矿;
  • 解锁账户
    发送转账交易之前需要先节所账户,否则会报错。
    personal.unlockAccount(eth.accounts[0],"123456")

    或者personal.unlockAccount(eth.accounts[0],"123456","300")//第三个参数表示解锁持续的时间,单位为秒;
  • 交易
    eth.sendTransaction({from:eth.accounts[0],to:eth.accounts[1],value:web3.toWei(1,"ether")})//会返回一个交易的hash;
    (交易进行后必须启动挖矿,否则交易不会被打包,然后就会发现账号中仍然为0,交易没有生效。)
  • 查看交易
    eth.getTransaction(transactionHash)//发起交易时的详情;

    eth.getTransactionReceipt(transactionHash) //交易在区块中的详细信息;
  • 查看当前区块总数
    eth.blockNumber
  • 查询最新区块
    eth.getBlock(;latest)

    还可以使用eth.getBlock(blockNumber)和eth.getBlock(blockHash)根据区块number和hash来查询区块。
  • 查看当前节点信息
    admin.nodeInfo

    admin.nodeInfo.enode
  • 添加其它节点
    (如果要将其它节点接入网络需要将前面的配置操作重复一遍,gensis,json不能改变。)
    方式一:静态(参考:https://segmentfault.com/p/1210000009213595/read)
    步骤一:通过使用admin.nodeInfo.enode查看第一个节点的enode信息
    enode: enode: "enode://1a1c94a8042d8c88103f2a17311eb8eb77c2ecd14ef89bfd6b90cef9bc184d0e5acb6c3d79b4218630987a889065dafe3769be6956e44c599dc5ba572518f857@IP:30303"
    步骤二:在第二个节点下在{datadir}下添加文件 static-nodes.json,内容如下:
    [
    "enode://1a1c94a8042d8c88103f2a17311eb8eb77c2ecd14ef89bfd6b90cef9bc184d0e5acb6c3d79b4218630987a889065dafe3769be6956e44c599dc5ba572518f857@第一个节点的IP地址:30303"]
    步骤三:完成节点二的初始化和启动操作。
    方式二:动态
    通过时用admin.addPeer()命令参数为步骤一中的enode信息
    不管是静态还是动态连接,连接成功后,节点二就会开始同步节点一的区块,同步完成后,任意节点开始挖矿,另一个节点会自动同步区块,向任意节点发送交易,另一个节点也会收到该笔交易。
  • 查看已连接的远程节点
    admin.peers
  • 查看连接的远处节点数
    admin.peerCount

    文件夹结构

    为了方便我自己将命令都做成了bat文件,结构如下:

    说明:
  • gensis.json是创世区块的配置文件
  • init-private.bat是初始化命令
  • start-private.bat是启动命令
  • attach.bat为进入JavaScript控制台
  • static-node.json为静态配置远程节点

    参考

    [https://segmentfault.com/p/1210000009213595/read]

    书籍推荐

    《区块链开发实战-以太坊关键技术与案例分析》对于小白还是不错的

猜你喜欢

转载自www.cnblogs.com/SnailsRunning/p/10638623.html