【许晓笛】 EOS智能合约案例解析(1)

本文涉及的产品
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介:

详解 EOS 智能合约的 hpp 文件

为了帮助大家熟悉 EOS 智能合约,EOS 官方提供了一个代币(资产)智能合约 Demo —— eosio.token。eosio.token 智能合约目前还不是特别完善,个别功能还没有完成。但这个示例合约给出了 EOS 官方智能合约开发的标准结构和开发方法,并且真正的 EOS 代币也会借鉴这个示例合约的逻辑,是 EOS 智能合约入门的经典案例。

照例,eosio.token 合约由三个文件(cpp,hpp,abi)文件组成,本篇文章将为大家讲解 eosio.token.hpp 文件。原文件地址:https://github.com/EOSIO/eos/tree/master/contracts/eosio.token

预处理指令 & 头文件

代码的开头声明了头文件,主要是 eos 智能合约的 API 库。

//预处理指令,防止文件被重复包含
#pragma once

//eos 资产(asset)头文件
#include <eosiolib/asset.hpp>
//eos 智能合约 API 库
#include <eosiolib/eosio.hpp>

构造函数

智能合约的类名可以与智能合约名不同,智能合约的名字是其账户名。构造函数为空,参数为智能合约账户名。

   //每个智能合约类都要继承 contract 类
   class token : public contract {
      public:
         //类构造函数
         token( account_name self ):contract(self){}
         }

创建代币函数(action)

声明 create 函数,这个函数用来新建一种代币,并输入代币的各种属性,同时 create 函数也是一个 action。action 是 eos 智能合约的接口函数,定义外界可以对智能合约做什么动作。

                      //参数:发币者
         void create( account_name issuer,
                      //资产最大数目
                      asset        maximum_supply,
                      //资产是否可以冻结
                      uint8_t      issuer_can_freeze,
                      //资产是否可以召回
                      uint8_t      issuer_can_recall,
                      //资产是否可以设置白名单
                      uint8_t      issuer_can_whitelist );

增发代币函数(action)

声明 issue 函数,这个函数用来增发代币,eosio.token 合约并不是新建了代币就会得到代币,新建的代币只是存储了资料,发币者要想获取代币,需要调用 issue action 来获得代币。

         //参数:接收新代币账户,新增多少代币,memo
         void issue( account_name to, asset quantity, string memo );

转账函数(action)

声明 transfer 函数,这个函数用来转账,是代币智能合约最常用的函数。

                        //发送账户
         void transfer( account_name from,
                        //接收账户
                        account_name to,
                        //代币数量
                        asset        quantity,
                        //memo
                        string       memo );

私有数据结构

智能合约需要存储每种代币的资料,还要存储每个账户持有每种代币的数量。

      private:
         //account 结构体,单个记录账户存储单个代币的情况
         struct account {
            //资产余额
            asset    balance;
            //账户是否冻结
            bool     frozen    = false;
            //账户是否在白名单
            bool     whitelist = true;
            //设置账户主键为代币名称
            uint64_t primary_key()const { return balance.symbol.name(); }
         };
         //currency_stats 结构体,记录当代币状态信息
         struct currency_stats {
            //流通量
            asset          supply;
            //最大可流通量
            asset          max_supply;
            //发币者
            account_name   issuer;
            //是否可以冻结
            bool           can_freeze         = true;
            //是否可以召回
            bool           can_recall         = true;
            //是否可以设置白名单
            bool           can_whitelist      = true;
            //是否已经冻结
            bool           is_frozen          = false;
            //是否已经设置白名单
            bool           enforce_whitelist  = false;
            //设置主键为代币名称
            uint64_t primary_key()const { return supply.symbol.name(); }
         };
         //设置一个multi_index类型,存储 account 结构体
         typedef eosio::multi_index<N(accounts), account> accounts;
         //设置一个multi_index类型,存储 currency_stats 结构体
         typedef eosio::multi_index<N(stat), currency_stats> stats;

私有函数

合约公有两个私有函数,分别是给账户增加某种资产,和给账户减少某种资产。

         //增加资产函数:账户,增加数量,代币状态结构体
         void sub_balance( account_name owner, asset value, const currency_stats& st ,
                           //ram 资源支付者
                           account_name ram_payer );
         //减少资产函数:账户,减少数量    ,代币状态结构体
         void add_balance( account_name owner, asset value, const currency_stats& st);
相关文章
|
1月前
|
数据采集 人工智能 安全
数据治理的实践与挑战:大型案例解析
在当今数字化时代,数据已成为企业运营和决策的核心资源。然而,随着数据量的爆炸性增长和数据来源的多样化,数据治理成为了企业面临的重要挑战之一。本文将通过几个大型案例,探讨数据治理的实践、成效以及面临的挑战。
数据治理的实践与挑战:大型案例解析
|
18天前
|
存储 人工智能 自然语言处理
高效档案管理案例介绍:文档内容批量结构化解决方案解析
档案文件内容丰富多样,传统人工管理耗时低效。思通数科AI平台通过自动布局分析、段落与标题检测、表格结构识别、嵌套内容还原及元数据生成等功能,实现档案的高精度分块处理和结构化存储,大幅提升管理和检索效率。某历史档案馆通过该平台完成了500万页档案的数字化,信息检索效率提升60%。
|
27天前
|
Prometheus 监控 Cloud Native
实战经验:成功的DevOps实施案例解析
实战经验:成功的DevOps实施案例解析
41 6
|
30天前
|
安全 Java
Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧
【10月更文挑战第20天】Java多线程通信新解:本文通过生产者-消费者模型案例,深入解析wait()、notify()、notifyAll()方法的实用技巧,包括避免在循环外调用wait()、优先使用notifyAll()、确保线程安全及处理InterruptedException等,帮助读者更好地掌握这些方法的应用。
19 1
|
1月前
|
数据格式
常用的Lambda表达式案例解析,工作中都会用到!
常用的Lambda表达式案例解析,工作中都会用到!
|
2月前
|
缓存 网络协议 Linux
DNS解析工具使用案例
关于如何在Windows和Linux操作系统下使用DNS解析工具的案例,包括查看和清空DNS缓存、使用whois查询工具以及安装和使用dig工具进行DNS记录查询。
42 2
DNS解析工具使用案例
|
1月前
|
存储 数据采集 监控
CDGA\如何建立实现数据治理的效率价值框架:实践案例解析
数据治理是一个持续优化的过程。组织应建立健全的监督与评估机制,定期对数据治理工作进行评估,发现问题及时整改。广东药科大学通过数据全景图和数据监控大屏,实现了对数据治理成果的动态、多维度呈现与监控,为科学管理决策提供了有力支撑。
|
11天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
39 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
70 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
57 0
下一篇
无影云桌面