LOADING...
LOADING...
LOADING...
当前位置: 玩币族首页 > 区块链资产 > 以太坊上的交易实现

以太坊上的交易实现

2019-12-22 区块链系统分析员 来源:区块链网络

恐怖指数直接反应了寒冬的温度,既然这样那就来学习。

正如行走所说,年底区块链风口无限,座上宾与币圈无关,个人非常同意,因为很多项目正在链改,大体都是用了联盟链的方案,而众所周知,联盟链很多方案是从以太坊改过来的,那就来学学以太坊吧,不要想着难,单上手而言还好。


一些概念

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

智能合约因以太坊而名声大噪,它是类似于自动售货机一样的电脑程序,基于智能合约可以创建以太坊应用。它的起源实际上是由Nick Szabo于1996年提出。

EVM(以太坊虚拟机)是智能合约的沙盒运行时完全独立的环境,意味着每个在EVM中运行的智能合约无法连接网络、文件系统或者其他进程。

鉴于以太坊是一个分布式平台,所以必须有一种方式来限定给定智能合约的可用资源,否则可能会使得整个网络的算力瘫痪。Gas 通过为EVM中执行的每个指令确定它的执行成本来解决这个问题。一个重要的事情是每笔发送到网络中的交易都有一个“Gas预算”,如果预算的Gas用完了,交易将以失败告终,但是这笔交易仍然会被开采到区块链中。

Ether(ETH是以太坊的加密数字货币。Gas/Ether的动态兑换价格用来衡量一个操作将花费多少ETH。执行交易所需支付的费用通过Gas用量与Gas价格相乘得出(计算所得的费用将使用ETH支付)。你可以将交易的Gas价格设置为任何值。但是,如果你设置的Gas价格太低的话,没有人会执行你的代码。

账户是由地址标识,?同一地址空间由两种账户共享。一种是由公私钥对控制的外部账户,该账户通常由人拥有,用来存储ETH,另一种是由它存储的代码控制的合约账户。这两种账户之间存在一些差异,其中非常重要的一点,只有外部账户才能启动交易。

交易是从一个账户发送到另一个账户的消息。你可以发送一笔交易给另一个账户以转移ETH。如果目的账户是合约账户,其代码也将被执行。请注意,涉及代码执行的每笔交易都将在网络中的所有节点上执行。此外,所有的代码运行以及交易执行都将被记录在以太坊区块链上。

Solidity 是一种面向合约的高级语言,其语法与JavaScript相似。Solidity是静态类型的,支持继承,库以及复杂的用户定义类型,其编译后就是节点运行的EVM程序集。

测试

怎么将ETH从一个账户发送到另一个账户?为了不浪费ETH,找些实验场景,testrpc是一个用于测试和开发的node.js以太坊客户端。

首先,安装客户端

npm install -g ethereumjs-testrpc
testrpc

你会注意到testrpc已经产生了10个地址,这些地址都拥有虚拟的ETH可供人使用而无需担心。这是默认情况下testrpc的工作原理,你还可以按照文档进行自定义初始化。必须记住的非常重要的一点就是testrpc的状态是不稳定的,每次关闭它后,你的节点和账户状态将被清除。

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

npm install -g [email protected]

顺便提一句,在这个例子中,安装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使得它更美观一点。这就是我们所说的DApp即分布式应用。也就是说,一个部分后端代码运行在分布式点对点网络上的应用程序;在这个例子中,分布式点对点网络是指以太坊网络。


你将找到UI的inde.html文件以及与以太坊街店交互的app.js文件,这基本上就是我们前面所描述的用一些jQuery回调来填充UI。

—-

编译者/作者:区块链系统分析员

玩币族申明:玩币族作为开放的资讯翻译/分享平台,所提供的所有资讯仅代表作者个人观点,与玩币族平台立场无关,且不构成任何投资理财建议。文章版权归原作者所有。

LOADING...
LOADING...