EOS的基础知识(二)开发简单的合约

本教程默认你已经安装了 eosio ,并且已经生成了 nodeos、cleos 工具。

Part1·启动一个私链

你可以使用下面命令运行单节点网络:

该命令设置了许多标志并加载了一些可选的插件,我们将在本教程的其余部分中使用这些插件。假设一切正常,你应该每0.5秒看到一个区块生成消息。

这意味着你的本地网络处于激活状态,正在生成区块,并可投入使用。参阅更多关于 nodeos 参数信息请执行:

Part2·创建一个钱包

钱包是一个可授权对区块链执行操作的私钥库。这些秘钥加密后存储在磁盘上,加密密码是随机生成的高强度密码,建议把这个密码存储在安全的密码管理器中。

为了实现这个简单的开发环境,你的钱包由本地节点配置的 eosio::wallet_api_plugin 管理,这个插件在我们启动 nodeos 时自动激活。无论任何时候你重新启动 nodeos ,在你使用密钥之前,你必须要解锁你的钱包。

在命令行中直接使用密码通常是不安全的,它会被记录到你的 bash 历史记录中。因此你也可以在交互模式下解锁:

出于安全考虑,通常最好在不使用钱包时锁定钱包。要锁定你的钱包而不关闭 nodeos ,你可以这样做:

本教程的其余部分需要你解锁钱包后执行。所有新的区块链都是以唯一初始帐户 eosio 的私钥开始。为了与区块链互动,你需要将此初始帐户的密钥导入钱包。将 eosio 帐户的私钥导入你的钱包

Part3·加载 Bios 合约

现在我们有一个带有 eosio 用户私钥的钱包,我们可以设置默认的系统合约。为了开发的目的,默认可以使用 eosio.bios 合约。此合约使你可以直接控制其他帐户的资源分配并访问其他特权 API 。在公链中,该合同将管理 Token 的 staking 和 unstaking ,为合约预留 CPU 、网络活动和内存资源。

智能合约 eosio.bios 在 eosio 源代码的 contracts 文件夹里。cleos 指令默认是在 eosio 源码根目录中执行,但可以通过指定 ${EOSIO_SOURCE}/contracts/eosio.bios 的全路径从任意位置来执行。

cleos 用两个 action 产生一个交易, eosio::setcode 和eosio::setabi

代码定义了合约如何运行,abi 描述了如何在 binary 和参数的 json 描述文件之间转换。虽然 abi 文件是可选的,但是所有的 eosio 工具都依赖于它以便于使用。

无论何时,你执行一个交易都会看到如下输出:

这可以理解为:由 eosio 所定义的 action 'setcode' 被 eosio 合约以参数 {args...} 执行。

正如我们稍后会看到的,actions 可以被多个合约所处理。这次调用的最后一个参数是 -p eosio ,这个参数告诉 cleos 使用我们之前导入的 active 权限私钥来签名这个 action。

Part4·创建一个账户

现在我们已经建立了基础系统合约,我们可以开始创建自己的账户。

为此,我们首先为该帐户生成一对密钥。

然后我们将私钥导入我们的钱包:

密钥不会自动添加到钱包,因此跳过此步骤可能会导致你对你的帐户失去控制权。

Part5·创建两个用户账号

接下来,我们将使用上一步骤中创建和导入的密钥,创建两个帐户: user 和 tester

因为我们正在使用 eosio::account_history_api_plugin ,所以我们能够查询所有由我们的密钥控制的账户:

Part6·创建Token合约

在这个阶段,区块链还不能做很多事,让我们来部署 eosio.token 合约。该合约允许创建许多不同的 token,这些 token 都运行在同一个合约上,但可能由不同的用户管理。

首先需要创建一个账户来部署这个合约。

接下来就可以开始部署了(合约代码位于 ${EOSIO_SOURCE}/contracts/eosio.token )

Part7·创建EOS Token

你可以在 contracts/eosio.token/eosio.token.hpp 头文件中查看定义 eosio.token 合约的接口:

要创建一个新的 token,我们必须用合适的参数来调用 create(...) action。该命令将使用最大的符号,用来从其他 token 中,唯一地鉴别这个 token。发行人将有权要求发行和执行其他 action,例如冻结,召回以及将所有者列入白名单。

根据参数位置来调用这个方法:

也可以使用参数名键值对来调用:

该命令创建了一个名为 EOS 的新的 token,其精密度为 4 位数,最大供应量为 1000000000.0000 EOS。

为了创建这个 token,我们需要获得 eosio.token 合约的许可,因为它“拥有”符号(比如 EOS)的命名空间。该合约的未来版本可能允许其他地方自动购买符号名称。当前我们必须通过 -p eosio.token 在此授权。

Part8·发行Tokens 给用户

现在我们已经创建了 token,发行者可以用我们之前创建的 user 账户发行新的 token。我们根据参数位置来调用 issue 这个 action。

这次输出包含着几个不同的 action, issue 和 3 次转账。尽管我们仅仅执行了 issue这个 action,但是 issue action 默认执行了 "inline transfer","inline transfer" 通知了发件人和收件人帐户。输出指明所有被调用的 action 处理程序、被调用的顺序,以及是否生成任何输出。

从技术上说,eosio.token 合约可以跳过 inline transfer 并选择直接修改余额,但在这种情况下,eosio.token 合约遵循我们的 token 约定,该约定要求所有账户余额可以通过他们传输 actions 的总和推论出来。它还要求通知资金的发送者和收款人,以便他们能够自动处理存款和提款。

如果你想要看到广播的实际交易,你可以使用 -d -j 选项来表示 "don't broadcast" 和 "return transaction as json".

Part9·转移 Tokens 到 Tester

现在 user 账户有一些 token, 我们将会把他们转移到账户 tester 并使用权限 -p user。

Part10·Hello World 合约

下一步我们将创建我们的第一个"hello world"合约。创建一个名为"hello"的新文件夹,然后创建内容文件 "hello/hello.cpp":

hello/hello.cpp

然后你可以像这样将它编译成 Web Assembly(.wast):

接着你可以生成 abi:

下一步我们创建账户并上传合约:

现在我们可以运行合约:

这时合约允许任何人授权,我们也可以这样:

这时 tester 是授权者,user 只是一个参数。如果想要合约对用户进行身份认证,那么我们可以修改下 hi() 方法:

现在,用户(对应下文的 tester )和授权者(对应下文的 user )不匹配,那么合同会抛出一个错误

我们可以通过授予 tester 权限来解决此问题

Part11·部署 Exchange 合约

本文由百家号作者上传并发布,百家号仅提供信息发布平台。文章仅代表作者个人观

猜你喜欢

转载自blog.csdn.net/akai9898/article/details/81428881