小跑进入以太坊 | Part-2

与智能合约的交互

通过连接到以太坊节点,并用 JSON-RPC 调用接口执行函数,你可以与智能协议交互(也就是执行方法与读取状态)。有各种各样的以太坊节点客户端用开发者友好的方式实现这一功能。Geth 和 parity 都提供了控制台/浏览器实现与合约的交互。

如果你想以编程方式与合约交互,也有多种这样的以太坊客户端实现。比较流行的有JavaScript, web3.js, ethjs 和 ethers.js。对于go语言,在 go-ethereum(geth)中可执行的 abigen 工具提供了 go 语言版本的程序包来实现与合约的交互。从根本上说,它只不过是一个标准的 JSON RPC 协议调用接口,因此一旦不可用,你可以自己选择语言去编写你自己的转接器。有些客户端类库除了支持简单函数的执行,也支持便捷函数。

用 Ganache(以前叫做 ethereumjs-testrpc)运行一个本地以太坊节点来测试和开发。

当你要配置一个智能合约,你真正在做的其实就是用合约字节代码作为参数发送交易到零地址 ( 0x0 )。

下面更多有关于交易的信息:

以太坊交易的内情<https://medium.com/@codetractio/inside-an-ethereum-transaction-fa94ffca912f>

Truffle, Embark, Populous, Perigord 和其他编程语言开发框架

一旦你开始编写智能合约,你最终会反复做很多同样的事情,把你的源代码编译成字节代码和二进制接口,把它配置到网络上面,测试配置的合约等等。你兴许还想要一个好的办法去试一下你的新想法。

诸如 Truffle、Embark、Populous 和 Perigord 这些框架使很多琐碎的工作标准化与自动化,为合约编写、合约配置以及极其重要的合约测试提供了良好的开发体验。

Truffle(用Node写成)是采用率最高的开发框架,开发进程也是最活跃的。看看入门指南跟上大家的步子吧。

下面这个帖子有很多有用的信息,而且用truffle部署合约、与合约交互。

以太坊智能合约漫游指南(译者注:中译本见文末超链接)

Embark(Node 语言)与 Truffle 在开发者构建项目上有相似但又不同的理念。

Perigord (Go 语言)与 Truffle 非常相似。

Populous (Python 语言)是一种为满足相同群体需求的开发框架,由 Python 编写而成。

当你初次接触合约,你应该尽量不要使用框架,直到你能理解它所所带来的价值,这和你初学 HTML 时不要用 Rails 框架是同样的道理。你可以先试着用 Remix 来尝试编程语言和想法。

ETHPM & NPM

分享即关心,所以 ETHPM 是一个多中心化的智能合约包资源库。使用 ETHPM,你可以继承或连接到其他知名的合约或类库,减少代码重复,尽可能理想地为未来的合约开发提供坚实基础。

可以使用 NPM 提供智能合约代码来安装节点,很多人在做这个事情,比较有名的是Open Zeppelin。

读一下这个细则,里面有更多的相关信息和背景。

网络状态

Mainnet——以太坊主网,通常是默认网络,无论你使用哪个客户端或者浏览器。

Ropsten ——以太坊使用工作量证明的主要测试网络。这个网络因为计算量低,很容易遭到DDOS攻击、网络分叉、以及其他的干扰。Ropsten 自被垃圾信息攻击以后暂时停用,最近才恢复使用。它一贯只有很低的gas上限,没有任何理由的,很多合约在这个网络上都部署失败。

Kovan  ——仅由 parity 客户端组成的测试网络,使用权威证明来突出对垃圾信息攻击的免疫力,并且出块时间保持在4秒钟。

Rinkeby  ——仅由 geth 客户端组成的测试网络,使用 Clique 共识算法,尽管计算量很低,但是对恶意行为更有抵抗力。(我个人最爱)

你也可以创建你自己的私人以太坊网络。go-ethereum 团队开发了 puppeth 来配置整个网络,配有定制的 bootnode 工具、 创世块与共识规则,推动了 Rinkeby 网络的搭建。你也可以搭建你自己的网络基础设施,可以用 kubernetes 或者 docker-compose。但是你很可能近期都不会需要搭建私人网络的。

比较“Accounts(账户)”和“Wallet(钱包)”

以太坊账号是一个私钥和地址对。它主要只是为了储存以太币,创建账号无需花费gas(因为每一个可能的地址都是自动存在的)。所有以太坊网络上的交易都是从账户发起的,合约无法发起交易。

只要满足以下两点之一的,都可以称为钱包。

  1. 它是一个特制的交互界面,能用你的账号创建交易并发送交易(如MyEtherWallet)。

  2. 它只是一个发送及接收以太币的智能合约(这里又提起了,就是一些代码)。

这不是一个原生的概念。这里是一个 GitHub 平台上钱包的 Solidity 实现,通过 Mist 浏览器使用。它们能以很多风格出现,像多重签名,纸面形式,等等。

既然我们准确定义了这两个概念,留意一下,人们到处混淆这两个术语,把所有能够 发出/接收 以太币的东西贴上钱包的标签,并把所有东西为账户。

EVM 和智能合约产物的状态

你的智能合约代码在 EVM(以太坊虚拟机)中运行于网络里每一个完整节点上。除了需要特殊地与网络、文件系统与进程中隔离开来,EVM 就是执行字节码的标准虚拟机。没人愿意去写字节码,因此我们用一些高等语言编译成 EVM 字节码。

Solidity 语言

Solidity 是第一款描述智能合约的语言。它也是当前最流行的语言,因此有最多的例子、参考文献和教程。你应该学习这种语言,除非你有其他更好的理由。

你可以在 Remix 下使用 Solidity 语言,Remix 是一种基于浏览器的 Solidity 合约代码编辑器。下面是一段 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(Lisp 语言家族)

LLL 是一种 Lisp 风格的低层语言,恰如其名。虽然它并没有被以太坊团队作为主要需要支持的语言,但是它仍然持续更新着,并和 Solidity 在同一个资源库里。

下面是一段 LLL 语言写成的 ERC20 合约的例子。

LLL 语言如下所示:

(seq
  (def 'node-bytes  0x00)
  (def 'owner    0x20) ; address
  (def 'set-node-owner    0x5b0fc9c3) ; setOwner(bytes32,address)
  (def 'get-owner (node)
      (sload (+ node owner)))
.... 这仅仅是个例证,完全不能编译。

如果你正在学习,你可能不想用 LLL 写任何东西。

Serpent 语言

Serpent 是一种可以编译成 EVM 字节码的类似 python 的高等语言。因为 Zeppelin 发现的大量严重且危险的漏洞,这种语言实际上已经被弃用了。对这种语言的入门,参照下文的 Vyper。

Serpent 编译器的审核<https://blog.zeppelin.solutions/serpent-compiler-audit-3095d1257929>

Vyper 语言(以前写作Viper)

Vyper 也是一种由 python 灵感启发的编程语言,着重于安全、简洁、和稳定性。目前这种语言还在开发当中。

Bamboo 语言

Bamboo 是一种将智能合约描述为有限状态机器的语言,把智能合约看成一个状态和交易的函数,同时生成一个新的状态。这种语言目前也在开发当中。

其他语言

有大量的其他高等语言在不同程度使用或者开发当中。而且,肯定还有更多类似的语言陆续开发出来。为了更广泛为大家所接纳,编程语言和编译器必须充分审查和测试,这都是很花时间的。

智能合约的反编译/反汇编

我们用 prosity 反编译或者用 evmdis 反汇编以太坊智能合约字节码。这是一个不断进化的领域,开发新工具的速度相当快。了不起的以太坊虚拟机资源库里面包含更多的相关信息。

pirapira/awesome-ethereum-virtual-machine<https://github.com/pirapira/awesome-ethereum-virtual-machine>

智能合约安全

智能合约一旦部署到了以太坊上,就不可改变,也将永远存在。如果你写了带有漏洞的代码,是无法这个有问题的版本从以太坊上拿下来的,那么你就只能持续修复了 *。

因为很多为以太坊和其他智能合约平台做开发工作的工程师都是来自于 web 开发领域,所以这个概念可能比较新颖,也比较疯狂。

无论是在在语言层面,还是在高层逻辑视角上,你的代码都可能会陷入各种不同的安全陷阱。当你部署了一个投产的智能合约,它将管理真正的资金,你需要对合约的运作 100% 信任。

ConsenSys 有一个出色的智能合约最佳实践资源库,你应该去深入了解。

Parity 钱包被黑的解释<https://blog.zeppelin.solutions/on-the-parity-wallet-multisig-hack-405a8c12e8f7>

Parity 钱包被黑解释第二篇:Electric Boogaloos<https://hackernoon.com/parity-wallet-hack-2-electric-boogaloo-e493f2365303>

在你部署一个将要操作真正资金的智能合约之前,你应该开一个 bug 悬赏,进行渗透测试。如果你正在管理着真正的资金,你的代码应该已经通过了专业的审查。

*可以用 selfdestruct() 函数把合约从网络上解除掉。

Whisper(耳语协议)

Whisper 是一个集成进以太坊的消息系统。它允许 dApp 发布小量的信息进行非实时的通信。

它使用的是 shh 协议,这是一个相当聪明的协议。出人意料的是,这个协议的相关文件极少,采纳率也很低。

虽然它有一段时间没有更新了,这里有个 dapp 例子,是个用 Whisper 实施的聊天客户端。

Whisper 是否在进行有效的开发,有待讨论。

多中心化自治组织(DAOs)

这是一个组织(比如一群人),在这个组织里,他们使用一堆智能合约强制执行,而非法律文件。 这群人用这些合约做一个组织能做的所有常见的事情,如就某事进行投票,决定所有本地合作社建筑物涂成什么颜色。

这样做的副作用就是,决策、管理以及建筑物涂成什么颜色等问题将不可更改地储存在区块链上(以合约状态的形式)。很酷吧!

以太坊经典与 DAO 的攻击事件

你可能听说过 “DAO hack”,也听说过它有多么严重。这个漏洞的发生是由于一个如今受到高度重视的重入bug,一个恶意的合约可以引起对合约非无限的、循环的访问,导致其错误地更新内部状态。如果这个错误发生在 DAO 合约下,这就意味着把很多钱送给某个人,而这个人本来只应该得到很少数量的钱。社区作为绝大多数投票决定将网络硬分叉,把资金归还给 DAO 资助者。这样的结果就是促成了Ethereum Classic (以太坊经典)的诞生,以太坊经典没有返还被黑掉的资金,以前编写的代码就是这个领域的法律,而且不可恢复。

Aragon

Aragon 也在应对构建一个根据智能合约逻辑运行的公司的挑战,着眼于创建一个可以接受投资、管理财务、支付雇员工资、分配股权以及完成我们现在所知业务的公司,而非一个组织。他们也在开发一个优秀的 dApp 客户端以便让他们的协议用起来尽可能的简单。

查看一下 Aragon 核心合约,更好地理解它是如何运作的。

Swarm(蜂群协议)

Swarm 是一个多中心化的存储网络,它作为第一批项目在以太坊生态系统内部被开发出来。看一下这个维基百科的文章:主要的 Swarm 开发者比较/对比这两个项目(Swarm 与 IPFS)。要旨是:它们本质上是相同的,除了哲学有些稍微不同还有后台使用不用的协议。

原文链接: https://medium.com/@mattcondon/getting-up-to-speed-on-ethereum-63ed28821bbe

作者: Matt Condon

翻译&校对: 浩哥 Lucky & Elisa

本文来源: 中华财经快报 文章作者: 佚名
    下一篇

IPFS翻译成中文就是“星际文件系统”,一听就很科幻的感觉,有木有,它其实是一种分布式的传输协议,对,现在外面对IPFS最主流的表达就是下一代的颠覆HTTP的互联网传输协议。