API & ABI

本文解释了API(应用程序编程接口)和ABI(应用程序二进制接口)之间的区别,API主要关注源代码层面,如POSIX标准定义的函数原型,而ABI则关注于二进制兼容性,例如函数调用方式、变量内存布局等。

API:Application Programming Interface

ABI:Application Binary Interface。我们把符合修饰标准、变量内存布局、函数调用方式等这些跟可执行代码二进制兼容性相关的内容成为ABI.

实际上它们都是所谓的应用程序接口,只是它们所描述的接口所在的层面不一样。API往往指源代码级别的接口,必然我们可以说POSIX是一个API标准、windows所规定的应用程序接口是一个API;而ABI是指二进制层面的接口,ABI的兼容程度比API要更为严格,比如我们可以说C++的对象内存分布(Object Memory Layout)是C++ ABI的一部分。

API更关注源代码层面,比如POSIX规定printf()这个函数原型,它能保证这个函数定义的所有遵循POSIX标准的系统直接都是一样的,但是它不保证printf在实际的每个系统中执行时,是否按照从右到左将参数压入堆栈,参数在堆栈中如何分布等这些实际运行时的二进制级别的问题。比如有两台机器,一台是Intel X86,另外一台是MIPS的,他们都安装了linux系统,由于linux支持POSIX标准,所以他们的c运行库都应该有printf函数。但实际上printf在被调用过程中,这些关于参数和堆栈分布的细节在不同的机器上肯定是不一样的,甚至调用printf的指令也是不一样的(x86是call指令,MIPS是jal指令),这就是说,API相同并不表示ABI相同

PHP Tron HTTP API可以通过ABI编码来调用智能合约的函数。ABI(Application Binary Interface)是智能合约与外部世界(例如Web3.js或PHP Tron HTTP API)之间的接口,它定义了函数调用的输入和输出参数类型以及编码规则。 在PHP Tron HTTP API中,你可以使用Tron-Web库来对ABI进行编码和解码。下面是一个简单的示例代码: ```php // 导入Tron-Web库 require_once('path/to/tron-web/vendor/autoload.php'); // 定义智能合约的ABI $abi = '[{"constant":false,"inputs":[{"name":"x","type":"uint256"},{"name":"y","type":"uint256"}],"name":"add","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getResult","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"}]'; // 创建TronWeb实例 $tronWeb = new \Tron\Web('http://localhost:9090'); // 获取智能合约对象 $contract = $tronWeb->contract($abi, '0x123456789abcdef'); // 编码add函数的输入参数 $encoded = $contract->functions->add(10, 20)->encodeABI(); // 调用智能合约函数 $result = $tronWeb->sendTransaction([ 'to' => '0x123456789abcdef', 'data' => $encoded ]); // 解码getResult函数的输出参数 $decoded = $contract->functions->getResult()->decodeOutput($result['constant_result'][0]); ``` 在这个示例代码中,我们首先定义了一个简单的智能合约ABI,其中包含了一个名为add的函数和一个名为getResult的函数。然后,我们使用Tron-Web库创建了一个TronWeb实例,并获取了一个智能合约对象。接下来,我们使用智能合约对象的functions属性来调用add函数,并将输入参数编码为ABI格式的数据。最后,我们通过调用TronWeb的sendTransaction函数来向智能合约发送交易,并将编码后的数据作为data字段的值传递。当交易被确认后,我们可以使用智能合约对象的decodeOutput函数来解码getResult函数的输出参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值