之前,我们为大家分享了由Quillhash撰写的EOS开发系列教程(一):EOS上可以构建怎样的应用程序?以及EOS开发系列教程(二):开发智能合约前需要审核的项目。

本周,我们将继续给大家分享EOS开发技术第三部分:了解在EOS上编写DApp的基本概念,带大家继续了解EOS开发。

作者 | Quillhash

翻译 | Starteos

在浏览一些时下流行的DApp网站后,应用程序开发人员可能会对EOS上不断增加的DApp和交易率感兴趣,以至于会考虑是否应该学习智能合约的开发。

但是,在开始研究时,由于缺乏高质量、有深度的资源以及缺少开发智能合约的环境,令人困惑的文档很快会让开发人员无所适从。这使得开发人员除了投入大量时间进行研究之外别无选择,但对于工作较忙的开发人员来说这几乎是不可能的。

我们打算通过本系列文章使学习过程顺利进行,以便公司和开发人员可以利用EOS来开发去中心化应用程序。在本文中,我们将深入介绍一些核心概念,比如开发生态系统、合约的基本结构、合约开发的各种类型和模块(EOS CDT)以及各种研究资源的建议。

01 EOSIO架构

EOSIO提供了一个类似于操作系统的去中心化平台,该平台使用区块链来维护事件和交易的分散式、无信任账本。决定由谁创建新的块(共识)是通过委托股权证明(DPoS)来实现的。

在DPoS中,人们需要抵押Token来获得为BP(区块生产者)投票的权利,BP(区块生产者)负责将新的块添加至区块链。如果选民怀疑某BP有恶意行为,可以撤票并投票支持新的BP。DPoS在给定的时间内只有21个BP创建新的块,比工作量证明(PoW)共识演算法的验证次数少,因此其事务处理速度是非常快的。

EOSIO支持创建智能合约,其执行和资源消耗的方式与在操作系统上运行的应用程序类似。智能合约使用C++编写并转换为WebAssembly。

计算量和速度由带宽和CPU资源负责,持久信息的存储由RAM负责。只有在执行某些智能合约操作时才需要CPU和带宽,这些资源可以通过抵押Token获得。

持久性资源RAM需要根据需求预先购买。RAM通常为易失性内存,但在EOS中,它是智能合约的持久性内存。RAM的价格是波动的,它通过系统的Bancor演算法基于供需来确定。由于RAM是一种相对稀缺的资源,EOS系统正在采取措施,防止对RAM进行囤积和投机交易。

必须注意的是,这种持久性信息不存储在区块链中。区块链仅用于记录显示智能合约持久信息发生了变化的交易和事件。

02 开发生态系统

任何类型的智能合约开发都需要本地测试节点、与本地节点通信的方式、管理钱包或密钥的方法、设置IDE /代码编辑器和编译器/转换器(将智能合约转换为可执行格式)、强大的测试框架(为本地节点准备新状态)以及gui工具(与公共测试网路或主网路上部署的合约进行交互)。接下来我们结合EOS对这几点进行讨论。

Nodeos是核心的EOSIO节点守护程序,可以配置插件来运行节点。Nodeos可以作为本地节点来进行开发和测试,也可以用于全节点和区块生产。

Cleos是与本地节点守护进程交互的命令行界面,也可以配置为与远程节点交互。Cleos用于发出管理钱包、配置节点和向智能合约发送交易事务的相关命令。

Keosd是将EOSIO密钥安全存储在钱包中的组件。

Eosio.cdt是合约开发工具包,它公开了各种库和编程结构,帮助开发人员进行智能合约开发,其中编程结构提供了编程介面来处理EOS的各种组件。 Eosio.cdt包含eosio-cpp,它是负责将使用C ++编写的合约转换为wasm(WebAssembly)的模块。Eosio.cdt可以生成合约的ABI,它是一个JSON文件,指定了合约支持的类型和操作。Eosio.cdt通常用于将智能合约功能与客户端应用程序结合在一起。

EOSFactory是由Tokenika开发的基于Python的测试框架,我们发现它对于DApp的开发和测试来说非常强大。EOSFactory提供了一个简单的基于Python的界面,可以与智能合约进行交互,并可轻松设置测试用的新节点实例。EOSFactory还支持在公共测试和主网上部署和管理合约。

Scatter是一个gui应用程序,可以轻松连接EOS网路并安全地管理资产,类似于以太坊中的Metamask。Scatter可用作所有主要平台的桌面应用程序。

由于合约是用C++编写的,因此任何时下流行的IDE都可以用来编写智能合约,如VS Code。管理EOS中的角色和许可权在EOS中,管理角色和许可权的本地支持在执行智能合约的访问控制和许可权方面非常强大。每个EOS账户有两个立即可用的许可权,Active和Owner许可权。Owner许可权与账户的「管理级别」操作有关,是「Active」许可权的上级许可权。Active许可权用于常见的操作,例如执行智能合约操作(转账、购买RAM等)。此外,我们也可以通过智能合约创建新的许可权。

另一个有趣的许可权是eosio.code许可权。如果我们希望eosio.code许可权以编程方式与其它合约进行通信,智能合约将使用该许可权。该许可权必须由托管智能合约的账户将其添加到Active许可权中才能生成。

03 EOS智能合约的基本概述

智能合约是在EOSIO节点上运行的软体,其持久性数据存储在节点的RAM中,操作事件在区块链中存储和同步。EOS智能合约公开了可执行的「操作」,可以执行某些合约特定的功能,但受限于调用该操作的账户的约束和许可权。考虑到这一点,我们可以将合约视为三个部分共同作用的组合。

第一,「函数定义」,函数定义可以指定操作的逻辑。第二,「多索引表」,多索引表可以提供连接永久性存储(RAM)的介面。第三,「调度程序」,调度程序可以充当动作处理程序,也可以将传入的请求映射到正在请求的操作。这三个部分是每个合约拥有的基本「骨架」。

每个合约都可以定义为继承eosio :: contract类的一个类。定义合约状态的各种变数可以被指定为类的私有成员。这些类的成员函数可以被指定为「操作」。EOSIO提供各种属性,eosio-cpp使用这些属性生成WebAssembly位元组码以及ABI。因此,有了eosio.cdt库提供的各种类型和数据结构,我们就能够在EOS上编写智能合约。EOS上的智能合约可以处理来自其它合约的通知,还可以调用其它合约的操作,但前提是这些合约已获得必要的许可权(eosio.code许可权)。

当我们在合约上调用一个操作时会创建一个新的合约实例,该实例将在操作执行后被销毁。因此,任何代表合约状态的信息必须在合约开始时(在构造函数中)载入并在销毁之前或销毁期间(在析构函数内或被调用的操作中)保存。必须注意的是,一个账户只能与一个智能合约相关联,我们可以在同一账户上更改或升级智能合约代码。

在本文中,我们讨论了在EOS上开发DApp的重要概念,并介绍了EOS的生态系统和体系结构。你是否已经准备好深入研究合约的技术和编码部分并构建自己的DApp了呢?

在后面的文章中,我们将详细分析标准的eosio.token合约,让大家了解构建智能合约的所有细节。


推荐阅读:
相关文章