最近在研究区块链。打算先搭建一个测试环境开始运行。这里记录整个搭建过程,供后来人参考。 整体上,分为三个步骤,安装相关软件,初始化系统,建立集群,以及最后一步,挖矿。 我们采用的是以太坊,相对其他区块链,这是一个成熟的环境。 虽然近期有硬分支的事件,对企业应用来说,功能上还算是比较完善的。
安装部署1.安装 Go 环境如果机器无法上外网,还得配置一下代理。 Ubuntu配置代理的方式网上很多,这里不介绍。
2.安装 ethereum
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
在执行 sudo add-apt-repository -y ppa:ethereum/ethereum的时候碰到这个问题:
root@ubuntu-KVM:~# sudo add-apt-repository -y ppa:ethereum/ethereum
Cannot add PPA: 'ppa:ethereum/ethereum'.
Please check that the PPA name or format is correct.
sudo apt-get install software-properties-common
sudo -E add-apt-repository -y ppa:ethereum/ethereum
sudo -E add-apt-repository -y ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum
3.安装 solc 编译器
sudo add-apt-repository ppa:ethereum/ethereum-qt
sudo add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install cpp-ethereum
同样的,如果碰到PPA Name错误的警示,则执行如下操作:
sudo -E add-apt-repository ppa:ethereum/ethereum-qt
sudo -E add-apt-repository ppa:ethereum/ethereum
sudo apt-get update
sudo apt-get install cpp-ethereum
这样相关软件已经安装完毕。
搭建私链1.启动geth服务
geth --datadir "/root/chain" console
其中 datadir用于指定数据目录。这个目录不能够预先创建,否则命令会失败。 执行结果如下:
2.创建账号执行之后,进入geth的交互模式。 接着建立一个账号,然后退出。 这个账号用于执行创世操作。 然后exit退出
> personal.newAccount("密码"); "0xea5c99831c2e4a0e094facdbac1befcf6c92e543"> exit3.创建创世区块编译创建创世区块所需要的脚本, 注意alloc下的key需要和上述的账号保持一致。
{ "alloc": { "0xea5c99831c2e4a0e094facdbac1befcf6c92e543": { "balance": "1000" } }, "nonce": "0x0000000000000042", "difficulty": "0x020000", "mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", "coinbase": "0x0000000000000000000000000000000000000000", "timestamp": "0x00", "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", "extraData": "CNNMoney Jack Ma interview: Wars start when trade stops, 20160902", "gasLimit": "0xffffffff" }各个参数的含义如下:
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的消耗总量限制,用来限制区块能包含的交易信息总和,因为我们是私有链,所以填最大。
创建数据存放地址并初始化创世块
geth --datadir "/root/chain" init genesis.json
执行结果如下: 4.启动私链执行如下脚本
geth --identity "phoenix" --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 98888 console
各参数说明如下:
identity :区块链的标示,随便填写,用于标示目前网络的名字
init :指定创世块文件的位置,并创建初始块
datadir :设置当前区块链网络数据存放的位置
port:网络监听端口,默认是8080
rpc:启动rpc通信,可以进行智能合约的部署和调试。它在geth中通常被默认激活。
rpcapi: 设置允许连接的rpc的客户端,一般为db,eth,net,web3
networkid: 设置当前区块链的网络ID,用于区分不同的网络,是一个数字
console:启动命令行模式,可以在Geth中执行命令
此外,还可以使用如下参数:
nodiscover : 使用这个命令可以确保你的节点不会被非手动添加你的人发现。否则,你的节点可能被陌生人的区块链无意添加,如果他和你有相同的初始文件和网络ID。
maxpeers : 如果你不希望其他人连接到你的测试链,可以使用maxpeers 0。反之,如果你确切知道希望多少人连接到你的节点,你也可以通过调整数字来实现。
rpcapi : 这个命令可以决定允许什么API通过RPC进入。在默认情况下,geth可以在RPC激活web3界面。请注意在RPC/IPC界面提供API,会使每个可以进入这个界面(例如dapp’s)的人都有权限访问这个API。注意你激活的是哪个API。Geth会默认激活IPC界面上所有的API,以及RPC界面上的db,eth,net和web3 API。
rpccorsdomain : 这个可以指示什么URL能连接到你的节点来执行RPC定制端任务。务必谨慎,输入一个特定的URL而不是wildcard ( * ),后者会使所有的URL都能连接到你的RPC实例。
启动后界面如下,光标停留在最后的命令行上,可以执行以太坊命令。 可以看到Listening on [::]:30303和Welcome to the Geth JavaScript console!的提示,说明已经启动成功
注意:如果想将Ubuntu作为永久区块链节点使用,当使用nohup命令时,Geth启动参数console必须去掉,否则Geth会自动停止。
执行结果如下: 5.查看节点信息常用命令:
- net.listening:查看网络是否在监听;
- admin.peers: 查看当前连接的节点。 目前还是空的。
- admin.nodeInfo:查看当前节点的信息。
执行:
> admin.nodeInfo得到当前节点信息如下:
{ enode: "enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@[::]:30303", id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094", ip: "::", listenAddr: "[::]:30303", name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix", ports: { discovery: 30303, listener: 30303 }, protocols: { eth: { difficulty: 131072, genesis: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b", head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b", network: 98888 } }}注意enode节点,这是当前节点的标识。 后续会用到这个值。
6.查看账户信息在创建创世节点时,我们创建了个默认账户。可以通过如下命令查看账户余额。
> eth.accounts["0x4b691e86c622127ed8e1d49899ad8c1d19834327"]> primary=eth.accounts[0]"0x4b691e86c622127ed8e1d49899ad8c1d19834327"> balance = web3.fromWei(eth.getBalance(primary), "ether");20配置第二台私链服务器第二台私链服务器,需要把第一台的步骤基本都要重复一遍。两台服务器配置一样才可以通讯。 需要改变的地方是:
7.添加静态节点列表在{datadir}下添加文件 static-nodes.json,内容如下:
["enode://dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094@第一个节点的IP地址:30303"]执行如下脚本启动节点:
geth --identity "phoenix" --rpc --rpccorsdomain "*" --datadir "/root/chain" --port "30303" --rpcapi "db,eth,net,web3" --networkid 98888 console
启动成功后,查看当前连接的节点:
> admin.peers[{ caps: ["eth/62", "eth/63"], id: "dfd047d64a3d8c9d9c2834bc8c3bbf41a79e6797956fa99469b872d97a7978e4e7a6d9605ec6e77164515f6f09d979999ca3ef91eebcd2a6c91ebdfe167de094", name: "Geth/v1.5.0-unstable/linux/go1.5.1/phoenix", network: { localAddress: "10.15.244.204:56808", remoteAddress: "10.15.244.203:30303" }, protocols: { eth: { difficulty: 131072, head: "0xaab381212b8108c488c8d21c06042a9081b94bfb87665110520d3c295626e79b", version: 63 } }}]挖矿激动人心的时刻到了。 作为一个伪金融圈人士,最大的梦想,古时候叫拥有一个聚宝盆,现在叫拥有一个印钞权,在数字货币时代,叫拥有一个挖矿机。 自己搭建的区块链,想怎么挖就怎么挖吧。
私链启动起来之后,挖矿其实很简单了。 首先必须保证的有一个账号:
> eth.accounts
["0x1b39aa2446de648dd6928a759c542690cc32757b"]
> eth.getBalance(eth.accounts[0]).toNumber();
0
账号里没钱。 那就开始挖吧。挖矿其实很简单,一个命令就开始了。默认的,挖到的钱,都放在当前账号中。如果有多个账号,默认的放到第一个账号中。 在geth环境下,运行:
或者运行命令行:
geth --mine --minerthreads=4
minerthreads用来指定运行的线程数。默认为当前CPU的核数。 如果有多个账号,可以指定挖矿收入放到第几个账号,注意编号是从0开始的:
miner.setEtherbase(eth.accounts[0])
或者命令行执行:
geth --etherbase 0 --mine 2>> geth.log // 0 is index: first account by creation order OR
geth --etherbase '0x1b39aa2446de648dd6928a759c542690cc32757b' --mine 2>> geth.log
半小时后,查看下账户余额:
> eth.getBalance(eth.accounts[0]).toNumber();
1.5971875e+21
话说, e+21,那是多大的数字啊??一辈子还没见过这么多钱。 头条的同学们,记得帮忙点赞啊。
以太坊生态系统中的工具和技术
如果你是一个以太坊或区块链的新手开发者,那么你可能正费力地(至少我是)试图了解以太坊生态系统中的所有工具和技术。 所以在开始学习以太坊之时,我决定简单介绍一下你经常遇到的各种组件。 希望这将有助于您全面地了解以太坊生态系统,以及每一部分是如何联系在一起。
如果您之前已经创建了Web应用程序,我写了一篇文章,比较了以太坊区块链和Web应用程序架构,这可能有助于更深入地了解以太坊。 2 . Geth
Geth是由以太坊基金会提供的官方客户端软件。它是用Go编程语言编写的。 这个软件包几个值得了解的组件: 4 . Web3.js
就像你用 geth,mist 浏览器等等,来与以太坊节点进行通信,还有一个名为Web3.js的javascript库,可以用来与一个节点进行交互。 由于它是一个 JavaScript 库,您可以使用它来构建基于Web的dapps。
5 . Solidity
Solidity是用于编写在以太坊区块链上运行的智能合约的最流行的编程语言。 它是一种高级语言,当编译转换为 EVM 字节码。 这与 Java 非常相似,其中有诸如 Scala,Groovy,Clojure,JRuby等JVM语言。所有这些编译都生成在JVM(Java虚拟机)中运行的字节码。 只要遵循规范,你也可以创建一个像 Solidity 这样的语言,编译成的 EVN 运行的字节码。 就像您拥有Ruby on Rails,Python / Django等Web应用程序开发框架一样,Truffle 和 Embark 是用于开发以太坊 DApps的两个最常用的框架。 它们抽象出在区块链上编译和部署合同的许多复杂的东西。
7 . Metamask
如果你在经常关注以太坊社区,你一定会听过 Metamask 。 它是一个用于与以太坊节点进行交互的Chrome 插件。 让全世界的人都运行一个节点与区块链交互是不切实际的。 所以,Metamask会拥有一部分节点。 你只需要安装 Metamask ,它就会自动连接到他们的节点。
8 . ENS
ENS 以太坊域名服务是以太坊世界的DNS。 就像你将 IP 地址映射到可读取的名称一样,您可以将任何以太坊合约或钱包地址映射到一个易读的名称。
例如: 146.115.22.177 → google.com. 您不需要在浏览器中输入IP地址,而是输入google.com就可以解析该IP地址。
例如: 0x80C013d980aB049471c88E1603b8b4a60E03295C 是我的钱包地址。如果你想转给我一些以太币,你并不需要记住这个地址。 一旦 ENS 启动,我可能会将其映射到mvmurthy.eth,你可以很轻松地用它给我转钱 :)。
9 . Swarm
区块链能很好地存储少量的数据。 如果您要存储病历,销售合同或是需要公开时间戳的大型文件,该怎么办?在区块链中存储数据的代价很大,同时它不可扩展。 Swarm 解决了这个问题。 Swarm 是一个去中心化的内容存储和分发服务。 您可以将它视为 CDN,但它并不是在一家公司的服务器上托管的所有 CDN,而是通过互联网在计算机上分发。 就像运行一个以太坊节点一样,来运行一个 Swarm 节点连接到 Swarm 网络。
当您将一个以太坊合同部署到区块链时,您会获得ABI (https://github.com/ethereum/wiki/wiki/Ethereum-Contract-ABIJSON接口(类似于API的合约接口)。)的部署地址和 当您希望有人使用您的合约时,您必须提供部署的地址和ABI。 将来,ABI会存储在Swarm中,所以每个人都可以通过查看以太坊地址来查找ABI。
10 . IPFS
IPFS(Inter Planetary文件系统)在概念上与Swarm完全相似。 它是一个去中心化的存储系统。 它与以太坊没有直接关联,但可与以太坊集成。
您可以在以下网址阅读Swarm和IPFS之间的区别: https://github.com/ethersphere/go-ethereum/wiki/IPFS-&-SWARM
11 . Whisper
你可能听到很多关于 Whisper的谈论,但是在以太坊生态系统中,它是一项有趣的技术。 它是Dapps与其他......交互的互通协议。 点击以下网址阅读更多关于Whisper的内容: https://github.com/ethereum/wiki/wiki/Whisper 下图尝试把所有的东西放在一起:
希望以上能让您对以太坊生态系统有一个概括性的了解,并能深入地、更好地了解它。