Qtum量子链研究院:x86 SimpleABI 协议与 abigen 工具

量子链区块大康2018-11-20 20:57:58  阅读 -评论 0  阅读原文

Qtum abigen

这是 Qtum x86 合约的一个轻量级的 ABI。这个 ABI 规范称为 Simple ABI。

SimpleABI 只编码字段值(flat values)和简单数组(simple arrays)。它不是智能合约 ABI 的终极状态,只是实现起来非常简单,最重要的是使用起来非常顺手。

abigen 可以以下 3 种方式运行:

1

Dispatcher -- 生成代码,用于解码 SCCS 上的 ABI 数据并调用适当的函数

2

Caller -- 为指定的合约生成代码,可使用 SimpleABI 轻松调用外部合约

3

Encoder -- 用一系列参数生成合约调用的数据。人们可以简单地用 sendtocontract 等即可调用 SimpleABI 合约

与 Solidity 的区别是什么?

Solidity 调用外部合约的 ABI 直接内建在语言中。Solidity 专门用于构建智能合约,因此这么设计是有一定道理的。

但是,x86 VM 支持多种不同的语言,这些语言不是专门为智能合约而设计的。这意味着我们必须在这些现有语言之上构建 ABI。使用复杂的语言分析库等或许可以自动构建适当的 ABI,但很难用,限制大,且不能在语言之间移植。

我们正在设计的这个新VM,应该是可以从你的 C 语言合约调用另一个 C 语言合约,也可以从你的 C++ 合约调用一个 Rust 合约等等。

这个 ABI 比 Solidity 的 ABI 简单得多,但与 Solidity 不同,它是显式调用的,即它只能调用在 ABI 文件中直接指定的函数。因此,这个 ABI 往往需要更多的模板代码来处理简单的事情,比如调用函数,甚至只是解码发送的 ABI 数据......所以,一个理想的工具是代码生成。我们可以使用模板代码来生成函数,这样开发人员实际中使用函数只要几行代码。

与 EVM 暴露"调用数据"的方式不一样的是,x86 VM具有"智能合约通信堆栈"(SCCS,smart contract communication stack)。我们只需要一个在合约之间传递和返回数据的栈,没必要解析一个大的扁平字节数组。

这大大简化了智能合约的实现,这个 ABI 就是为了利用这一点而设计的。SCCS 可以将每个参数视为栈上的一个子项,而不需要解码一大块数据。这也使得调用合约变得更容易,因为不再需要构造一大块数据。大块数据往往需要分配足够内存,将所有元素放入一个连续的内存区域;而 SCCS 可以使用许多较小的内存实现。

ABI 规范

ABI 规范很简单,每个函数 1 行。它还充当合约函数前后堆栈的表。即使不使用abigen,这也是一种有用的规范,可以手动实现对合约数据的编码解码的堆栈操作。

类似 ERC20 的接口示例:

ERC20Interface
# The first non-comment line is the name of the interface and used for all codegen prefixes
# this is a comment
selfBalance -> balance:uint64
address:UniversalAddress balance:fn -> balance:uint64
addressTo:UniversalAddress value:uint64 send:fn -> newFromBalance:uint64 newToBalance:uint64
address:UniversalAddress buyTokens:fn -> newBalance:uint64 -- payable

也可以使用数组:

ArrayExample
#declares someFunction takes an array of 20 bytes exactly
someData:uint8[20]:fixed someFunction:fn -> void
#declares someFunctionDynamic that takes an array of no more than 20 bytes
someData:uint8[20]:max someFunctionDynamic:fn -> void

支持的基本类型:

  • uint8
  • uint16
  • uint32
  • uint64
  • int8
  • int16
  • int32
  • int64
  • char
  • void -- 仅对返回数据有效。对应无返回数据
  • fn -- 特殊

更高级的类型:

  • UniversalAddress

基本类型尽可能传值使用。高级类型传引用。数组传引用,并指向值,值包括高级类型。

数组类型:

  • fixed(默认) - 数据必须是指定的确切大小
  • max(指定最大) -数据不能大于指定的大小。如果它较大,则会触发错误
  • dynamic(动态) - 任何长度都有效(使用前 uint8[])有效
  • clip(截断) - 如果数据大于指定的大小,那么它会被截断,不会触发任何错误

函数编号

函数编号的构造方式与 Solidity 类似。 sha256 哈希由函数行和接口名称组成,哈希值截断到后面 4 个字节作为函数号。

内存分配

大于 256 字节的数组都使用堆分配而不是栈。

接口

一个合约可以实现多个接口。每个接口使用该接口名称前缀来生成代码。对于具有相同名称的多个函数,只要它们由不同名称的接口定义,就可以同时存在于一个合约内。

包括其他接口:

MyContract
:interfaces ERC20, ERC721, MyParentContract

abigen 自动查找当前目录中的 ABI 文件名,并实现指定全局接口目录的方法。

语言

现在只支持 C. 之后会支持 Rust。

示例(手动生成) C代码:

struct simpletoken_Send_Params{
UniversalAddressABI* address;
uint64_t value;
};

struct simpletoken_Send_Returns{
uint64_t recvvalue;
uint64_t sendervalue;
};

void decodeABI(){
//format: address:address value:uint64 SEND -> sendervalue:uint64 recvvalue:uint64
//format: address:address BALANCE -> balance:uint6
//format: SELFBALANCE -> balance:uint64
uint32_t function = 0;
if(qtumStackItemCount() == 0){
//fallback function...
}
QTUM_POP_VAL(function);
switch(function){
case CONTRACT_SELFBALANCE:
{
uint64_t resBalance;
selfBalance(&resBalance);
QTUM_PUSH_VAL(resBalance);
return;
}
case CONTRACT_BALANCE:
{
UniversalAddressABI address;
QTUM_POP_VAL(address);

uint64_t resBalance;
balance(&address, &resBalance);
QTUM_PUSH_VAL(resBalance);
return;
}
case CONTRACT_SEND:
{
struct simpletoken_Send_Params params;
UniversalAddressABI __tmp1;
params.address = &__tmp1;


QTUM_POP_VAL(params.value);
QTUM_POP_VAL(__tmp1);
struct simpletoken_Send_Returns returns;

send(&params, &returns);
QTUM_PUSH_VAL(returns.sendervalue);
QTUM_PUSH_VAL(returns.recvvalue);
return;
}
default:
qtumError("Invalid function");
return;
}
}

//format for this:
//address:address value:uint64 SEND -> sendervalue:uint64 recvvalue:uint64
struct QtumCallResultABI simpletoken_Send(const UniversalAddressABI* __contract, uint64_t __gasLimit,
const struct simpletoken_Send_Params* params,
struct simpletoken_Send_Returns* returns
)
{
if(__gasLimit == 0){
__gasLimit = QTUM_CALL_GASLIMIT;
}
qtumStackClear();
QTUM_PUSH_VAL(*params->address);
QTUM_PUSH_VAL(params->value);
uint32_t f = CONTRACT_SEND;
QTUM_PUSH_VAL(f);
struct QtumCallResultABI result;
qtumCallContract(__contract, __gasLimit, 0, &result);
if(result.errorCode != 0){
return result;
}
QTUM_POP_VAL(returns->recvvalue);
QTUM_POP_VAL(returns->sendervalue);
return result;
}

其他

对于不支持内置数组大小的语言,不定长数组数组也会有个 "length" 参数暴露给 Caller 和 Dispatcher。

声明:链世界登载此文仅出于分享区块链知识,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不构成投资建议。投资者据此操作,风险自担。此文如侵犯到您的合法权益,请联系我们kefu@lianshijie.com

参与讨论 (0 人参与讨论)

相关推荐

RCEP是重振全球经济和反对保护主义的有力工具

RCEP是重振全球经济和反对保护主义的有力工具

RCEP谈判从2013年正式开始,在历经7年、3次领导人会议、19次部长级会议、28轮正式谈判之后,2019年11月初的RCEP第三次领导人会议正式宣布,"十五个RCEP成员国已经结束全部20个章节的文本谈判以及实质上所有的市场准入问题的谈判",并将启动法律文本审核工作,以便在2020年签署协定。今年以来,国际经贸往来受到新冠疫情严重冲击,但是各成员国家仍在积极推进RCEP进程。东盟是RCEP的规

研究:区块链是能够促进核裁军的加密工具

研究:区块链是能够促进核裁军的加密工具

暴走时评:研究人员的新报告指出,围绕联合国《不扩散条约》巩固的多边核秩序一直受到国际合作问题的困扰,而核武器国家和无核武器国家之间的不对称性更加剧了这一问题。对此,他们提出了区块链作为新的“非政治”解决方案。 翻译:Maya 伦敦国王学院科学与安全研究中心的研究人员分析了核裁军问题的“非政治”解决办法。 研究人员的新报告指出,围绕联合国《不扩散条约》巩固的

10个挖矿实用小工具,哪几款击中了你的收藏欲

现在,这个指数在QKL123上很容易获取,除了BTC,还有ETH和BCH的累计涨幅;而且还有7日、30日、60日、90日可供参考。

比特币已做好成为新型对冲工具的准备

至于持有政府债券的安全性方面,主权债务占 GDP 的比重处于历史最高水平。比特币是另一种资产,其供应量更具弹性。他们都将比特币纳入自己的投资组合和公司的储备资产,用来对冲货币贬值所带来的风险。

以太坊主网上测试工具推荐

现在是2022年。为应对covid-19经济衰退而采取的量化宽松政策已导致眼镜蛇效应.全世界已经陷入了更严重的衰退。传统金融已经一去不复返了,而以太坊则是新金融科技革命的唯一希望,即这场革命可以使世界摆脱这场经济噩梦。 而你是一个才华横溢且有抱负的开发人员,希望创建下一个革命性的金融应用程序,这将有助于拯救我们所有人并恢复和平。你知道你的应用程序需要与主网上已建立的协议进行交互,例如Uniswap

一些常用的Defi查询工具

一些常用的Defi查询工具

一、查看 DeFi 板块整体市值 通过 coingecko 网站可以查询 ETH DeFi 的整体市值,以及 DeFi 所占 ETH 甚至是整个加密货币市场整体市场的百分比。查询 DeFi 整体市值网址: https://www.coingecko.com/en/defi上图显示了 ETH DeFi 市值 TOP100 的整体市值以及占比情况。从上图可以看出,ETH DeFi 板块的代币总市值为

回顾 | 使用 Starport 工具 5 分钟搭建区块链

10 月 16 日,HackAtom V 正式启动,为帮助开发者更好理解并参与活动,Cosmos 举办了多场不同主题的直播活动。面向中国技术社区,IRISnet 的核心开发霍达进行了一场主题为《使用 Starport 工具,5 分钟搭建区块链》的中文直播活动。视频回顾:https://mp.weixin.qq.com/s/LEpF38gaORlJyF6v6h9pCwStarport 是一个开源且能

BCH混币工具势如劈竹:CashFusion混币超2亿元

来自stats.devzero.be/#/fusion的数据显示,自2019年11月28日起,混币工具CashFusion已经处理了大约19658次融合交易,通过CashFusion进行混币BCH有791310个,大约价值2.1亿美元。 混币是体现加密货币隐私性的一种方式,为用户提供这项服务的项目方,将用户的币和其他用户同样数量的同种币放在一笔交易中,混合打乱后,再将原数量的币返

麦妖榜
更新日期 2019-09-03
排名用户贡献值
1牛市来了30910
2BitettFan24187
3等待的宿命23810
4区块大康20369
5六叶树20310
6linjm122719429
7天下无双16192
8lizhen00215280
9让时间淡忘14586
10yelanyi050511349
返回顶部 ↑