Go Ethereum简介

Go Ethereum是以太坊协议的三个原始实现(以及C ++和Python)之一。 它是用Go编写的,完全开放源代码并在GNU LGPL v3下获得许可。
Go Ethereum可以作为独立的客户端Geth使用,您可以将其安装在任何操作系统上,也可以作为可以嵌入Go,Android或iOS项目的库。

搭建基于以太坊go-ethereum的环境

1.安装go-ethereum

在这里只介绍在Ubuntu环境下的源码安装,执行以下操作

  • 安装Go环境
    可以参考go官方安装文档 https://golang.org/doc/install
  • 下载go-ethereum源代码:
    go get -d github.com/ethereum/go-ethereum
  • 编译生成可执行文件,可执行文件在$GOPATH/bin目录下
    go install github.com/ethereum/go-ethereum/cmd/geth

2.启动go_ethereum

连接以太坊网络启动方式(以太坊网络上的完整节点)

geth缺省会连接到以太坊官方的正式网络上去,这个正式网络里的区块目前已经有多达500多万块,而且里面跑的都是要花真金白银的交易

    $ geth console

该命令将:

  • 在快速同步模式下启动geth(默认情况下,可以使用--syncmode标志进行更改)
  • 启动Geth的内置交互式JavaScript控制台(通过尾部控制台子命令),通过它可以调用所有官方web3方法以及Geth自己的管理API。 这也是可选的,如果你把它放在外面,你可以使用geth attach附加到已经运行的Geth实例。
  • 日志级别控制
    使用–verbosity可以控制日志级别,如不想看到日志还可以使用:
    $ geth --verbosity 0 console

开发环境启动方式(以太坊测试网络上的完整节点)

向开发人员过渡时,如果您想要创建以太坊合约,几乎可以肯定的是,除非您掌握整个系统,否则不需要真正的资金。 换句话说,您不想连接到主网络,而想要加入与您的节点相连的测试网络,该节点完全等同于主网络,但仅限于Play-Ether。

$ geth --testnet console

控制台子命令具有与上述完全相同的含义,它们在测试网上也同样有用。然而,指定--testnet标志会重新配置你的Geth实例:

  • 取而代之的是使用默认数据目录(例如Linux上的〜/ .ethereum),Geth将自己嵌入到testnet子文件夹的更深层次(Linux上的〜/ .ethereum / testnet)。请注意,在OSX和Linux上,这也意味着附加到正在运行的testnet节点需要使用自定义端点,因为默认情况下,geth attach会尝试附加到生产节点端点。例如。 geth attach <datadir> /testnet/geth.ipc。 Windows用户不受此影响。
  • 客户端不会连接以太网主要网络,而是连接到测试网络,测试网络使用不同的P2P引导节点,不同的网络ID和生成状态。
    注意:尽管有一些内部保护措施可以防止交易在主网络和测试网络之间交换,但您应该确保始终使用单独的帐户进行游戏币和真实资金。除非您手动移动账户,否则Geth将默认正确分离两个网络,并且不会在它们之间建立任何账户。

连接权威测试网络方式启动 ( Rinkeby测试网络上的完整节点)

上述测试网络是基于ethash工作证明共识算法的跨客户端网络。 因此,由于网络的低难度/安全性,它具有一定的额外开销并且更容易受到重组***。 Go Ethereum还支持连接到称为Rinkeby的权威证明测试网络(由社区成员运营)。 这个网络更轻,更安全,但只受到以太坊的支持。

$ geth --rinkeby --datadir=path/to/your/databases/and/keystore --syncmode=fast  --rpc console 
  • --rinkeby:以太网测试网络
  • --datadir: 数据库和密钥库的数据目录
  • --syncmode: geth有3种同步数据的方式,分别是full, fast和light。这三种方式中,full全同步是最慢的一种,它要把从创世区块往下的所有区块全部同步并校验一遍,fast快速同步模式相对于full来说要快一些,它只校验最近的1024个区块,而light模式是最快的,因为它只校验最近的一个状态,geth的缺省同步方式是fast,在rinkeby上目前有180多万个区块的情况下,同步的时间大约需要半个小时到2个小时,所以这里还是需要有一点耐心的。指定同步模式的命令如下:
    *--rpc: 为了能让我们的应用软件能够连接上geth,还需要在启动geth的同时启动rpc服务器
    参数名称 参数描述
  • identity 区块链的标示,随便填写,用于标示目前网络的名字
  • init 指定创世块文件的位置,并创建初始块
  • datadir 设置当前区块链网络数据存放的位置
  • port 网络监听端口
  • networkid 设置当前区块链的网络ID,用于区分不同的网络,是一个数字
  • console 启动命令行模式,可以在Geth中执行命令

示例 :

$geth --rinkeby --datadir=$HOME/rinkeby --syncmode=fast --rpc --ethstats='KenmyZhang:Respect my authoritah!@stats.rinkeby.io'

注意:这里的KenmyZhang是给我的机器起的名字,你需要改变成一个不会和别人重复的名字,否则会出错误,而后面不需要改动,这个Respect my authoritah!是密码,通用的,无需改动;成功运行起来后可以在https://www.rinkeby.io/#stats 查看到你的机器

配置替代flag启动方式

使用dumpconfig子命令来导出你现有的配置:

$ geth --rinkeby --datadir=path/to/your/databases/and/keystore --syncmode=fast --rpc  dumpconfig > ~/your_config.toml

这样以后我们再执行的时候,就直接执行

$ geth --config /path/to/your_config.toml

注意:这只适用于geth v1.6.0及以上版本。

Docker快速启动方式

docker run -d --name ethereum-node -v /Users/alice/ethereum:/root \
       -p 8545:8545 -p 30303:30303 \
       ethereum/client-go

这将在快速同步模式下启动,具有1GB的DB内存容量,就像上述命令一样。 它还会在您的主目录中创建一个永久卷,以保存您的区块链以及映射默认端口。 还有一个alpine标签可用于图像的纤细版本。

如果您想从其他容器和/或主机访问RPC,请不要忘记--rpcaddr 0.0.0.0。 默认情况下,geth绑定到本地接口,RPC端点无法从外部访问。

以编程方式连接Geth节点

作为一名开发人员,不久后你会想通过自己的程序开始与Geth和Ethereum网络进行交互,而不是通过控制台手动进行交互。 为了解决这个问题,Geth建立了对基于JSON-RPC的API(标准API和Geth特定API)的支持。 这些可以通过HTTP,WebSockets和IPC(基于unix的平台上的unix套接字,以及Windows上的命名管道)公开。

IPC接口默认启用并公开Geth支持的所有API,而HTTP和WS接口需要手动启用,并且由于安全原因而仅公开一部分API。 这些可以打开/关闭,并按照您的设定进行配置

基于HTTP的JSON-RPC API选项:
--rpc 启用HTTP-RPC服务器
--rpcaddr HTTP-RPC服务器侦听接口(默认值:“localhost”)
--rpcport HTTP-RPC服务器侦听端口(默认值:8545)
--rpcapi 通过HTTP-RPC接口提供的API(默认:“eth,net,web3”)
--rpccorsdomain 逗号分隔的接受跨源请求的域列表(浏览器强制执行)
--ws启用WS-RPC服务器
--wsaddr WS-RPC服务器监听接口(默认值:“localhost”)
--wsport WS-RPC服务器侦听端口(默认值:8546)
--wsapi 通过WS-RPC接口提供的API(默认:“eth,net,web3”)
--wsorigins接受websockets请求的起源
--ipcdisable禁用IPC-RPC服务器
--ipcapi 通过IPC-RPC接口提供的API(默认值:“admin,debug,eth,miner,net,personal,shh,txpool,web3”)
--ipcpath数据区中IPC套接字/管道的文件名(显式路径将其转义)
您需要使用您自己的编程环境的功能(库,工具等)通过HTTP,WS或IPC连接到配置有上述标志的Geth节点,并且您需要在所有传输中说出JSON-RPC。您可以对多个请求重复使用相同的连接!

注意:请理解在此之前打开基于HTTP / WS的传输所带来的安全隐患!互联网上的***正在积极尝试用暴露的API来颠覆以太节点!此外,所有浏览器选项卡都可以访问本地运行的Web服务器,因此恶意网页可能会尝试颠覆本地可用的API!

实战- 从零开始搭建以太坊私有网络

维护您自己的专用网络更为重要,因为官方网络中许多理所当然的配置需要手动设置。

定义私有创世纪状态

首先,您需要创建您的网络的创世纪状态,所有节点都需要了解并达成一致。 这包含一个小JSON文件(例如,将其称为genesis.json):

    {
        "config": {
                    "chainId": 0,
                    "homesteadBlock": 0,
                    "eip155Block": 0,
                    "eip158Block": 0
            },
        "alloc"      : {},
        "coinbase"   : "0x0000000000000000000000000000000000000000",
        "difficulty" : "0x20000",
        "extraData"  : "",
        "gasLimit"   : "0x2fefd8",
        "nonce"      : "0x0000000000000042",
        "mixhash"    : "0x0000000000000000000000000000000000000000000000000000000000000000",
        "parentHash" : "0x0000000000000000000000000000000000000000000000000000000000000000",
        "timestamp"  : "0x00"
    }

上述字段对于大多数目的应该没问题,但我们建议将随机数更改为某个随机值,以防止未知的远程节点能够连接到您。 如果您想预先为某些帐户提供资金以便于测试,则可以使用帐户配置填充alloc字段:

"alloc": {
    "0x0000000000000000000000000000000000000001": {"balance": "111111111"},
    "0x0000000000000000000000000000000000000002": {"balance": "222222222"}
}

在上面的JSON文件中定义了Geneis状态之后,您需要在启动每个Geth节点之前初始化它,以确保正确设置所有区块链参数:

$ geth --datadir=path/to/your/databases/and/keystore  init path/to/genesis.json 
--datadir数据库和密钥库的数据目录,默认是在“~/.ethereum”

方法二:在执行启动命令的参数中添加以下参数

--datadir=path/to/your/databases/and/keystore init path/to/genesis.json

附-参数详解:

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

创建会合点

所有要运行的节点都初始化为所需的创世纪状态,则需要启动引导程序节点,其他人可以使用它来在网络中和/或通过互联网找到彼此。方法是配置和运行专用的引导节点:

$ bootnode --genkey=boot.key
$ bootnode --nodekey=boot.key
INFO [03-06|17:35:12] UDP listener up                          self=enode://4cd15426a69ebf094a1cdeda9e6c987752c1108d87bcc6331be10f464e0c5d9e14197495584e58a986d933ad5a39da5fa1dfa84b7f793b4bde94e1578bfaf57e@[::]:3030

在bootnode联机的情况下,它会显示一个enode URL,其他节点可以使用它来连接它并交换对等信息。确保使用外部可访问的IP替换显示的IP地址信息(最可能是[::])以获取实际的enode URL。
注意:您也可以使用完全成熟的Geth节点作为引导节点,但这是不太推荐的方式。

  • 以太坊节点可以用URL方案“enode”来描述。

    十六进制节点ID编码在URL的用户名部分,与主机通过@符号分隔。 主机名只能作为IP地址给出,不允许DNS域名。 主机名部分的端口是TCP侦听端口。 如果TCP和UDP(发现)端口不同,则将UDP端口指定为查询参数“discport”。

在以下示例中,节点URL描述了IP地址为10.3.58.6,TCP监听端口30303和UDP发现端口30301的节点。

enode://6f8a80d14311c39f35f516fa664deaaaa13e85b2f7493f37f6144d86991ec012937307647bd3b9a82abe2974e1407241d54947bbb39763a4cac9f77166ad92a0@10.3.58.6:30303 discport=30301
enode url方案由Node发现协议使用,可用于客户端的bootnodes命令行选项或作为JSRE中的suggestPeer(nodeURL)函数的参数。

启动您的成员节点

在bootnode运行并可从外部访问的情况下(您可以尝试telnet <ip> <port>以确保它确实可以访问),请通过--bootnodes标志启动每个后续Geth节点,指向该对等方发现的bootnode。将私有网络的数据目录分开可能也是可取的,所以也要指定一个自定义--datadir标志。

$ geth -port=listenPort --datadir=path/to/your/databases/and/keystore --bootnodes=<bootnode-enode-url-from-above>

注意:由于您的网络将与主网络和测试网络完全隔离,因此您还需要配置矿工来处理事务并为您创建新块。

经营私人矿工

在公共以太坊网络上进行挖掘是一项复杂的任务,因为它只能使用GPU,需要OpenCL或CUDA启用的ethminer实例。有关这种设置的信息,请查看https://www.reddit.com/r/EtherMining/ 或者https://github.com/ethereum-mining/ethminer矿工资源库。

但是,在专用网络设置中,单个CPU采集器实例对于实际应用来说已经足够了,因为它可以在不需要大量资源的情况下以正确的时间间隔产生稳定的数据块流(考虑在单个线程上运行,不需要多个)。要为挖掘启动Geth实例,请使用所有通常的标志运行它,并通过扩展:

$ geth <常见标志> --mine --minerthreads = 1 --etherbase = 0x0000000000000000000000000000000000000000

这将在单个CPU线程上开始挖掘块和事务,并将所有过程记录到由--etherbase指定的帐户。您可以通过将默认气体限制块更改为(--targetgaslimit)并在(--gasprice)接受价格交易来进一步调整采矿。