EOS基础全家桶(十五)智能合约进阶2

简介

今天我们继续补充智能合约的进阶使用技巧,这次的主题是交易,合约内我们除了可以发起内联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;这一句是设置了延时调用的时间

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值