【小哈划重点:如果你是下面两种情况,你应该阅读一下这篇博客。你是一个专业的软件工程师;你想对以太坊以及相关的生态系统有深层次的了解。从零开始读懂以太坊。】
预备知识:
1、你理解区块链的概念,理解 Bitcoin 如何使用区块链创造出一种无需信任的数字货币。如果你不理解,请看完这段短视频或者这段长视频。提示,你应该尽可能的看那段长视频。
2、你是一个专业的软件工程师,很严肃那种,你必须有大量软件设计的工作经验。理解 系统/架构/数学 可以使学习效率倍增。
3、差不多需要你一周的空闲时间。我已经告诉过你我们略过那些无意义的部分。
4、你理解默克尔树的基本概念以及它如何被用来快速验证信息的正确性。
注意:你不需要阅读白皮书,但是你需要有所了解。但是事实证明,阅读白皮书是入门最快的方法。
我建议你在几天时间里通篇阅读这个帖子,深层面的吸取本帖子中的精华,然后单独深入钻研每一个链接。
虽然整个生态系统中很多人有流行术语癌,你会惊奇地发现这项技术并没有多少(完全没有)不可思议的地方。每一个人的工作都站在了巨人的肩膀上。如果你是一个专业的软件工程师并以之谋生,你能够深层次理解这些项目和技术,就不要再为这些胡说八道分心了。
以太坊
以太坊是一个分布式的计算机网络;网络中的每一个节点执行一些字节代码(提示:智能合约),然后把结果的状态储存在区块链上。由于区块链具有表现应用状态的性能,这就是为什么“应用如果按照编写精准无误地运行,就不会出现故障问题,也不会受到审查、欺诈或第三方破坏”。
很显然短短一段话无法给出一个令人满意的解释。那就去去读一下以太坊白皮书吧。或者浏览互联网上诸多“如何使用以太坊/区块链/智能合约”相关内容的任一帖子。或者看看这段名为 “Ethereum in 25 Minutes” 的视频。(编者注:该超链接是 2016 年版的“25 分钟认识以太坊”,文末有 2017 年版的文字记录译本超链接。)
Smart Contract
智能合约字面上只是一些代码(真的,就是代码而已),运行于以太坊这样的分布式环境中。这个代码执行的平台给这段代码一些属性,例如:不可变性、确定的运算、分布式且可检验的状态等等。这些由上述代码管理的状态储存在区块链上,不可更改,任何人都可以从链的开始重放所有的交易,查看最新状态是否正确。
在以太坊中,合约都有一个地址作为其唯一的身份(即创建者的地址与他以前所发出交易数量的哈希值)。客户端可以通过发送给这个地址以太币、合约调用、查询分布式状态等形式与之交互。
重述一遍,智能合约只是由区块链管理的具有分布式状态的一些代码。例如,你用来接收和发送以太币的多重签名钱包(multi-sig wallets)就是一个带有精心设计用户界面的智能合约。
这个概念相当强大,而且我很肯定你已经看了关于它的一切。如果你还没有,那么去浏览一些你喜欢的带有适度技术性的原始资料(hey Medium!),你将被淹没在那些告诉你这个概念多么有潜力的人群之中。一些你可能会见到的术语:资产/权限管理、去中心化自治组织(DAOs)、身份、社交网络等等。
Gas
每一个完整节点都在网络上执行智能合约(又说起了,仅仅是微不足道的代码),这将存在大量的冗余(好的方面),但是也会耗费大量的能源和时间(坏的方面)。因为执行运算要花钱,执行运算成本与你的代码执行哪些运算指令直接相关。换一种方式来说,每一条低层操作码在以太坊虚拟机上执行的时候需要消耗一定数量的 “gas”。“gas” 是完全随意使用的一个词,仅仅是给运行计算指令成本的一个抽象的标签。为解决停机问题,有一个网络强制实施的 gas 上限,也就是说,你不能写一段永不停止的程序,你的运算会因为耗尽 gas 而被网络拒绝运行。
Gas 的“价格”(即在这个分布式计算机网络上加上两个数字要花费多少钱)由市场决定,和 Bitcoin 的交易费类似。如果你支付更高的 gas 价格,节点将为了更为丰厚的利润优先处理你的交易。
通常,在以太坊系统中运算和储存东西比传统环境中做同样的事情代价要高得多,但是以太坊能够给你的代码我们以上讨论过的优秀的性能,代价高也是合理的。
通常,状态读取是免费的,而写入则是要花费 gas。这里有个关于 gas 概念的更深入的综述。
以太坊合约中计算成本
分布式应用程序(dApp)
dApp 是一个分布式应用程序,其服务器端是存在于以太坊网络上的一个或者多个众所周知的智能合约。
dApp 无需在区块链上储存它所有的状态以及运行所有的运算,这对终端用户来说将会相当昂贵。但是 dApp 最终会在以太坊区块链上储存可信的状态,这些状态任何人都可以读取。很多 dApp 不在以太坊区块链上处理运算和储存,而是利用 IPFS 和 Golem (稍后讨论)技术,是以一种同样去中心化的方式执行这些操作。
以太坊团体在 GitHub 上有一个 dapp-bin 资源库,里面有一些参考文献和例子。你在查阅这些文献的时候一定注意看这些文件的活跃度,因为这类信息过时的很快。
另外,我们最终经在推特上票决一致通过 “dApp” 这种特有的大写形式(现在你明白了,这是有着重大统计意义的)。因此以后我们就都把它写成 “dApp”。
dApp 客户端
这些 dApp 通常都有易于使用的前端,因为没有人想用一个命令行界面或者用哈希值和操作码手动制作请求发出或者收到交易(天哪,光是想想就让人觉得头疼了)。
dApp 客户端字面上和你通常编程所用的任何术语“客户端”(“client”)或者“前端”(“frontend”)没有不同,区别在于这种客户端是和以太坊区块链进行交互的(或许还有其他的服务)。这类客户端经常用 JavaScript 写成,因为我们还没有完成将这个世界中所有东西转化成 NodeJS。
确切的说,大部分 dApp 客户端首选由 JavaScript 写成是因为这样它能够在人人都有的浏览器中运行。由于一些现存可利用工具的卓越性能,有的 dApp 客户端也经常用 GO 语言写成。这是一个有缺陷的良性循环,也就是说除非你详细知道你要做什么,否则你可以在 JavaScript 和 Go 之间选择一种来(某种程度上,Rust 也是一个选择)编写
dApp 客户端,用于与以太坊区块链及用相同语言开发的协议的交互。
* 对“分布式应用程序”的 准确术语/定义 就有些 困惑/争议:仅仅是智能合约吗?还是一个系统的整个后端,并不时与以太坊平台交互以存储可信的东西?亦或也包含客户端代码还有用户交互界面,这全部的东西作为一个整体被称作是“分布式应用程序”?
* 我将其定义为“与以太坊区块链交互的系统后端”。这足以和 “智能合约”的概念区别开来,保证属于它自己的概念,同时(正确地)暗含着任何人都可以创建一个与之交互的客户端。
dApp 浏览器
DApp浏览器,顾名思义,就是一个应用程序(就是大家都熟悉的普通程序),通过它可以让 dApp 客户端(通常由 javascript 编写,与以太坊节点交互,以和智能合约交流)使用起来更加简单。
dApp 浏览器主要功能:
1、提供一个与以太坊节点(本地节点或是远程节点)的连接和一个改变这个连接指向另一个不同节点(可能会去连接不同的网络)的简单方法。
2、为用户提供一个账户交互界面(“钱包”),使其能够很容易地与这些分布式应用程序交互。
Mist 是以太坊官方 dApp 浏览器。Mist 就是一个漂亮的用户界面,用来与以太坊节点的交互,发送或者收取与其他智能合约(dApps!)的交易。
Status 是一个移动端浏览器,给 dApps 的用户提供了独特的用户体验。
Toshi 是 Coinbase 在构建以太坊钱包和浏览器上的尝试。该项目非常相信“微信”和“聊天机器人”的共同作用。
MetaMask 是谷歌浏览器插件,它将谷歌浏览器变成去中心化应用程序浏览器。其核心特征就是将 web3,一个 JavaScript 以太坊客户端类库引入到每一条记录中,允许 dApps 连接到 MetaMask 托管的以太坊节点上。这个谷歌浏览器插件让你能够管理钱包,连接到不同的可用的以太坊网络上。
Parity 是一种结合你的浏览器并将其变成 dApp 浏览器的以太坊客户端(也是一个全节点实现)。
以太坊节点
所有你知道的有关比特币节点的知识在这里大多都适用。节点存储了区块链的一个副本,可以选择执行所有交易以确认产生的状态。你可以用 geth(第一方应用,用GO语言)或者 parity(第三方应用,用Rust语言)作为轻客户端或者自己经营一个全节点客户端。
自己运行节点的话你需要知道从哪个区块链进行同步以及与哪些节点进行交互;下文是对不同可用网络的讨论。
你可以用 docker 和一些持久的存储器去运行所有这些节点客户端。如果你不愿意独自运行一个节点,你可以使用第三方服务,如 Infura。还有一个运行本地节点进行测试和开发的方法,这个稍后再讨论。
如果你给用户配发了一个 dApp 客户端,你也无需提供以太坊节点入口;dApp 浏览器会提供任何客户端它们所需的连接。
以太坊代币
现在你就知道我们如何编写在区块链上存储状态的代码(智能合约)了吧?假设在那个状态中,我们存储了从一组以太坊地址到一个整数的映射。我们称那个整数为余额。什么东西的余额?就是我们所说的代币。
就是这样!所有你听说过的代币都是存储在分布式哈希表格中的数字,使用API(又叫做协议)对其进行增删操作。这里有一个基本代币合约(只有38行代码,一半是注解和空格)
去看一下the ethereum.org 上创建一个众筹项目的教程,你会明白它只是一个合约(众筹),与另一个合约(MyToken)交互,就像上面链接到的基本代币合约一样。没有什么不可思议的地方。
人们用将代币用于诸多用途,很快你就会发现想象力是无限的。代币常常用来激励人们与协议交互,证明资产的归属,证明投票权等等。关于代币、它们为何存在以及如何使用,来自 Coinbase 的 Fred Ehrsam 有一段很精彩的演讲。
Vitalik最近在博客发表了一篇帖子分析了代币销售模式,这也是一篇很精彩的阅读材料。
ERC20 / ERC223 / ERC777 / ERC827 / 所有种类的代币
为了使更多人与他们的代币合约交互,每个人都开始定义他们自己的协议,这过时的相当快。因此一些人聚集在一起创建了 ERC20 细则。上面写着“嗨,支持这些函数签名,我们就都会有更好地前景”。
由于 ERC20 细则的一些问题(由于设计时间段,较少安全考虑并且每次支付需要两次交易),现在我又有了更多代币标准的计划。
ERC223
ERC777
ERC827
* 大家对 ERC223 和 ERC23 的区别一直有一些困惑,他们是相同的概念,因为这个标准的 ERC 号码是 223,所以应该叫做 ERC223。
ERC721 / NFT Tokens(Non-fungible token)
ERC721 定义了一种非同质代币标准。(编者注:中译本见文末)“非同质”的意思是说每一个代币与另一个代币都是不同的;每一个代币的价值与另一个代币相比或多或少,具有唯一的属性。CryptoPunks 和 CryptoKitties 就是这方面最好的例子。
* 还有 ERC821,但是它的理念已经经过社区一致同意融合进 ERC721。