原文:
什么是ABI
ABI是Application Binary Interface的縮寫卡乾,字面意思 應(yīng)用二進(jìn)制接口,可以通俗的理解為 合約的接口說(shuō)明刁赦。當(dāng)合約被編譯后,那么它的abi也就確定了闻镶。
我們先來(lái)看個(gè)極簡(jiǎn)單的合約和它的abi
pragma solidity ^0.4.4;
contract test {
string public a;
function modify_a(string val) {
a = val;
}
}
編譯后的字節(jié)碼
6060604052341561000c57fe5b5b60e18061001b6000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630dbe671f146044578063efa3b144146067575bfe5b3415604b57fe5b60516098565b6040518082815260200191505060405180910390f35b3415606e57fe5b60826004808035906020019091905050609e565b6040518082815260200191505060405180910390f35b60005481565b60006005820260008190555060005490505b9190505600a165627a7a72305820e7910925075fb58319dd637b47520b821714dd11ad896cb6d8272151aff714690029
abi
[{"constant":true,"inputs":[],"name":"a","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"val","type":"uint256"}],"name":"modify_a","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"}]modify_a","outputs":[],"payable":false,"type":"function"}]
為了看起來(lái)更方便甚脉,把它格式化一下
[
{
"constant": true,
"inputs": [
],
"name": "a",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"type": "function"
},
{
"constant": false,
"inputs": [
{
"name": "val",
"type": "uint256"
}
],
"name": "modify_a",
"outputs": [
{
"name": "",
"type": "uint256"
}
],
"payable": false,
"type": "function"
}
]
可以看到,解析之后是一個(gè)數(shù)組铆农,它包含兩個(gè)對(duì)象牺氨,每個(gè)對(duì)象都對(duì)應(yīng)著一個(gè)合約方法,這里因?yàn)閍是public類型的,編譯的時(shí)候會(huì)自動(dòng)為它生成get()方法波闹,所以這個(gè)合約實(shí)際是包含兩個(gè)方法的酝豪,解析之后的json應(yīng)該不難看懂,下面對(duì)幾個(gè)關(guān)鍵字做以解釋
- type 方法類型精堕,包括function, constructor, fallback(缺省方法)可以缺省,默認(rèn)為function
- name 方法名
- inputs 方法參數(shù)蒲障,它是一個(gè)對(duì)應(yīng)數(shù)組歹篓,數(shù)組里的每個(gè)對(duì)象都是一個(gè) 參數(shù)說(shuō)明
- name 參數(shù)名
- type 參數(shù)類型
- outputs 方法返回值,格式和inputs類型揉阎,如果沒(méi)有返回值可以缺省
- constant 布爾值庄撮,如果為true指明方法不會(huì)修改合約的狀態(tài)變量
- payable 布爾值,標(biāo)明方法是否可以接收ether
構(gòu)造方法和缺省方法不能有name 和 outputs , 缺省方法也不能有inputs
向一個(gè)沒(méi)有payable標(biāo)注的方法發(fā)送ether會(huì)拋異常