区块链之以太坊初探

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

以太坊

  • 概念
    以太坊(英语: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)上的代码。因此,这类似
    于一个去中心化的虚拟计算服务,但是它不存在网站服务器这样的负
    担,它被设计成点对点网络,所有参与者都可以运行,可以安全地(通
    过加密和数字签名)向区块链写入数据和代码,读取上面的数据和代
    码。

看了这些理论知识,可能还是觉得很迷茫,但是首先要明确一点,不管是比特币还是以太坊等区块链项目,其中心思想就是取中心化,
点对点模型:
点对点模型

传统的中心化模型:
中心化模型

下来通过搭建以太坊私有链,跟进一步了解其工作原理

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

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

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

猜你喜欢

转载自blog.csdn.net/vipshop_fin_dev/article/details/80727980