可能是目前为止最全的以太坊开发入门指南
导读:本文共7498字符,通常情况下阅读需要25分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:以太坊技术开发从入门到精通,干货篇。目标读者:专业的程序员;想深入了解以太坊/区块链及其生态的读者;如果你已经有一定的以太坊技术基础,只想研究一些落地项目,可以直接跳到后面的项目模块。预备知识:了解区块链的概念以及比特币的运行机制。如果不了解,可以先看看阿里云整理的区块链菜鸟入门系列(https://yq.aliyun/articles/60131?utm_content=m_41917);有基本... ...
目录
(为您整理了一些要点),点击可以直达。以太坊技术开发从入门到精通,干货篇。
目标读者:
专业的程序员;
想深入了解以太坊/区块链及其生态的读者;
如果你已经有一定的以太坊技术基础,只想研究一些落地项目,可以直接跳到后面的项目模块。
预备知识:
了解区块链的概念以及比特币的运行机制。如果不了解,可以先看看阿里云整理的区块链菜鸟入门系列(https://yq.aliyun/articles/60131?utm_content=m_41917);
有基本的编程知识将是极大的加分项,了解系统/架构/数学等知识。
不知你是否和我一样,一开始被各种数学问题所迷惑,如拜占庭问题,双花问题等。我的建议是一开始先抛开这些问题,对区块链的原理有一个基本的全局的了解,然后再回过头来思考这些问题。
事实上,如果我们只想基于以太坊开发智能合约应用,也不必完全理解区块链的架构。
以太坊
以太坊和比特币一样,底层框架都是区块链协议,区块链本质上是一个应用了密码学技术的分布式数据库系统。在看了前面提及的阿里云整理的科普文章之后,为了能进一步了解以太坊,建议看一下以太坊白皮书:https://github/ethereum/wiki/blob/master/%5B%E4%B8%AD%E6%96%87%5D-%E4%BB%A5%E5%A4%AA%E5%9D%8A%E7%99%BD%E7%9A%AE%E4%B9%A6.md
智能合约
智能合约是一段运行在以太坊区块链系统之上的一段代码,合约根据事先制订的规则来自动转移数字资产。例如,一个人可能有一个存储合约,形式为“A可以每天最多提现X个币,B每天最多Y个,A和B一起可以随意提取,A可以停掉B的提现权 ”。
以太坊账户
以太坊中有两种账户:外部账户(EOA)和合约账户
外部账户具有以下特性:
1.有一个以太币余额;
2.可以发送交易(以太币转账或者激活合约代码);
3.通过私钥控制;
4.没有相关联的代码。
合约账户拥有以下特性:
1.有一个以太币余额;
2.有相关联的代码;
3.代码执行是通过交易或者其他合约发送的call来激活;
4.当被执行时 -- 运行在随机复杂度 (图灵完备性)-- 只能操作其拥有的特定储存,例如可以拥有其永久state -- 可以call其他合约.
所有以太坊区块链上的行动都是由各账户发送的交易激活。每次一个合约账户收到一个交易,交易自带的参数都会成为代码的输入值运行。合约代码会被以太坊虚拟机(EVM)在每一个参与网络的节点上运行,以作为它们新区块的验证。
什么是Gas
智能合约由区块链网络中的每个完整节点重复执行,使得合约执行的消耗变得昂贵,所以这也促使大家将能在链下进行的运算都不放到区块链上进行。对于每个被执行的命令都会有一个特定的消耗,用单位gas计数。每个合约可以利用的命令都会有一个相应的gas值。gas值的存在避免智能合约进入死循环,你不能编写永不结束的程序,因为你用尽了gas,计算将被节点拒绝。
在以太坊中,每笔交易都被要求包括一个gas limit和一个交易愿为单位gas支付的费用。矿工可以有选择的打包这些交易并收取这些费用。在现实中,由于矿工会优先选择打包费用高的交易,所以用户所选择支付的交易费用多少会影响到该交易被打包所需等待的时长。
如果该交易由于计算,包括原始消息和一些触发的其他消息,需要使用的gas数量小于或等于所设置的gas limit,那么这个交易会被处理。
如果gas总消耗超过gas limit,那么所有的操作都会被复原,但交易是成立的并且交易费任会被矿工收取。区块链会显示这笔交易完成尝试,但因为没有提供足够的gas导致所有的合约命令都被复原(out-of-gas)。
所有交易里没有被使用的超量gas都会以以太币的形式打回给交易发起者。因为gas消耗一般只是一个大致估算,所以许多用户会超额支付gas来保证他们的交易会被接受。
去中心化应用DApp
DApp是一种“服务端”运行在区块链网络上的应用,类似于app运行在Android/iOS等设备上,DApp运行在以太坊网络上。以太坊在GitHub下有一个代码仓库dapp-bin(https://github/ethereum/dapp-bin),里面有一些文档和示例。使用前,你需要看看文件最近的状态,因为他们将很可能已经被淘汰。
DApp客户端
目前有四个可运行的,分别由C+ +,Go,Python和Java实现的几乎全兼容以太坊协议的客户端。C + +和Go实现的客户端目前完全兼容。
1. go-ethereum
go-ethereum客户端通常被称为geth,是目前用户最多,使用最广泛的客户端。通过Geth客户端与以太坊网络进行连接和交互可以实现账户管理、合约部署、挖矿等众多有趣且实用的功能(https://ethereum.github.io/go-ethereum)。
2. pyethapp
Pyethapp是以python为基础的客户端,实现以太坊加密经济状态机。python实现旨在提供一个更容易删节和扩展的代码库。Pyethapp利用两个以太坊核心组成部分来实现客户端:
pyethereum ——核心库,以区块链、以太坊模拟机和挖矿为特征;
pydevp2p ——点对点网络库,以节点发现和运输多码复用和加密连接为特征。
Github: https://github/ethereum/pyethapp
维基百科: https://github/ethereum/pyethapp/wiki/Getting-Started
Gitter聊天: https://gitter.im/ethereum/pyethapp
3. Parity
Parity 声称是世界上最快速最轻便的客户端。它用Rust语言写成,可靠性、性能和代码清晰度都有所增强。Parity由Ethcore开发。Ethcore由以太坊基金会的几个会员创建。
网站: https://ethcore.io/parity.html
Github: https://github/ethcore/parity
Gitter聊天: https://gitter.im/ethcore/parity
DApp浏览器
一个DApp浏览器,正如它字面所表达的,用来让DApp客户端(常常使用JS与以太坊的智能合约进行交互)的使用更加容易。
DApp浏览器的主要目的是:
提供到一个以太坊节点的连接(或者连接到一个本地节点或者远程节点),和一个方便的切换不同节点(甚至是不同的网络)。
提供一个帐户(或者一个钱包)来方便用户与DApp交互。
1. Mist
Mist(https://github/ethereum/mist)是以太坊官方的DApp浏览器。一个漂亮的界面来与以太坊节点交互,与智能合约发、收交易。
2. Status
Status(https://status.im/)是一个手机上可以使用的DApp浏览器。
3. MetaMask
MetaMask(https://metamask.io/)是一个Google浏览器扩展,把Chrome变成了一个DApp浏览器。它的核心特性是注入以太坊提供的js客户端库web3,到每一个界面,来让DApp连接到MetaMask提供的以太坊节点服务。不过这个Chrome扩展,可以允许你管理你的钱包,以及连接到不同的以太坊网络(译者注:包括本地的开发网络)。
4. Parity
Parity是一个以太坊客户端(也是一个全节点的实现),集成到了Web浏览器,并使之成为一个DApp浏览器。
以太坊代币
现在你应该知道我们可以通过写智能合约,并将状态存到区块链上了?那如果,在状态这块,我们存的是一个Map类型,键是地址,值是整数。然后我们将这些整数值叫做余额,谁的余额呢?它就是我们要说的代币(代币的数据结构就是这样简单,存的就是某个用户当前的余额)。
是的,所有你刚才听到的代币,只是一些数据,存储在一个哈希表里,通过api或者所谓的协议,来进行增删改查。这是一个简单的基本合约(https://github/OpenZeppelin/zeppelin-solidity/blob/master/contracts/token/ERC20/BasicToken.sol)。
你可以看看ethereum的创建一个众筹合约的官方教程(https://ethereum.org/crowdsale)。你将会发现它仅仅是一个合约(Crowdsale)与另一个合约(MyToken)交互,和前面的基本合约类似。并没有什么神奇的地方。
人们使用代币来做各种各样的事情,阻拦大家如何使用的只有想像力。代币常常用来激励用户与某个协议进行交互,或者证明对某个资产的所有权,投票权等等。
以太坊的创始人Vitalik最近有一个关于代币发售模型,也是一篇不错的文章(https://vitalik.ca/general//06/09/sales.html)。
与智能合约进行交互
你与智能合约的交互(也称做调用函数和读取状态)通过连接到某个以太坊节点,并执行操作码。当前有各种各样的以太坊客户端,可以方便进行开发。Geth和parity都提供了控制台或浏览器的方式来更好的与智能合约交互。
如果你想要一个程序的库用来与智能合约交互的接口,也有这样的客户端实现。对于JS语言,可以使用web3.js。以于go语言,可以使用在go-ethereum中的abigen的程序,提供了go包,用来与智能合约交互。
如果只是用来测试和开发,可以使用Ganache来运行一个本地节点(译者注:这个节点压短区块时间等,可以方便打整的开发与测试)。
当你部署了一个智能合约,你实际进行的操作是向地址0x0发送了一个交易,使用当前合约内容作为参数,一个以太坊交易详解(https://medium/@codetractio/inside-an-ethereum-transaction-fa94ffca912f)。
Truffle和Embark
一旦你开始写智能合约,你会重复做大量的操作,比如编译源码为字节码和abi,部署到网络,测试然后部署合约等等。你也许希望更关注于你想要实现的东西。
Truffle和Embark框架,标准化和自动化了这些琐碎的工作。它们提供了一个好的开发,部署,以及更为重要的,测试智能合约的体验。
你可以通过官方文档来开启使用Truffle的旅程。
我公众号之前也写了一篇使用truffle开发Dapp的文章,作为入门也是一个不错的选择:基于以太坊开发第一个去中心化应用——宠物商店。
Embark(https://github/embark-framework/embark)提供了类似的,帮助开发者组织工程的稍有些不同的工具。
当你一开始接触智能合约这块时,应该尽量不要使用框架。直到你明白了使用框架能带来的价值时,才应该开始使用,正如你不应该通过rails new来学习HTML语言一样。
ETHPM
分享是关心,所以ETHPM是一个去中心化的智能合约包管理资源库(https://ethpm/registry)。使用ETHPM,你可以关联或连接到某个著名的合约或库,减少代码重复,尽可能理想的为未来的开发提供好的基础。
这里的这个规范(https://github/ethereum/EIPs/issues/190),详细的说明了相关的信息以及背景。Truffle和Embark均可与之集成,并创造一个愉快的开发体验。
以太坊网络
Mainnet-以太坊主网,通常是所有客户端的默认网络。
Ropsten - 以太坊使用工作量证明的主测试网络。这个网络,因为低的计算量,容易遭到DDOS攻击,分片,或者其它问题。垃圾邮件攻击后被暂时放弃,最近才恢复使用。链接:https://github/ethereum/ropsten
Kovan - parity客户端组成的测试网络,使用授权证明来提升对垃圾邮件攻击的抗扰度,并且持续4秒的阻塞时间。链接:https://github/kovan-testnet/proposal
Rinkeby - geth客户端组成的测试网络,使用集团共识,尽管计算量低,但是对恶意行为者更有弹性。链接:https://rinkeby.io/
你可以自己搭建你自己的测试网络,也许使用kubernetes(https://github/MaximilianMeister/kuberneteth)或者docker-compose(https://capgemini.github.io/blockchain/ethereum-docker-compose),但也许你将很快就可以不需要花什么时间。
智能合约编程语言
Solidity
Solidity是第一批的描述智能合约的语言。当前是最流行的语言,因此也有最多的例子,文档,和教程。你应该学习这个,除非你有要学习其它的理由。
你可以使用基于浏览器的Remix IDE来进行快速验证。
下面是一个Solidity的合约:
pragma solidity ^0.4.11;contract BasicToken { mapping(address => uint256) balances; function transfer(address _to, uint256 _value) returns () { balances[msg.sender] = balances[msg.sender] - _value; balances[_to] = balances[_to] + _value; } function balanceOf(address _owner) constant returns (uint256 balance) { return balances[_owner]; }}
LLL
LLL是一门Lisp风格的底层编程语言,就像语言名称看到的这样。虽然以太坊官方并没有将它作为主要需要支持的语言,但它仍旧持续进行着更新,且与solidity在同一个资源库。
这是一个使用LLL语言写的一个ERC20代币的合约,链接:https://github/benjaminion/LLL_erc20/blob/1c659e890e2b30408555b9467a8dfd8988211b3b/erc20.lll
如果你正在学习,也许不是那么的容易习惯LLL语言的写法。
Serpent
Serpent是一个类Python的高级语言,最终也会被编译为EVM字节码。它主要被Augur团队使用。
但最近Zeppelin Solution团队发现其编译器有一个严重的bug,链接:https://blog.zeppelin.solutions/serpent-compiler-audit-3095d1257929。在这个问题被修复之前都不建议继续使用。
如果你对Augur如何解决这些漏洞感兴趣,你可以阅读Zeppelin Solution的这篇文章。链接:https://blog.zeppelin.solutions/augur-rep-token-critical-vulnerability-disclosure-3d8bdffd79d2
Serpent的合约看起来如下:
def register(key, value): # Key not yet claimed if not self.storage[key]: self.storage[key] = value return(1) else: return(0) # Key already claimeddef ask(key): return(self.storage[key])
智能合约的安全
一旦一个智能合约部署到了以太坊的网络上,它将是永不可变的,且将永久存在。如果你写了一个bug,你将不能下架这个有问题的版本,你只能在后续的版本中修复。
由于许多工程师开发的Ethereum和其他智能合同平台来自于Web开发,所以这个概念实在是太新,而且是疯狂的。
可能是目前为止最全的以太坊开发入门指南的详细内容,希望对您有所帮助,信息来源于网络。