教程 | 以太坊编程的简单介绍(1)
两个月前,我被要求建立一个以太坊网络应用作为工作测试以加入Zeppelin,但是我对区块链技术根本不了解。我几乎没有听说过比特币,所以除了学习我没有别的选择。
这将是一系列针对希望成为以太坊软件开发人员的帖子。但是请记住,我不认为自己是这个领域的专家,我只是希望能教大家我所学到的东西,从而节省跟我一样处于学习阶段的人的时间。到该系列博客的最后,你应该能构建一个完整的支持智能合约的Web应用(也被称为DApp)。
享受这个过程吧!同时如果你有问题,建议或者反馈,请毫不犹豫的告知我。
本文目录
1. 迈出第一步
1.1 引言
1.2 WEB3
1. 迈出第一步
1.1 引言
我假设你有一些计算机编程方面的基础知识,并知道区块链数据结构是怎样的。如果你不具备以上知识,请先了解这个链接的内容再回来看这篇博客。
以太坊
首先让我们定义一下以太坊,或者说是我在研究之后对其的理解。以太坊是一个开源的,分布式的,基于区块链技术的公共平台,无需审查及第三方干扰即可运行应用程序。
智能合约
智能合约仅仅是电脑程序。我们基于智能合约创建以太坊应用。请记住,虽然这个概念现在随着以太坊出现,但是它实际上是由Nick Szabo于1996年提出。
以太坊虚拟机
EVM 是以太坊智能合约的沙盒运行时以及完全独立的环境。这意味着每个在EVM中运行的智能合约无法连接网络、文件系统或者其他进程。
Gas
鉴于以太坊是一个分布式平台,所以必须有一种方式来限定给定智能合约的可用资源,否则可能会使得整个网络的算力瘫痪。Gas 通过为EVM中执行的每个指令确定它的执行成本来解决这个问题。一个重要的事情是,每笔发送到网络中的交易都有一个“Gas预算”。如果预算的Gas用完了,交易将以失败告终,但是这笔交易仍然会被开采到区块链中。
Ether(ETH)
这是以太坊的加密数字货币。Gas/Ether的动态兑换价格用来衡量一个操作将花费多少ETH。执行交易所需支付的费用通过Gas用量与Gas价格相乘得出(计算所得的费用将使用ETH支付)。你可以将交易的Gas价格设置为任何值。但是,如果你设置的Gas价格太低的话,没有人会执行你的代码。
账户
每个账户都是由一个地址标识的。同一地址空间由两种账户共享。一种是由公私钥对控制的外部账户,该账户通常由人拥有,用来存储ETH。另一种是由它存储的代码控制的合约账户。这两种账户之间存在一些差异,其中非常重要的一点,只有外部账户才能启动交易。
交易
交易是从一个账户发送到另一个账户的消息。你可以发送一笔交易给另一个账户以转移ETH。如果目的账户是合约账户,其代码也将被执行。请注意,涉及代码执行的每笔交易都将在网络中的所有节点上执行。此外,所有的代码运行以及交易执行都将被记录在以太坊区块链上。
Solidity
Solidity 是一种面向合约的高级语言,其语法与JavaScript相似。Solidity是静态类型的,支持继承,库以及复杂的用户定义类型。其编译后就是节点运行的EVM程序集。
WEB3
我决定先通过简单的将ETH从一个账户发送到另一个账户开始与以太坊区块链的互动。因为我可能会弄的一团糟,所以我不想用真正的ETH来做这个实验,因此我开始寻找一些测试/虚拟环境。阅读Manu令人震惊的帖子后,我发现了testrpc,这是一个用于测试和开发的node.js以太坊客户端。让我们安装这个客户端并开始使用它:
npm install -g ethereumjs-testrpc
testrpc
你会注意到testrpc
已经产生了10个地址,这些地址都拥有虚拟的ETH可供人使用而无需担心。这是默认情况下testrpc
的工作原理,你还可以按照文档进行自定义初始化。你必须记住的非常重要的一点就是testrpc
的状态是不稳定的,每次关闭它后,你的节点和账户状态将被清除。
另一个你得知道的是Web3.js。这是一个实现了以太坊 JSON RPC的JavaScript库。也就是说,我们将使用这个协议来与以太坊节点(在这个例子中是testrpc
)进行交互。安装只需运行:
npm install -g web3@0.20.1
顺便提一句,在这个例子中,安装Web3 0.20.x版本而不是公测1.0.0版本是十分重要的。首先,你需要将运行在testrpc
上的本地测试节点连接Web3.为了做到这一点,我们要求Web3 使用本地主机供应商。让我们打开一个节点控制台并输入以下命令:
Web3 = require('web3')
provider = new Web3.providers.HttpProvider("http://localhost:8545")
web3 = new Web3(provider)
请注意,我们正在使用默认的testrpc
端口(8545),如果你设置了另一个端口,记得更改供应商的URL。当你获得web3 实例后,首先运行以下命令以获得你的以太坊节点中的账户列表及其各自余额:
web3.eth.accounts.forEach(account => {
balance = web3.eth.getBalance(account);
console.log(balance);
})
你可能注意到了,输出不全是数字列表,这是因为Web3使用大数对象来处理数字值,而JavaScript无法正确处理大数类型。你可以通过这个链接了解更多。
你也得知道这些余额不是用ETH表示的,实际上它们的单位都是基本单位wei
。1ETH是10¹⁸ wei。可以通过查阅以太坊文献了解更多关于ETH转换的信息。
回到我们刚刚的话题,让我们试着在两个账户之间发送ETH。指需输入web3.eth.accounts
并选择其中的两个,你可以使用sendTransaction
方法:
from = web3.eth.accounts[0]
to = web3.eth.accounts[1]
transaction = { from: from, to: to, value: 100000 }
transactionHash = web3.eth.sendTransaction(transaction)
命令输出是交易哈希,你也可以通过以下命令获得交易信息:
web3.eth.getTransaction(transactionHash)
你可能还想检查你使用的账户的余额是否已经更改。你可以使用下面的命令来验证:
web3.eth.accounts.forEach(account => {
balance = web3.eth.getBalance(account);
console.log(balance);
})
接下来,我使用HTML和jQuery以及一点Bootstrap搭建了一个简单的UI使得它更美观一点。你可以在我的repo中看看它。这就是我们所说的DApp即分布式应用。也就是说,一个部分后端代码运行在分布式点对点网络上的应用程序;在这个例子中,分布式点对点网络是指以太坊网络。
-我开发用以测试ETH交易的DApp的UI-
你将找到UI的inde.html
文件以及与以太坊街店交互的app.js
文件,这基本上就是我们前面所描述的用一些jQuery回调来填充UI。你可以复制我的repo并运行起来试一下。
谢谢你阅读这篇博客,如果你有任何问题,意见或者建议欢迎告诉我!如果你喜欢这篇博客,请继续关注本指南的第二部分,我将重点介绍智能合约!
如果你有兴趣讨论智能合约安全,请加入我们的slack channel,在Medium上关注我们的动态或者申请与我们一起工作!我们也从事智能合约安全开发以及审计工作。
谢谢Manuel Araoz
原文链接: https://blog.zeppelin.solutions/a-gentle-introduction-to-ethereum-programming-part-1-783cc7796094
作者: Facu Spagnuolo
翻译&校对: Aisling & Elisa
你可能还会喜欢:
1、WEB3.0 (非技术版):
http://ethfans.org/shaoping/articles/489
3、区块链Solidity语言函数可见性深入详解|入门系列:
http://ethfans.org/hh3755/articles/345