原文地址:https://medium.com/@ConsenSys/a-101-noob-intro-to-programming-smart-contracts-on-ethereum-695d15c1dab4
有些人说以太坊太难用了,现在就写一篇入门教程,讲一下怎么使用以太坊构建智能合约和应用。
- 第一部分 总览关键的术语以及以太坊客户端和智能合约语言
- 第二部分 讨论工作流以及dapp框架和工具
- 第三部分 编程,快速编写测试,以及使用truffle开发一个智能合约dapp
第一部分 介绍
如果你还是加密货币行业的新手,不太了解比特币,更不知道它是怎么工作的,那么你应该先去看看Andreas Antonopoulos写的关于比特币的书,熟悉一下这个行业。然后再看看以太坊的白皮书。
如果你已经熟悉了加密货币,那么可以继续读下去了。在开始之前,你不需要知道加密经济学的所有计算机科学知识,也不必知道以太坊是如何改进比特币的那些论文。
起始示例
以太坊官方网站ethereum.org 上有一些示例。以及官方的文档。还有一个学习智能合约的好地方:dappsforbeginners,虽然这个网站可能已经过时了。
这篇文章的目的就是给这些示例做个补充,然后介绍一些有用的开发工具,帮助大家更容易地使用以太坊,智能合约,开发dapp。这篇文章只是从我个人的角度进行讲解,同时得到了ConsenSys的帮助。
基础概念
先看看一些术语:
公钥密码学。假设alice有一个公钥和一个私钥。她可以使用她的私钥来创建一个数字签名,然后bob可以使用alice的公钥来验证,看那个签名是不是真的是用alice的私钥发出的,是不是真的是alice发出的。当你创建了一个太坊或比特币钱包,那么那串长长的“0xdf…5f”地址就是公钥,而私钥保存在别的地方。像coinbase这样的比特币钱包服务商,替你保存着你钱包的私钥,当然你也可以自己保存私钥。如果你把钱包的私钥丢了,那么那个钱包里的所有资金就将永远丢失,所以,你最好备份好你的私钥。我曾经丢过私钥,那种感觉不好受。
点对点网络。像bittorrent一样,以太坊的所有节点都是分布式网络上的点,以太坊上没有中心服务器。[将来以太坊上将有一种混合的半中心服务器,这样能方便用户和开发者使用,这个后面再说]
区块链。区块链就像是一个公共账本,或是记录所有交易的数据库。
以太坊虚拟机。使用以太坊虚拟机你可以在以太坊上开发更强大的程序,比在比特币上开发的更强大。
节点。你可以运行一个节点,然后通过这个节点,使用以太坊虚拟机,可以读取以太坊区块链上的数据,或者向以太坊网络上写入数据。一个完全节点需要下载整个区块链。
矿工。网络上的节点的工作就是挖矿,处理区块链上的区块。你可以在这个地址查看当前以太坊的活跃矿工部分列表:stats.ethdev.com。
工作量证明(proof of wor)。矿工之间需要竞争去完成一些数学题目。第一个算出数学题目答案(区块链的下一个区块)的矿工将赢得一笔奖励:一些以太。然后每个节点都更新到那个区块。每个矿工都想赢得下一个区块,因此这激励着它们持续地更新,然后所有人都保持着一个真实的区块链,整个网络也由此达成了共识。[以太坊计划从pow转成pow与pos混合的机制,不过这不在这篇文章的讨论范围]
以太。或者简称eth。它是一个真正的数字货币,你可以用它来买东西。在这个交易所,你可以在上面交易。
gas。在以太坊网络上运行和存储数据需要耗费一定数量的eth。这样以太坊才能有效率。
dapp。去中心化的app,使用了智能合约的应用。dapp的目标是(应该是)拥有一个漂亮的智能合约界面,以及任意额外的功能,比如ipfs(一种在去中心化网络上存储和服务的方式,不过不是以太坊创建的)。dapp也能在一台中心服务器上运行,如果这台服务器能跟以太坊节点通信的话,它们也可以在本地的以太坊节点上运行。[与普通的webapp不同的是,dapp或许不是在服务器上的。它们或许使用区块链来提交交易然后获取数据,而不是通过一个中心化的数据库。用户使用一个钱包地址,把数据保存在本地,而不是使用典型的用户登录系统。很多方面的架构都与现在的web不一样]。
关于以上这些概念,可以看一看这篇好文章:https://media.consensys.net/time-sure-does-fly-ed4518792679
以太坊客户端,智能合约语言
开发和部署智能合约,不需要运行一个以太坊节点。可以查看下面的ide和api列表。但是如果你正在学如何运行一个以太坊节点,那么可以看一下这些基础部分,这也不难。
运行一个以太坊节点的客户端
以太坊有多个不同的客户端实现(这意味着你可以有多种方式与以太坊网络进行交互),包括c++,go,python,java,haskell,等等。为什么要这么多实现呢?因为不同的语言面向不同的人。而且这也拓展了以太坊网络的安全性和生态系统。还有一个基于gui的客户端,alethzero。
在写这篇文章的时候,我用的一直都是geth,go语言版本,有时候用一个叫做testrpc的工具,这个工具用的是python版本的客户端,pyethereum。现在我们用的是新工具ethersim,ethersim用的是ethereumjs。ethereumjs是一个javascript客户端,它不支持真正的区块链挖矿,所以它不是一个完整客户端,但是开发和测试的时候可以模拟挖矿。后面的例子会使用这些工具。
交互控制台。一旦你用了这些客户端,就有了一个节点,那么你就能和区块链进行同步,创建钱包以及发送接收eth了。在geth上,你可以通过javascript console来实现。或者通过json rpc(远程处理调用),使用一个命令比如cURL来通过url获取数据。不过本文的目的不涉及dapp开发,所以这个问题不多说。不过这些工具在debug,配置节点,使用命令行使用钱包的时候很有用。
在测试网络上运行一个节点。如果你安装了客户端,比如geth,然后在正在的网络上运行的话,它需要花一点时间来下载整个区块链,并与网络同步。(你可以在stats.ethdev.com 上查看最新的区块信息,然后把它跟你的客户端的节点log对比,看看你是否完全同步了)
但是在真正的网络上运行智能合约的话,你需要花费一些eth。不过你可以在本地的测试网络上免费地运行客户端。这样也不需要下载整个区块链,而且会创建以太坊网络的一个私有实例,因此对于开发来说就更快。
testrpc。你可以用geth来运行一个测试网络,但是有其他快速的方法,比如使用testrpc。testrpc会为你创建一批预存资金的账号。而且它也非常快,而且更易于开发和测试。你可以先用testrpc开始,然后等到你的合约像模像样了,在使用geth,要开始使用geth,只需要指定一个networkid就可以:geth-----netwokid“12345”。后面我会在例子中介绍testrpc的用法。[现在testrpc的开发者把重心都放在ethersim上了,把ethersim当作testrpc的替代品,我会更新这个实例,最终也使用ethersim。如果你想的话也可以一开始就使用ethersim]。
下面让我们谈谈编程语言,然后再进行真正的编程。
智能合约编程语言
使用solidity。开发智能合约的语言有好几种:solidity,有点像javascript;serpernt,类python语言;还有一个LLL,基于lisp的语言。以前serpent流行过一段时间,不过现在最流行的是solidity,solidity也更健壮,所以,我们用solidity。你跟喜欢python?那还是用solidity。
solc编译器。用solidity写好智能合约后,就用solc来编译。可以在这里进行安装。如果你想用solc,你也可以用一些机遇浏览器的编译器,比如solidiy real-time 编译器或者cosmo,不过后面的编程的例子是使用solc进行编译的。
web3.js api。在智能合约编译好,发送到网络上之后,你就可以通过以太坊web3.js javascript api来调用它了,并且可以创建跟这些合约互动的web app。
这些就是在以太坊上开发智能合约,构建dapp的基本工具。
(未完待续)