简介
今天我们继续补充智能合约的进阶使用技巧,这次的主题是交易,合约内我们除了可以发起内联action的调用,很多使用还需要直接调用其他的合约action或者以交易的形式调用自身的action。
发起交易/延时交易
在合约内可以非常方便的发起一个交易,无论是调用外部的合约action还是调用自身的,都很容易。
这里可能你会有疑问,为何调用自身的action要通过发起交易的方式呢?一个最主要的原因是需要有交易记录,如果直接作为内联方法调用了,链上是看不到直观的记录的,而我们通过区块链浏览器查看交易时,是需要有交易记录或者交易通知的,才能被查询到。
构建交易
我们首先要引入#include <eosio/transaction.hpp>
,然后我们来看下面这个代码示例,这段代码来自系统合约eosio.system中delegate_bandwidth.cpp中changebw方法,这个方法在进行资源带宽的抵押和赎回的时候都会调用。而下面的煮这段代码,是调用合约自身的refund退款方法,即在赎回时需要等待3天的赎回期,3天后退款交易会被执行,然后我们赎回的资源就能转账到我们的账户了。
//构建一个transaction
eosio::transaction out;
//配置action,包括了权限、合约、action名称和参数
out.actions.emplace_back( permission_level{from, active_permission}, get_self(), "refund"_n, from);
//设置延时调用时间
out.delay_sec = refund_delay_sec;
//取消已有延迟交易
eosio::cancel_deferred( from.value );
//发送交易
out.send( from.value, from, true );
我们看到这里使用的权限是from的active权限,而from就是发起赎回的账号,因为这个是系统账号,所以有特权,可以使用用户权限进行交易。
接着get_self()
参数就是指明了调用的合约就是当前自身合约。refund
就是调用的合约action,而后面这个from
则是调用refund传递的参数。
如果你希望交易立即执行,下面这句可以忽略out.delay_sec = refund_delay_sec;
这一句是设置了延时调用的时间