以太坊编程_I

目录

  1. 迈出第一步

  2. 与合约进行交互

  3. 现实世界中的构架和工具

第一步

假设你已经有一些计算机编程方面的基础知识,并知道区块链数据结构是怎样的。如果不具备,请先了解ethfans的内容再回来看这篇博客。

以太坊

以太坊是一个开源的,分布式的,基于区块链技术的公共平台,无需审查及第三方干扰即可运行应用程序。

智能合约

智能合约仅仅是电脑程序。我们基于智能合约创建以太坊应用。虽然这个概念现在随着以太坊大红大紫,但是它实际上是由Nick Szabo于1996年提出。

EVM 以太坊虚拟机

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来做这个实验,经过搜索,发现了testrpc,这是一个用于测试和开发的以太坊客户端,是由npm管理的。让我们安装这个客户端并开始使用它:

1
2
npm install -g ethereumjs-testrpc
testrpc

你会注意到testrpc已经产生了10个地址,这些地址都拥有虚拟的ETH可供测试无需担心。有一点是testrpc的状态并不稳定,每次关闭后,节点和账户状态将被清除。

Web3.js 是一个实现了以太坊 JSON RPC 的JavaScript库。我们将使用Web3.js与以太坊节点(在这个例子中是testrpc)进行交互。安装只需运行:

1
npm install -g web3@0.20.1

顺便提一句,在这个例子中,安装 Web3 0.20.x 版本而不是公测1.0.0版本。首先,需要将本地testrpc测试节点连接到Web3.js,为了做到这一点,我们要求Web3 使用localhost provider。让我们打开一个节点控制台并输入以下命令:

1
2
3
Web3 = require('web3')
provider = new Web3.providers.HttpProvider("http://localhost:8545")
web3 = new Web3(provider)

我们正在使用默认的testrpc端口(8545),如果你设置了另一个端口,记得更改provider的URL。当你获得web3 实例后,首先运行以下命令以获得你的以太坊节点中的账户列表及其各自余额:

1
2
3
4
web3.eth.accounts.forEach(account => {
balance = web3.eth.getBalance(account);
console.log(balance);
})

你可能注意到了,输出不全是数字列表,这是因为Web3使用大数对象来处理数字值,而JavaScript无法正确处理大数类型。可以通过这个链接了解更多。

同时,这些余额不是用ETH表示的,实际上它们的单位都是基本单位wei。1ETH是10¹⁸ wei。

回到刚刚的话题,让我们试着在两个账户之间发送ETH。指需输入web3.eth.accounts并选择其中的两个,你可以使用sendTransaction方法:

1
2
3
4
from = web3.eth.accounts[0]
to = web3.eth.accounts[1]
transaction = { from: from, to: to, value: 100000 }
transactionHash = web3.eth.sendTransaction(transaction)

命令输出的是交易哈希,你也可以通过以下命令获得交易信息:

1
web3.eth.getTransaction(transactionHash)

你可能还想检查你使用的账户的余额是否已经更改。你可以使用下面的命令来验证:

1
2
3
4
web3.eth.accounts.forEach(account => {
balance = web3.eth.getBalance(account);
console.log(balance);
})

接下来,我使用HTML和jQuery以及一点Bootstrap搭建了一个简单的UI使得它更美观一点。你可以在repo中看看它。这就是所说的DApp即分布式应用。也就是说,一个部分后端代码运行在分布式点对点网络上的应用程序;在这个例子中,分布式点对点网络是指以太坊网络。

上图是用以测试ETH交易的DApp的UI

你将找到UI的index.html文件以及与以太坊交互的app.js文件,这基本上就是我们前面所描述的用一些jQuery回调来填充UI。可以复制repo并运行起来试一下。

谢谢你阅读这篇博客,如果你有任何问题,意见或者建议欢迎告诉我!如果你喜欢这篇博客,请继续关注本指南的第二部分,我将重点介绍智能合约!

谢谢Manuel Araoz

原文链接: https://blog.zeppelin.solutions/a-gentle-introduction-to-ethereum-programming-part-1-783cc7796094

作者: Facu Spagnuolo