您正在查看: surou 发布的文章

先进的EOSIO编程理念

在审查EOS智能合约时,我注意到每个开发人员都有自己的编程风格,并且有许多不同的方法可以执行相同的操作,例如处理时间或将操作发送到其他合约。这篇文章是一些EOSIO库函数的思想转述,我觉得这些函数很优雅且有用。

1. eosio::same_payer

第一个只是一个常量表达式,可以在修改多索引表的条目时使用。使用eosio::same_payer时,将使用的新RAM(如果有)将分配给已为表条目支付的同一帐户。
用法:

statstable.modify( st, eosio::same_payer, [&]( auto& s ) {
    s.supply += quantity;
});

它在[multi_index.hpp]中定义,只是空name(value:0)""_n 或者name(0)的常量表达式,一些开发人员仍然使用它来表示同一个付款人。

2. get_first_receiver,get_self()

在contracts.hpp中定义的两个getters get_selfget_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帐户的帐户。

用法:

[[eosio::on_notify("eosio.token::transfer")]] void cryptoship::transfer(name from, name to, const asset &quantity,
                          string memo) {
  print(get_self()); // cryptoship
  print(get_first_receiver()); // eosio.token
}

3.action_wrapper

许多用例需要将合约代码中的新操作发送到另一个合约。这是合约可以相互积极沟通的唯一方式。同样,有很多方法可以做到这一点,但最优雅的方法之一是使用eosio::action_wrappers。它为特定智能合约代码的特定操作创建操作模板,然后可用于调用此操作。

第一个参数是操作名称,第二个参数是操作的方法声明。
用法
eosio.token标头为eosio.token.hpp header file中的所有操作定义了动作包装器:

[[eosio::action]]
void create( name   issuer,
            asset  maximum_supply);

[[eosio::action]]
void issue( name to, asset quantity, string memo );

[[eosio::action]]
void retire( asset quantity, string memo );

[[eosio::action]]
void transfer( name    from,
              name    to,
              asset   quantity,
              string  memo );

// ...

using create_action = eosio::action_wrapper<"create"_n, &token::create>;
using issue_action = eosio::action_wrapper<"issue"_n, &token::issue>;
using retire_action = eosio::action_wrapper<"retire"_n, &token::retire>;
using transfer_action = eosio::action_wrapper<"transfer"_n, &token::transfer>;
// ...

我们现在可以通过包含此头文件向任何eosio.token合约发送内联操作。

需要注意的是,只需要包含带有声明的头文件。意思是,即使对于具有未知实现细节的闭源合约,也可以轻松编写动作包装器。只需要写出声明,动作签名,可以从ABI获得。

使用eosio-cpp的-I标志包含头文件的附加包含目录。

包含头文件后,将发送内联传输操作,如下所示:

#include <eosio_token/include/eosio_token.hpp>

// can specify the contract to send the action to as first argument
token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});
// transfer arguments are now passed as postional arguments
payout.send(get_self(), to, quantity, memo);

对于使用to_action方法的延迟交易,同样适用:

token::transfer_action payout("eosio.token"_n, {get_self(), "active"_n});

transaction t{};
t.actions.emplace_back(payout.to_action(get_self(), to, quantity, memo));
t.delay_sec = 10;
t.send(0 /* sender id */, get_self(), false);

4. 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,它带有有用的助手,如secondsminuteshours

用法:

eosio::time_point tp = eosio::current_time_point();
eosio::time_point_sec tps = eosio::current_time_point();
eosio::microseconds micros = tp.time_since_epoch();
uint64_t count_micros = micros.count();
uint32_t count_seconds = tps.sec_since_epoch();

// no more 60*60*24*1e6
const auto MICROSECONDS_IN_DAY = hours(24);
count_micros += MICROSECONDS_IN_DAY;
// no more 60*60*24
count_seconds += hours(24).to_seconds();

eosio::time_point_sec lastGame = /* ... */;
check((eosio::time_point_sec)(current_time_point() + minutes(1)) >= lastGame,
      "last game not finished");

使用microseconds及其助手可以避免任何类型的常量,如const auto SECONDS_PER_DAY = 60*60*24,使代码更容易推理。

转载自:http://blog.hubwiz.com/2019/06/28/eos-programming-concepts/

EOS Detective——EOS 的主要追踪工具包

EOS Nation 刚刚推出了 eosdetective.io 工具包,可以让 EOS 区块链的取证数据分析触手可及。使用 EOS
Detective 时,您将能够识别 EOS 帐户之间的关系并在图表中显示结果。该工具包免费提供,能让用户自己成为侦探。

https://medium.com/@eosnationbp/introducing-eos-detective-db9e709d68d3

https://eosdetective.io

科普—下USDT三兄弟OMNI、ERC-20、TRC-20的相同和不同之处!

很多新人玩家每次充提币的时候,都是一脸懵逼,为何同是usdt,却又有不同的代币,不知如何下手才好,那么我今天就在这里给大家科普一下关于usdt三兄弟的最基本常识,不懂的可以收藏下!

首先我们先来弄清楚USDT是什么??

USDT是Tether公司推出的基于稳定价值货币美元(USD)的代币Tether USD(下称USDT),1USDT=1美元,用户可以随时使用USDT与USD进行1:1兑换。Tether公司严格遵守1:1准备金保证,即每发行1个USDT代币,其银行账户都会有1美元的资金保障。简单来说,USDT也是加密数字货币之一,可以在钱包、交易平台上进行转账、存储和消费。但其特别之处在于USDT和美元按1:1的比例锚定,在交易平台上可以互相赎买。

2014年11月下旬,Tether公司发行1:1锚定美元的稳定货币USDT。2015年2月,Bitfinex和Poloniex宣布交易USDT。目前,几大主流交易所和钱包平台都支持三种类型的USDT存储和交易。

截至目前,USDT市值28.15亿元,流通量28.63亿,占稳定币总份额的75%往上,在加密货币市场排名第8位。

OMNI、ERC20、TRC20、的区别在哪里

每种加密数字货币的出现都必须依赖于区块链网络,我们所熟知的就是比特币网络、以太坊网络、瑞波网络等等。

2014年,USDT是在比特币区块链上基于OMNI Layer协议发行的。由于其1:1的美元锚定,USDT成为加密数字货币的香饽饽。

2018年,以太坊网络爆红。基于ERC-20协议发行的USDT出现,可存储在以太坊地址上,每次转账需要消耗以太坊的Gas。和USDT-OMNI转账一样,需要支付矿工费。

2019年3月初,波场TRON宣布与Tether泰达公司合作,利用智能合约在波场网络中发行与美元1:1锚定的USDT,使用TRC20协议。这就有了USDT-TRON20。

所以,USDT-OMNI(美元)、USDT-ERC20(以太坊)、USDT-TRC20(波场)是采用不同的协议,属于不同的区块链网络——《重点》!!

哪种USDT最好??

三种类型的USDT可以在支持类型的交易所进行转换。作为流通稳定的加密数字货币,USDT的发行用途单一,为满足市场需求,要求价格稳定之外,转账速度和转账费率也是其发展的挑战。

USDT-OMNI的优势在于比特币网络的链上资产相对安全性较高,但是交易速度非常慢,无法满足加密交易市场的需求。

USDT-ERC20和USDT-TRC20转账速度相对于比特币网络有明显的提高,矿工费用也不相同。

USDT-TRC20发行时承诺完全公开透明,零转账费,秒级到账。能不能够做到这一点,也许只有时间能告诉我们答案。

三者最明显的区别,也是重中之重的一点,重要的事情我在这里说三遍!!!

USDT-OMNI地址是以1开头
USDT-ERC20地址是以0x开头
USDT-TRC20地址是以T开头

转载自:https://bitkan.com/zh/ksite/articles/49131

如何使用Keycat

使用Keycat登录Bloks.io
Keycat是一个基于钥匙串的身份验证器。使用Keycat,您可以像登录电子邮件一样访问任何区块链中的DApps。

在本教程中,我们将演示如何使用Keycat 登录Bloks(EOS资源管理器)以及如何在Bloks中的EOSDAQ(基于EOS的DEX)上交易令牌。

  1. 首先,访问bloks.io并单击页面右上角的“登录”。

  2. 弹出如下所示,单击“Keycat”图标。

  3. 首先,单击“导入帐户”以将您的EOS帐户导入Keycat。然后,输入您的EOS帐户和私钥,然后按“下一步”。

  4. 弹出“保存密码”时,必须单击“保存”以便以后连续单击登录。

  5. 您现在已完成使用Keycat登录Bloks.io,并且您的用户帐户显示在右上角。

开源地址:https://github.com/EOSDAQ/keycat

EOS 合约语义化

https://github.com/BlockABC/eos-semantics
https://eospark.com/semantic/playground
使人类可以理解您的EOS合同行动数据。