【WAX链游】EOS网络第三方代付CPU资源【实现代码】

回顾

《【WAX链游】EOS网络第三方代付CPU资源【原理】》
在上一篇文章中,我们介绍了EOS网络的【ONLY_BILL_FIRST_AUTHORIZER】特性,我们知道如何用A账户来支付B账户提交的交易的CPU/NET资源费用。本文,我们讲给出基于【eosjs】【waxjs】【eospy】的示例代码。

EOSJS实现

首先贴出示例代码github仓库地址,所有的示例代码都在这里,有一定基础的同学可以简单看一下就立马上手:

https://github.com/encoderlee/eos_demo

我们的大部分测试用例运行在EOS测试网络【Jungle3.0】之上,这当然也适用于EOS主网和WAX主网,只需修改RPC端点即可。

首先参考:https://github.com/encoderlee/eos_demo/blob/main/eosjs_demo/normal_transfer.html

这是使用eosjs实现的一笔转账交易,我们将 0.0001 个 EOS代币从账号【consumer1111】转给账号【consumer2222】,关键代码如下:

const consumer_name = "consumer1111";
const consumer_private_key = "5KWxgG4rPEXzHnRBaiVRCCE6WAfnqkRpTu1uHzJoQRzixqBB1k3";

const rpc = new eosjs_jsonrpc.JsonRpc("https://jungle3.greymass.com");
const provider = new eosjs_jssig.JsSignatureProvider([consumer_private_key]);
const api = new eosjs_api.Api({ rpc:rpc, signatureProvider: provider });

const result = await api.transact({
            actions: [{
                account: 'eosio.token',
                name: 'transfer',
                authorization: [
                    {
                        actor: consumer_name,
                        permission: "active",
                    },
                ],
                data: {
                    from: consumer_name,
                    to: "consumer2222",
                    quantity: '0.0001 EOS',
                    memo: 'by eosjs',
                },
            }]
        }, {
            blocksBehind: 3,
            expireSeconds: 90,
        });

代币的转移本质上是调用合约【eosio.token】的【transfer】方法,【data】是传递给【transfer】方法的参数,【authorization】指明该笔交易由谁来签名。正常情况下,这笔交易由【consumer1111】来支付CPU/NET资源费用。

那么根据上文的原理,如果要让第三个账号来支付该笔交易的CPU/NET资源费用,只需在【authorization】中增加第三个账号即可。

参考:https://github.com/encoderlee/eos_demo/blob/main/eosjs_demo/only_bill_first_authorizer.html

关键代码:

const consumer_name = "consumer1111";
const consumer_private_key = "5KWxgG4rPEXzHnRBaiVRCCE6WAfnqkRpTu1uHzJoQRzixqBB1k3";
const payer_name = "payer2222222";
const payer_private_key = "5KAskRRbqYVCRhZxLXqeg9yvWYQQHifDtf7BPceZUDw6zybjaQh";

const rpc = new eosjs_jsonrpc.JsonRpc("https://jungle3.greymass.com");
const provider = new eosjs_jssig.JsSignatureProvider([consumer_private_key, payer_private_key]);
const api = new eosjs_api.Api({ rpc:rpc, signatureProvider: provider });

const result = await api.transact({
            actions: [{
                account: 'eosio.token',
                name: 'transfer',
                authorization: [
                    {
                        actor: payer_name,
                        permission: "active",
                    },
                    {
                        actor: consumer_name,
                        permission: "active",
                    },
                ],
                data: {
                    from: consumer_name,
                    to: "consumer2222",
                    quantity: '0.0001 EOS',
                    memo: 'by eosjs',
                },
            }]
        }, {
            blocksBehind: 3,
            expireSeconds: 90,
        });

可以看到,我们在【authorization】中增加了【payer2222222】这个账号,并且把【payer2222222】放到了前面,这时他是第一授权人,最后这笔交易的CPU/NET资源费用将会由【payer2222222】来买单。当然,授权人增加了【payer2222222】后,我们也需要提供【payer2222222】的私钥,该笔交易将分别用【consumer1111】和【payer2222222】的私钥进行签名后发送。

执行效果:
在这里插入图片描述
https://jungle3.bloks.io/transaction/64f1c43328b6790c7bacdeb06a832bb6d0b918d253a996091b344cc04b6b2a3f

WAXJS实现

有同学就问了,不对呀,如果是自行创建的EOS/WAX原生账号,私钥在自己手上,确实可以直接用EOSJS来这样发起交易,但是我的WAX账号是用【WAX云钱包】注册的呀,私钥不在我手上,托管在WAX云钱包云端,我无法提供私钥呀,该怎么办。

其实不用担心,仔细阅读【eosjs】【waxjs】的代码就会发现,【waxjs】实际上就是在【eosjs】上套了一层壳,【waxjs】其实也是遵循【eosjs】的API规范来开发的,它也实现了一个SignatureProvider,和【eosjs】的JsSignatureProvider不同的是,【eosjs】的JsSignatureProvider是在本地使用私钥直接签名,而【waxjs】实现的SignatureProvider是在浏览器弹出一个授权小窗口,向【WAX云钱包】服务器发送一个HTTP请求来签署交易,感兴趣的同学可以在浏览器抓包研究授权小窗口发送了什么数据,得到的签名是什么样子的,其实都是按照eosjs的数据格式来的,它并没有做复杂的事情。当然,弄清楚原理的同学,完全可以使用python或java等其它语言,直接发送HTTP请求到 https://public-wax-on.wax.io/wam/sign 完成交易签名,这样就可以脱离浏览器环境实现链游脚本,占用更少的系统资源,一台电脑多开更多号。

本质上我们的目的是为一笔交易设置两个授权人,并且用两个授权人的私钥进行签名,那么只要能【签名】就可以了,私钥未必要在我们手上,所以针对【waxjs】的实现代码是这样的:
参考:https://github.com/encoderlee/eos_demo/blob/main/waxjs_demo/only_bill_first_authorizer.html

//waxjs rpc实例,注意需要先login()
const wax = new waxjs.WaxJS({
        rpcEndpoint: 'https://wax.greymass.com',
    });
const payer_name = "fuckpayforit"; //这里改成你支付CPU的账号
const payer_private_key = "这里填写该账号的私钥"

//eosjs rpc实例
const rpc = new eosjs_jsonrpc.JsonRpc('https://wax.greymass.com');
const provider = new eosjs_jssig.JsSignatureProvider([payer_private_key]);
const api = new eosjs_api.Api({rpc: rpc, signatureProvider: provider});

//注意broadcast: false,我们并没有发送交易,只是将交易序列化
let transcation_args = await api.transact({
    actions: [{
    account: 'eosio.token',
    name: 'transfer',
    authorization: [
        {
            actor: payer_name,
            permission: "active",
        },
        {
            actor: wax.user.account,
            permission: "active",
        },
    ],
    data: {
        from: wax.user.account,
        to: "consumer1111",
        quantity: '0.00010000 WAX',
        memo: 'by waxjs',
    },
}],
}, {
    blocksBehind: 3,
    expireSeconds: 90,
    sign: false,
    broadcast: false,
});

//首先借助eosjs用【fuckpayforit】的私钥签名
let available_keys = await api.signatureProvider.getAvailableKeys();
let sign_args = {
    chainId: api.chainId,
    requiredKeys: available_keys,
    serializedTransaction: transcation_args.serializedTransaction,
};
transcation_args = await api.signatureProvider.sign(sign_args);
const payer_signatures = transcation_args.signatures;

//然后,借助waxjs用登录的wax账号对该笔交易进行签名
available_keys = await wax.api.signatureProvider.getAvailableKeys();
sign_args = {
    chainId: api.chainId,
    requiredKeys: available_keys,
    serializedTransaction: transcation_args.serializedTransaction,
};
transcation_args = await wax.api.signatureProvider.sign(sign_args);

//合并签名
transcation_args.signatures = payer_signatures.concat(transcation_args.signatures)

//最后,发送该笔交易,用eosjs或者用waxjs来发送都行,一样的
const result = await api.pushSignedTransaction(transcation_args);

在上面的代码中,我们用登录的wax账号给【consumer1111】这个账号转账0.0001个WAX,但是该笔交易的CPU/NET费用由【fuckpayforit】来支付。

执行效果:
在这里插入图片描述
https://wax.bloks.io/transaction/02a069aac945d62d5a91e913dce7e96862235bc5c382bc7da78b9da088430a62

注意【fuckpayforit】这个账号是我们使用【Anchor】创建的WAX原生账号,私钥在我们手上,并非WAX云钱包账号,而发起交易的账号【m45yy.wam】则是托管的WAX云钱包账号。

以此为例,我们只需要创建一个用于支付CPU/NET资源的账号A,并且质押够足够多的CPU资源,然后我们的几百个WAX云钱包账号用来玩链游,这几百个账号可以完全0质押,在玩游戏,调用智能合约,发送交易的时候,让账号A也来签一下名,就可以实现所有账号的所有操作所需的CPU/NET资源都由账号A来买单。

当然这个买单的账号A也可以是一个WAX云钱包账号,但我觉得没必要了,原生账号更好管理。

EOSPY实现

至于使用Python如何实现,这里不再赘述,直接看代码即可:
https://github.com/encoderlee/eos_demo

参考

关于【ONLY_BILL_FIRST_AUTHORIZER】,这里有其它的一些好的文章和开源项目可以参考:
https://cmichel.io/eosio-how-to-pay-for-users-cpu
https://github.com/MrToph/eos-pay-for-user-cpu-example
https://github.com/pudrikrete/only_bill_first_authorizer
https://github.com/jan-gogogo/only-bill-first-authorizer

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值