最近几年区块链技术特别火,特此翻阅了一些资料,基本都是一些理论知识,最后总的感觉还是天马行空,一片茫然。区块链,到底是什么技术,最后又能做什么呢?只知道其代表项目有比特币,但运行原理又是什么?带着这些疑惑,初步了解了一下区块链之以太坊项目。
概念
以太坊(英语:Ethereum)是一个开源的有智能合约功能的公共区块链平台。通过其专用加密货币以太币(Ether)提供去中心化的虚拟机(“以太虚拟机” Ethereum Virtual Machine)来处理点对点合约(去中心化账本协议)。以太坊
的理念基因中不仅含有比特币基因,还含有BitTorrent、Java和Freenet的
基因。从产品的角度而言,它是一个通用的全球性区块链,可以管理金
融和非金融类型应用的状态。
本质上,以太坊促成去中心化的商业逻辑(business logic)——也
被称为智能合约,它是一个包含价值,当特定条件满足会被自动打开的
加密“箱子”(boxes)。商业逻辑在区块链云上(不需要服务器)执
行,在多方之间自动执行给定协议的条款。它们是“去中心化应
用”(DApp)的基本构件。从前端角度而言,以太坊拥有一个强大的专
用浏览器,使用户可以方便地安装和使用DApp。
这一新技术将促成Web3.0的基础设施的建立,将会建立在三层部件
之上:作为客户端的先进浏览器,共享资源的区块链账本,以及以去中
心化方式运行智能商业逻辑程序的计算机虚拟网络。
以太坊VS比特币
初看起来,比特币和以太坊都是开源平台,具有四项共同点:底层
的密码学货币、区块链、去中心化的共识证明机制和维护网络的矿工。
这一切使人们容易混淆比特币和以太坊,觉得它们肯定是类似的事物。
但是,当你深入探究时,会发现两者的不同点多于相同点。四项共同点
的每一项在以太坊和比特币中的作用和目的都是不一样的,出于这个原
因,以太坊会朝着一个不同于比特币的方向发展。
比特币最初被设计成一个用于交易货币价值的去中心化密码学货币
网络,比特币区块链的主要目的是:为这些金融交易提供信任支撑。只
是到了最近,比特币区块链才开始在非金融应用中被发现使用的情景。
因此,比特币区块链的可编程性只是事后的想法,并不是最初就有的设
计,虽然侧链的提议希望让编程更加容易。与比特币相反,以太坊从第
一天起就被构想为一个去中心化应用软件开发平台,它的区块链被设计
为支持去中心化应用的运行。所以,以太坊的设计有幸从比特币的经验
中学习,并改进了比特币的缺点。例如,与比特币10分钟的区块确认时
间相比,以太坊区块链执行确认的速度更加快速,确认时间在5~30秒范
围内。
以太坊的目标是实现大规模的去中心化应用,这需要以太坊成为一
个确定的、可审计的和可预测的计算平台。这不同于比特币的本质——
计算是以货币为中心的。因此,为了全面理解以太坊,不能盲目地将比
特币的挖矿、密码学货币用途和可编程性推及至以太坊。
首先,以太坊的密码学货币(被称为以太币)并不类似于比特币,
因为它的主要目的不是用于商品或者服务的支付,也不是“数字黄金”。
这是比特币的重要特性,但以太坊志不在此。以太币更像一种“加密燃
料”(crypto-fuel)形式的激励,支付运行各种智能商业逻辑程序所需的
交易费用(关于“燃料货币”相关知识,请参见后面章节)。除了作为网
络燃料以外,以太币也将作为一种数字货币在交易所交易,但是它的价
值更多地受交易需求量影响,而不是货币投机者。
以太币类似于云计算费用。当你在云中运行一个应用时,基于你的
运行时间、占用的存储空间、数据转移和计算速度,你需要向云计算公
司支付相应的费用。以太币费用的新颖之处在于你为运行在区块链上的
商业逻辑付费。
其次,以太坊区块链被设计为完全可编程,比比特币更具有经济效
率。它具有更大的可扩展性,对于用户可以低成本地使用区块链而言,
这是非常关键的要求。因为以太坊不只关注于实现金融交易,所以以太
坊区块链的目的不同于比特币。从技术上而言,以太坊的区块大小没有
上限,它可以动态地调整。
开发语言
以太坊的软件开发语言是其最大特性之一,因为对区块链进行编程
是一项首要目标。以太坊具有四种专用语言:Serpent(受Python启
发)、Solidity(受JavaScript启发)、Mutan(受Go启发)和LLL(受
Lisp启发),都是为面向合约编程而从底层开始设计的语言。
作为以太坊的高级编程语言,Serpent的设计非常类似于Python。它
的设计目标为最大可能的简洁和简单,将低级语言的高效优势与编程风
格中的易用性相结合。
Solidity是以太坊的首选语言,它内置了Serpent的所有特性,但是
语法类似于JavaScript,这降低了学习门槛,易于被掌握和使用,因为
JavaScript是Web开发者的常用语言。因此,Solidity充分利用了现有数
以百万程序员已掌握JavaScript这一现状。
去中心化应用
以太坊支持多种开发语言是非常重要的,因为这使得开发者可以选
用自己喜欢的语言,可以更加容易和高效地写去中心化应用。
一个DApp是由智能合约和客户端代码构成的。智能合约就像加密
的“箱子”,包含价值,只有当特定条件被满足时,它才能被打开。它封
装了一些逻辑、规则、处理步骤或者双方间的协议。当它们被发布在以
太坊上时,网络会执行它们的分支(ramification)。
以太坊客户端
以太坊包括一个专用的客户端浏览器,使用户可以运行各种各样的
DApp和发布智能合约。这一浏览器(以太坊浏览器被称为Mist)易于
使用,所以DApp和智能合约能够被大量用户使用。从降低用户使用门
槛角度而言,Mist是一项突破性成就
以太坊虚拟机
当你想到这些自足的逻辑脚本——运行在区块链上,在其上存储数
据,向发起人返回一些值时,就像运行在云中的程序。简单地说,这些
智能合约就是运行在以太坊虚拟机(EVM)上的代码。因此,这类似
于一个去中心化的虚拟计算服务,但是它不存在网站服务器这样的负
担,它被设计成点对点网络,所有参与者都可以运行,可以安全地(通
过加密和数字签名)向区块链写入数据和代码,读取上面的数据和代
码。
看了这些理论知识,可能还是觉得很迷茫,但是首先要明确一点,不管是比特币还是以太坊等区块链项目,其中心思想就是取中心化,
点对点模型:
下来通过搭建以太坊私有链,跟进一步了解其工作原理
环境安装
1)、golang安装
下载tar包,并上传服务器
https://storage.googleapis.com/golang/go1.9.4.linux-amd64.tar.gz
2)、下载以太坊源代码
下载源码(https://github.com/ethereum/go-ethereum/releases),我用的是1.8.11版本
进入go-ethereum-1.8.11目录下执行 make命令开始进行编译,
注意:golang版本一定要跟以太坊原码版本对应,否则会提示编译版本过低
目前网上很多实例用go-ethereum-1.4.12,但如果使用高版本的go,编译
过程会出现“make: * [geth] Error 1” 错误。
编译成功后,将在go-ethereum-1.8.11目录下出现build/bin这样的子目录,并且在该子目录下出现geth这样的可执行文件,
这样,我们的以太坊就安装完成了
4)、创世区块文件的准备
创建一个目录,创建一个lw_init.json文件,内容如下:
{
“nonce”:”0x0000000000000042”,
“mixhash”:”0x0000000000000000000000000000000000000000000000000000000000000000”,
“difficulty”: “0x4000”,
“alloc”: {},
“coinbase”:”0x0000000000000000000000000000000000000000”,
“timestamp”: “0x00”,
“parentHash”:”0x0000000000000000000000000000000000000000000000000000000000000000”,
“extraData”: “”,
“gasLimit”:”0x0000ffff”
}
进入go-ethereum-1.8.11/build/bin,执行以下命令以完成创世区块的创建
./geth –datadir “/app/yum/lw/chain” init lw_init.json
datadir后对应目录自定义
执行完成会出现如下语句:successfully wrote genesis block and/or chain rule set: 244469eaad4c9c7a245fa4962a6ed7346e9925317f222b580e7f3113f97226
注意:如果出现类似错误:Fatal: invalid genesis file: json: cannot unmarshal hex string of odd length into Go struct field Genesis.extraData of type
是由于我们没有定义初始的账户,去掉了创世区块的extraData的内容
6)、以太坊启动
./geth –rpc –rpccorsdomain “*” –datadir “/app/yum/lw/chain” –port “30303” –rpcapi “db,eth,net,web3” –networkid 100000 console
出现Welcome to the Geth JavaScript console! 句话,并自动进入geth的命令行则说明以太坊私有链安装成功了。
personal.listAccounts
[]
说明目前没有账号。我们使用personal.newAccount()这个命令创建一个账号,重复输入两次密码,则生成一个默认账户
2)、挖矿
第一步中创建的第一个账号是默认账号,这里是 0xe03e63c321999eef68cf111120a8bbfda41037b6,
我们使用web3.fromWei(eth.getBalance(eth.coinbase), “ether”)来查询这个默认账号余额:
web3.fromWei(eth.getBalance(eth.coinbase), “ether”)
0
当前默认账号的余额是0。 使用miner.start(1)命令开始挖矿:
miner.start(1)
INFO [06-18|23:33:40] Commit new mining work number=1 txs=0 uncles=0 elapsed=1.211ms
INFO [06-18|23:33:42] Generating DAG in progress epoch=0 percentage=0 elapsed=827.896ms
INFO [06-18|23:33:43] Generating DAG in progress epoch=0 percentage=1 elapsed=1.649s
INFO [06-18|23:33:43] Generating DAG in progress epoch=0 percentage=2 elapsed=2.524s
INFO [06-18|23:33:44] Generating DAG in progress epoch=0 percentage=3 elapsed=3.353s
当出现“Mined block”这样的字眼时,表明挖矿成功,此时,我们可以使用miner.stop()命令停止挖矿。
再次使用web3.fromWei(eth.getBalance(eth.coinbase), “ether”)来查询这个默认账号余额:
web3.fromWei(eth.getBalance(eth.coinbase), “ether”)
15
3)、转账
本地创建另外一个账号作为转账的接收方,
personal.newAccount(“wei.lu”)
“0x254f1f7952b5bc6111f55186ed093f2c99309d23”
执行转账指令eth.sendTransaction({from: ‘0xe03e63c321999eef68cf111120a8bbfda41037b6’, to: ‘0x254f1f7952b5bc6111f55186ed093f2c99309d23’, value: web3.toWei(1, “ether”)})
查看这两个账户的余额,发现数量未变化, 那是因为我们的交易还未成功写进区块,写进区块的方式是挖矿,
我们再次开启挖矿,挖矿成功后,并停止挖矿,查看对应账户,发现金额出现变化。
目前搭建环境先到此,后续根据自己的学习尽快再进行补充。