JobPlus知识库 IT 工业智能4.0 文章
区块链之以太坊初探

最近几年区块链技术特别火,特此翻阅了一些资料,基本都是一些理论知识,最后总的感觉还是天马行空,一片茫然。区块链,到底是什么技术,最后又能做什么呢?只知道其代表项目有比特币,但运行原理又是什么?带着这些疑惑,初步了解了一下区块链之以太坊项目。

以太坊

  • 概念 
    以太坊(英语: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版本

    3)、安装以太坊 
    下载的zip格式的源码包解压缩,并进入解压缩后的目录 

进入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” 
}

如图: 
 
5)、创世区块初始化

进入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的命令行则说明以太坊私有链安装成功了。



  • 账户管理、挖矿与转账 
    1)、账户管理 
    以太坊的终端使用命令 personal.listAccounts 列出现存的账号: 


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”)})

查看这两个账户的余额,发现数量未变化, 那是因为我们的交易还未成功写进区块,写进区块的方式是挖矿, 
我们再次开启挖矿,挖矿成功后,并停止挖矿,查看对应账户,发现金额出现变化。

目前搭建环境先到此,后续根据自己的学习尽快再进行补充。


如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

¥ 打赏支持
124人赞 举报
分享到
用户评价(0)

暂无评价,你也可以发布评价哦:)

扫码APP

扫描使用APP

扫码使用

扫描使用小程序