以太坊智能合约编程入门(一)

in cn •  7 years ago  (edited)

原文地址:https://medium.com/@ConsenSys/a-101-noob-intro-to-programming-smart-contracts-on-ethereum-695d15c1dab4

1-ABBewYWJfdIFhgwBt8mfGQ.png
有些人说以太坊太难用了,现在就写一篇入门教程,讲一下怎么使用以太坊构建智能合约和应用。

  • 第一部分 总览关键的术语以及以太坊客户端和智能合约语言
  • 第二部分 讨论工作流以及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的基本工具。

(未完待续)

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

赞一个,正准备学习智能合约呢 这里就来资料了

谢谢,学习了

推荐两个区块链、以太坊开发DApp的实战教程:

  1. 适合区块链新手的以太坊DApp开发:
    http://xc.hubwiz.com/course/5a952991adb3847553d205d1?affid=20180412steemit

  2. 用区块链、星际文件系统(IPFS)、Node.js和MongoDB来构建电商平台:
    http://xc.hubwiz.com/course/5abbb7acc02e6b6a59171dd6/?affid=20180412steemit