陈琳
渡鸦区块链专栏作者
以太坊创始人 Vitalik Buterin
在研究以太坊技术的过程中,相关资料还是比较少,为了防止读者走较多的弯路。我们推荐一篇从实战出发的文章,向大家详细介绍以太坊的概念以及工具Geth,直接可以上手使用。EEA的生态圈建设还是需要写代码来一同实现,现在代码还没看到不好评价,前景还是比较看好的,欢迎大家留言与作者交流、探讨。
以太坊,最简单的说法就是:区块链技术+智能合约。
以太坊和区块链技术一样,有Transaction,Block,账户与账户之间的关系需要用Transaction来执行,任何Transaction都需要有通过挖矿的block来产生。
以太坊和原来的比特币技术不同的是
1、实现了基于Solidity语言的智能合约,并将智能合约看做一种特殊的账户,从而使得在智能合约上也可以实现具体的方法
2、实现了智能合约能落地执行的EVM(以太坊虚拟机),通过以太坊虚拟机,从而将solidity这样的类js的代码变成了可以在去区块链上执行的加密代码。
3、不同于比特币技术,在以太坊的transaction都需要用到gas,一份合约或者一次交易的gas是固定的(取决于代码大小和复杂度),而gas的价格则由以太坊中的oracle来决定。
4、以太坊同时还构建了较完整的、开源的生态系统,不仅有底层的geth、编程的solidity、合约在线浏览器browser-solidity、合约钱包Mist/wallet、以太坊的前端开发框架Truffle、各种各样的开源DApp等等,方便大家快速上手,并开发出适合落地的区块链应用。
Geth工具是Go Ethereum, 是以太坊的官方客户端(Go语言实现)
通过Geth的一些基本命令,可以很方便的创建出一个以太坊的私有链条。
geth --datadir "./" init genesis.json
geth --datadir "./" --nodiscover console 2>>geth.log
Geth的命令行中包含了大多数的以太坊的命令,包括账户新建,账户之间的以太币转移,挖矿,获取余额,部署以太坊合约等。
当然Geth的缺点也很明显,Geth还是偏底层的内容,很多操作需要较多较复杂的输入。
这是以太坊智能合约的浏览器编译器,直接访问网站即可,当然如果觉得速度太慢不稳定,也可以自己搭建。
Browser-solidity 因为运行在内存中,因此速度很快,对于一些简单的功能,例如四则运算等,开发调试变得非常容易。
Browser-solidity 中我们将会向大家重复了一些基本的概念,如transaction,gas,account等。
Browser-solidity的缺点也很明显,那就是因为运行在内存中,所以对于涉及账户的合约开发、调试&测试,相当的无力。因此接下来向大家介绍了Mist这个官方钱包工具
Mist是以太坊的官方钱包,他既可以连接生产网络、测试网络,更加可以通过设置参数的方式,连接我们自己的私有网络
Mist在通过geth.ipc文件连接后,就和Geth所建立的网络完全契合在一起了,在Mist上部署的合约,实际上也就是部署在了geth网络上。geth网络上新建账号,也可以在Mist这个工具上看到。
通过Mist,我们向大家更详细的讲解了以太坊的核心概念,包括:区块、Transaction、Gas、账户、合约、合约中的构造函数,变量以及方法。
通过Geth、Browser-solidity、Mist 三个工具的介绍,给我们提供了开发、调试和测试我们智能合约的很好的利器。
Geth 又名Go Ethereum. 是以太坊协议的三种实现之一,由Go语言开发,完全开源的项目。Geth 可以被安装在很多操作系统上,包括Windows、Linux、Mac的OSX、Android或者IOS系统
Geth官网:https://geth.ethereum.org/
Geth的Github地址:https://github.com/ethereum/go-ethereum
Geth是以太坊协议的具体落地实现,通过Geth,你可以实现以太坊的各种功能,如账户的新建编辑删除,开启挖矿,ether币的转移,智能合约的部署和执行等等
安装文档:https://ethereum.github.io/go-ethereum/install/
这里演示在MacBook上的安装,Linux&Windows系统的人请参照文档。
brew tap ethereum/ethereum
brew install ethereum
安装截图如下:
输入 geth version,检查是否安装成功
如果如图所示,出现了Geth的版本号,那么恭喜你,Geth安装成功!
接下来我们将实战如何使用Geth,如何搭建以太坊的私有网络。
之前说过Geth是三种实现以太坊协议的工具之一,由于Geth是官方推崇的以及个人精力有限,对于另外两种工具的搭建私有网络,请参考网上资料。
下面的Geth实战,在MacBook上实现,对于Windows方面,比较类似。
在命令行模式创建一个目录,例如tmpPrivate
创建文件genesis.json, 并填入如下内容。
{
"nonce": "0x0000000000000042",
"timestamp": "0x0",
"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"extraData": "0x0",
"gasLimit": "0x80000000",
"difficulty": "0x1",
"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000",
"coinbase": "0x3333333333333333333333333333333333333333",
"alloc": { }
}
用户可以vim,也可以用其他编辑器如sublime等,个人推荐使用Atom
Atom 官网地址: https://atom.io/
Atom 是一个由谷歌支持发布的文本编辑器, 一个你可以自定义做任何事情的现代编辑器,后面涉及文件和代码演示会主要在Atom上执行。
创建完成后,在Atom中,本文件夹下应该只有一个genesis.json
切换回命令行,执行命令,制造创世区块
geth --datadir "./" init genesis.json
执行结果如下:
这时候可以注意一下,此时当前目录下面会新增出两个文件夹geth和keystore
此时从Atom中看到的目录结构是这样的:
执行一条最简单的geth命令,来创建自己的私有链条
geth --datadir "./" --nodiscover console 2>>geth.log
geth的参数项目很多,有兴趣的可以打geth –help 来获得详细信息,我们也会在之后的章节中对关键参数项进行说明。
此时的命令行应该是这样的:
输入命令eth.accounts
, 我们会发现返回值为[]
这是因为此时虽然以太坊的私有链已经被创造出来,但还没有任何账户。
输入命令personal.newAccount("xxx")
, 该命令将创造一个新的用户,该用户的密码是xxx
. 当然用户也可以将xxx
改为123,或者123456,或者任意密码
再次输入命令 eth.accounts
, 我们会发现一个新的用户被创建了出来,这就代表我们已经创建了一个账户,重复personal.newAccount()
& eth.accounts
我们可以创建若干个账户出来
整个命令截图如下:
在Step 3中,我们执行的代码
geth --datadir "./" --nodiscover console 2>>geth.log
其中的代码 console 2>> geth.log
代表将控制台的一部分输出,输出到文件geth.log上去。
打开另一个终端,找到geth.log的所在目录,执行命令 tail -f geth.log
从而持续的输出以太坊的日志
整个过程如下图所示:
在命令行中执行命令 miner.start()
, 开始在我们的区块链上进行挖矿
此时Geth.log的输出应该是这样的
一直等到100%。这个以太坊私有链就会正式启动,并持续不断的生成出以太坊来。
acc0 = eth.accounts[0]
eth.getBalance(acc0)
结果只要不为0,那就说明挖矿成功!
我们可以用下面命令,建立一个新的私有链
geth --datadir "./" --nodiscover console 2>>geth.log
进入命令行模式,其中参数
–datadir 代表文件夹地址,
–nodiscover 代表该链条不希望被其他节点发现,
console >> geth.log 代表将控制台输出到文件geth.log中去
当然从命令行模式退出,也很简单,只要打入exit, 即可退出
我们在命令行输入 eth.accounts
可以看到当前该区块链中共有几个账号,以及每个账号的公钥地址。
这里就要说到以太坊的账户体系了,
在以太坊系统中,状态是由被称为“账户”(每个账户由一个20字节的地址)的对象和在两个账户之间转移价值和信息的状态转换构成的。以太坊的账户包含四个部分:
随机数,用于确定每笔交易只能被处理一次的计数器
账户目前的以太币余额
账户的合约代码,如果有的话
账户的存储(默认为空)
简单地说,每一个以太坊账户都有一对公钥和私钥组成。
公钥我们可以理解为就是账户地址,任何其他账户都可以访问该地址
私钥可以理解为一段加密过的密码,这一对公钥和私钥共同组成一个唯一标示的以太坊账户。
例如在上节我们建立的第一个以太坊账户 eth.accounts[0] 中,地址 0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f
就是公钥,而对密码加密而成的,就是私钥。
我们可以输入命令 personal.newAccount("123")
来新建一个账户,(注意123可以修改为任何别的密码)
这个时候我们可以看到除了第一个账户0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f
之外,还新增了另一个账户 0xb8b12a801b610176935a15321f77b48dd5c0c448
, 此时输入eth.accounts, 就可以很轻松的看到有两个账户的公钥地址。
在上一章中我们说过,当以太坊的私链在挖矿时候,所挖到的以太币都会存入第一个以太坊账户中,即eth.accounts[0] 中,而eth.accounts[1]默认是不会有以太币的。这个时候我们可以用下面的命令来查看eth.accounts[0] 中的以太币余额。
eth.getBalance("0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f")
eth.getBalance("0xb8b12a801b610176935a15321f77b48dd5c0c448")
其中0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f
是第一个账户的地址,
0xb8b12a801b610176935a15321f77b48dd5c0c448
是第二个账户的地址 结果如下:
从上我们可以看得很清楚,挖矿得来的以太币都进了第一个账户,同时每个账户的公钥是该账户的核心。通过公钥我么可以对该账户的以太币进行增删改查各种操作
前面说过每个账户的公钥(地址)是一切以太坊账户操作的核心,但地址字符串太长,我们用acc0/acc1 分别代表accounts[0]和[1],另外设置要转移0.01个以太币
> acc0 = eth.accounts[0]
"0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f"
> acc1 = eth.accounts[1]
"0xb8b12a801b610176935a15321f77b48dd5c0c448"
> amount = web3.toWei(0.01)
"10000000000000000"
这个时候我们可以使用eth.sendTransaction来将0.01个以太币从acc0转移到acc1中。
> eth.sendTransaction({from: acc0, to: acc1, value: amount})
结果如下:
这个是以太坊的一个保护机制,每隔一段时间账户就会自动锁定,这个时候任何以太币在账户之间的转换都会被拒绝,除非把该账户解锁.
这个时候我们就需要执行 personal.unlockAccount(acc0)
并输入密码来解锁acc0才可。
> personal.unlockAccount(acc0)
Unlock account 0xbcf5b841303bc08026ce2d3b8f83498ffe42c12f
Passphrase:
true
>
这个时候我们重新执行命令eth.sendTransaction({from: acc0, to: acc1, value: amount})
, 结果如下:
> eth.sendTransaction({from: acc0, to: acc1, value: amount})
"0xeea74dd5ff3f1287614d52ebb674edb93e8c5e51e4296835044d3d858d3d9f10"
> eth.getBalance(acc1)
10000000000000000
>
我们可以看到这个时候acc1有了数值10000000000000000
, 而不再是之前的0了。但我们明明要给0.01ether币的,为何数值会如此大呢? 其实是对的,我们只要输入命令web3.fromWei(10000000000000000,"ether")
就可以知道了。
> web3.fromWei(10000000000000000,"ether")
"0.01"
作者简介:陈琳(steven.k.colin@gmail.com)
以太中文网创始人
资深互联网从业人员。一直从事互联网金融行业、以太坊技术、hyperledger、比特币等区块链技术的研究探索工作。现主要致力于区块链技术的培训、推广、生态建设工作。
加入渡鸦
(全职记者∕实习生):cx@jqblockchain.com
转载、投稿、入群 请联系微信号:lofeer88