摘要
应用程序二进制接口(ABI)是两个程序模块之间的接口,其中一个通常是库和/或操作系统,另一个通常是由程序员创建的应用程序。
本NEP描述了NEO智能合约的ABI标准
动机
NEO智能合约系统旨在在合同之间相互调用。为实现这一目标,我们需要一种机制来公开智能合约的接口。使用NeoContract ABI,开发人员可以轻松的创建程序来调用智能合约或编写能自动访问合同功能的客户端。
原理
我们假设应用程序二进制接口(ABI)是强类型的,在编译时已知且静态。其不会提供内省机制。我们主张所有合同都具有其在编译时可以调用的合约的接口定义
此详述不涉及其接口是动态的或仅在运行时可知的合约。如果这些案例十分重要,可以适当的提出作为特殊构建在NEO的生态体系中。
详述
合约
NeoContract ABI以Json格式定义定义,包含以下结构体,并且某些顶层对象可以包含数个子对象:
{
“hash”: “0x562851057d8afbc08fabc8c438d7cc771aef2195”,
“entrypoint”: “main”,
“functions”: [],
“events”: []
}
hash是合约的脚本哈希。它采用16进制字符按大端序编码
Entrypoint 代表合约函数的入口
functions 是一个函数对象数组,用于描述合约中每个函数的细节
events 是一个事件对象数组,用于描述合约中没给事件的细节
Function
函数对象包含以下结构:
{
“name”: “transfer”,
“parameters”: [],
“returntype”: “Boolean”
}
name代表函数的名称,可以是任何有效的标识符。
parameters是一个参数对象数组,用于描述函数中每个参数的详细信息
returntype代表函数的返回类型。可以是以下任意一种值:Signature, Boolean, Integer, Hash160, Hash256, ByteArray, PublicKey, String, Array, InteropInterface
Event
事件对象包含以下结构体
{
“name”: “refund”,
“parameters”: []
}
name代表事件的名称,可以是任何有效的标识符。
parameters是一个参数对象数组,用于描述事件中每个参数的详细信息
Parameter
参数对象包含以下结构体:
{
“name”: “from”,
“type”: “Hash160”
}
name代表参数的名称,可以是任意有效字符
type代表参数类型。可以是以下任意一种值:Signature, Boolean, Integer, Hash160, Hash256, ByteArray, PublicKey, String, Array, InteropInterface
ParameterType
参数类型有以下值:
名称 描述
Signature A signature of a transaction or block which is generated by the user.
Boolean 布尔值的值是true或者false.
Integer An arbitrarily large integer whose value in theory has no upper or lower bounds.
Hash160 160比特的整型.
Hash256 256比特的整型.
ByteArray 字节数组.
PublicKey 采用压缩模式的ECC公钥.
String 采用UTF-8编码的字符串.
Array 对象数组. 其元素类型可以是参数类型中的任何一种.
InteropInterface 返回互操作服务的接口.
Void Void 意味着函数没有返回值. 该值不是参数类型中的任何一种.
EntryPoint
强烈建议每个合约具有以下入口函数:
{
“name”: “main”,
“parameters”: [
{
“name”: “operation”,
“type”: “String”
},
{
“name”: “args”,
“type”: “Array”
}
],
“returntype”: “ByteArray”
}
通过这种方式,调用者可以从入口点轻松的访问函数,通过第一个参数指定调用函数的名称,通过第二个参数指定函数的的参数
原文链接:https://github.com/neo-project/proposals/blob/master/nep-3.mediawiki