在审查EOS智能合约时,我注意到每个开发人员都有自己的编程风格,并且有许多不同的方法可以执行相同的操作,例如处理时间或将操作发送到其他合约。这篇文章是一些EOSIO库函数的思想转述,我觉得这些函数很优雅且有用。
1.eosio::same_payer
第一个只是一个常量表达式,可以在修改多索引表的条目时使用。使用eosio::same_payer
时,将使用的新RAM(如果有)将分配给已为表条目支付的同一帐户。
用法:
1 | statstable.modify( st, eosio::same_payer, [&]( auto& s ) { |
它在[multi_index.hpp]
中定义,只是空name
(value:0)""_n
或者name(0)
的常量表达式,一些开发人员仍然使用它来表示同一个付款人。
2.get_first_receiver,get_self()
在contracts.hpp
中定义的两个getters get_self
和get_first_receiver
返回正在运行的操作的执行上下文的一部分。(在EOSIO.CDT1.6中实现了get_first_receiver
以支持旧的get_code
,现在不推荐使用。)get_self
方法返回当前运行代码的合约,而get_first_receiver
返回动作源自的帐户。除非涉及通过require_recipient
的通知,否则这两个帐户是相同的。
例如,通过侦听eosio.token
的传输操作的通知,get_self()
返回你的合约部署到的帐户,而get_first_receiver()
返回eosio.token
帐户。这是因为该行为来自向你的合约帐户发送转移操作到eosio.token
帐户的帐户。
用法:
1 | [[eosio::on_notify("eosio.token::transfer")]] void cryptoship::transfer(name from, name to, const asset &quantity, |
3.action_wrapper
许多用例需要将合约代码中的新操作发送到另一个合约。这是合约可以相互积极沟通的唯一方式。同样,有很多方法可以做到这一点,但最优雅的方法之一是使用eosio::action_wrappers
。它为特定智能合约代码的特定操作创建操作模板,然后可用于调用此操作。
第一个参数是操作名称,第二个参数是操作的方法声明。
用法
eosio.token
标头为eosio.token.hpp header file中的所有操作定义了动作包装器:
1 | [[eosio::action]] |
我们现在可以通过包含此头文件向任何eosio.token
合约发送内联操作。
需要注意的是,只需要包含带有声明的头文件。意思是,即使对于具有未知实现细节的闭源合约,也可以轻松编写动作包装器。只需要写出声明,动作签名,可以从ABI获得。
使用eosio-cpp
的-I
标志包含头文件的附加包含目录。
包含头文件后,将发送内联传输操作,如下所示:
1 | #include <eosio_token/include/eosio_token.hpp> |
对于使用to_action
方法的延迟交易,同样适用:
1 | token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n}); |
- EOSIO时间类time_point,time_point_sec,microseconds
EOSIO库在time.hpp header中定义了两个日期类,它们的精度不同。time_point_sec
类是一个标准的UNIX时间戳,用于存储自1970年1月1日以来在uint32_t中的秒数,time_point
具有更精确的精度,用于存储uint64_t
中经过的microseconds(而不是毫秒数)。从两个类转换都很容易。
要使用时间算术,可以使用microseconds
,它带有有用的助手,如seconds
,minutes
或hours
。
用法:
1 | eosio::time_point tp = eosio::current_time_point(); |
使用microseconds
及其助手可以避免任何类型的常量,如const auto SECONDS_PER_DAY = 60*60*24
,使代码更容易推理。
======================================================================
分享一些比特币、以太坊、EOS等区块链相关的交互式在线编程实战教程:
- EOS入门教程,本课程帮助你快速入门EOS区块链去中心化应用的开发,内容涵盖EOS工具链、账户与钱包、发行代币、智能合约开发与部署、使用代码与智能合约交互等核心知识点,最后综合运用各知识点完成一个便签DApp的开发。
- 深入浅出玩转EOS钱包开发,本课程以手机EOS钱包的完整开发过程为主线,深入学习EOS区块链应用开发,课程内容即涵盖账户、计算资源、智能合约、动作与交易等EOS区块链的核心概念,同时也讲解如何使用eosjs和eosjs-ecc开发包访问EOS区块链,以及如何在React前端应用中集成对EOS区块链的支持。课程内容深入浅出,非常适合前端工程师深入学习EOS区块链应用开发。
- java比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Java代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Java工程师不可多得的比特币开发学习课程。
- php比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在Php代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是Php工程师不可多得的比特币开发学习课程。
- c#比特币开发教程,本课程面向初学者,内容即涵盖比特币的核心概念,例如区块链存储、去中心化共识机制、密钥与脚本、交易与UTXO等,同时也详细讲解如何在C#代码中集成比特币支持功能,例如创建地址、管理钱包、构造裸交易等,是C#工程师不可多得的比特币开发学习课程。
- java以太坊开发教程,主要是针对java和android程序员进行区块链以太坊开发的web3j详解。
- python以太坊,主要是针对python工程师使用web3.py进行区块链以太坊开发的详解。
- php以太坊,主要是介绍使用php进行智能合约开发交互,进行账号创建、交易、转账、代币开发以及过滤器和交易等内容。
- 以太坊入门教程,主要介绍智能合约与dapp应用开发,适合入门。
- 以太坊开发进阶教程,主要是介绍使用node.js、mongodb、区块链、ipfs实现去中心化电商DApp实战,适合进阶。
- ERC721以太坊通证实战,课程以一个数字艺术品创作与分享DApp的实战开发为主线,深入讲解以太坊非同质化通证的概念、标准与开发方案。内容包含ERC-721标准的自主实现,讲解OpenZeppelin合约代码库二次开发,实战项目采用Truffle,IPFS,实现了通证以及去中心化的通证交易所。
- C#以太坊,主要讲解如何使用C#开发基于.Net的以太坊应用,包括账户管理、状态与交易、智能合约开发与交互、过滤器和交易等。
- Hyperledger Fabric 区块链开发详解,本课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、通道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、nodejs链码与应用开发的操作实践,是Nodejs工程师学习Fabric区块链开发的最佳选择。
- Hyperledger Fabric java 区块链开发详解,课程面向初学者,内容即包含Hyperledger Fabric的身份证书与MSP服务、权限策略、频道配置与启动、链码通信接口等核心概念,也包含Fabric网络设计、java链码与应用开发的操作实践,是java工程师学习Fabric区块链开发的最佳选择。
- tendermint区块链开发详解,本课程适合希望使用tendermint进行区块链开发的工程师,课程内容即包括tendermint应用开发模型中的核心概念,例如ABCI接口、默克尔树、多版本状态库等,也包括代币发行等丰富的实操代码,是go语言工程师快速入门区块链开发的最佳选择。
汇智网原创翻译,转载请标明出处。这里是先进的EOSIO编程理念