您好,登录后才能下订单哦!
请求超时!
请点击 重新获取二维码本篇内容介绍了“以太坊智能合约ABI怎么获取”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
如果理解 API 就很容易了解 ABI。简单来说,API 是程序与程序间互动的接口。这个接口包含程序提供外界存取所需的 functions、variables 等。ABI 也是程序间互动的接口,但程序是被编译后的 binary code。所以同样的接口,但传递的是 binary 格式的信息。所以 ABI 就要描述如何 decode/encode 程序间传递的 binary 信息。下图以 Linux 为例,描述 Linux 中 API、ABI 和程序的关系。
在 Ethereum 智能合约可以被大家使用前,必须先被部署到区块链上。
从智能合约的代码到使用智能合约,大概包含几个步骤:
编写智能合约的代码(一般是用 Solidity 写)
编译智能合约的代码变成可在 EVM 上执行的 bytecode(binary code)。同时可以通过编译取得智能合约的 ABI
部署智能合约,实际上是把 bytecode 存储在链上(通过一个transaction),并取得一个专属于这个合约的地址
如果要写个程序调用这个智能合约,就要把信息发送到这个合约的地址(一样的也是通过一个 transaction)。Ethereum 节点会根据输入的信息,选择要执行合约中的哪一个 function 和要输入的参数
而要如何知道這这个智能合约提供哪些 function 以及应该要传入什么样的参数呢?这些信息就是记录在智能合约的 ABI!
Ethereum 智能合约 ABI 用一个 array 表示,其中会包含数个用 JSON 格式表示的 Function 或 Event。根据最新的 Solidity 文件:
共有 7 个参数:
name
:a string,function 名称
type
:a string,"function", "constructor", or "fallback"
inputs
:an array,function 输入的参数,包含:
name
:a string,参数名
type
:a string,参数的 data type(e.g. uint256)
components
:an array,如果输入的参数是 tuple(struct) type 才会有这个参数。描述 struct 中包含的参数类型
outputs
:an array,function 的返回值,和 inputs
使用相同表示方式。如果沒有返回值可忽略,值为 []
payable
:true
,function 是否可收 Ether,预设为 false
constant
:true
,function 是否会改写区块链状态,反之为 false
stateMutability
:a string,其值可能为以下其中之一:"pure"(不会读写区块链状态)、"view"(只读不写区块链状态)、"payable" and "nonpayable"(会改区块链状态,且如可收 Ether 为 "payable",反之为 "nonpayable")
仔细看会发现 payable
和 constant
这两个参数所描述的內容,似乎已包含在 stateMutability
中。
事实也确实是这样的,在 Solidity v0.4.16 中把 constant
这个修饰function 的 key words 分成: view
(neither reads from nor writes to the state)和 pure
(does not modify the state),并从 v0.4.17 开始 Type Checker 会强制检查。constant
改为只用来修饰不能被修改的 variable。并在 ABI 中加入 stateMutability
这个参数统一表示,payable
和 constant
目前保留是为了向后兼容。这个改动详细的內容和讨论可参考: https://github.com/ethereum/solidity/issues/992
共有 4 个参数:
name
: a string,event 的名称
type
: a string,always "event"
inputs
: an array,输入参数,包含:
name
: a string,参数名称
type
: a string,参数的 data type(e.g. uint256)
components
: an array,如果输入参数是 tuple(struct) type 才会有这个参数。描述 struct 中包含的信息类型
indexed
: true
,如果这个参数被定义为 indexed ,反之为 false
anonymous
: true
,如果 event 被定义为 anonymous
更新智能合约状态需要发送 transaction,transaction 需要等待验证,所以更新合约状态是非同步的,无法马上取得返回值。使用 Event 可以在状态更新成功后,将相关信息记录到 Log,并让监听这个 Event 的 DApp 或任何应用这个接口的程序收到通知。每笔 transaction 都有对应的 Log。
所以简单来说,Event 可用來:1. 取得 function 更新合约状态的返回值 2. 也可作为合约另外的存储空间。
Event 的参数分为:有 indexed
,和其他没有 indexed
的。有 indexed
的参数可以使用 filter,例如同一个 Event,我可以选择只监听从特定 address 发出来的交易。每笔 Log 的信息同样分为两个部分:Topics(长度最多为 4 的 array) 和 Data。有 indexed
的参数会存储存在 Log 的 Topics,其他的存在 Data。如果定义为 anonymous
,就不会产生以下示例中的 Topics[0],其值为 Event signature 的 hash,作为這個 Event 的 ID。
event Set(address indexed _from, uint value)
这个智能合约包含:
data
:一个可修改的 state variable,会自动产生一个只能读取的 data()
function
set()
:一个修改 data
值的 function
Set()
:一个在每次修写 data
时记录 Log 的 event
智能合约 Source Code:
pragma solidity ^0.4.20; contract SimpleStorage { uint public data; event Set(address indexed _from, uint value); function set(uint x) public { data = x; Set(msg.sender, x); } }
智能合约 ABI:
[{ "constant": true, "inputs": [], "name": "data", "outputs": [{"name": "","type": "uint256"}], "payable": false, "stateMutabㄒility": "view", "type": "function" }, { "anonymous": false, "inputs": [{"indexed": true,"name": "_from","type": "address"},{"indexed": false,"name": "value","type": "uint256"}], "name": "Set", "type": "event" }, { "constant": false, "inputs": [{"name": "x","type": "uint256"}], "name": "set", "outputs": [], "payable": false, "stateMutability": "nonpayable", "type": "function" }]
可以用 Solidity Compiler 取得合约 ABI,我使用 JavaScript 版本的 Compiler 为例。
安装:
npm install solc -g
取得合约 ABI:
solcjs simpleStorage.sol --abi
会生成一个 simpleStorage_sol_SimpleStorage.abi 文件,里面就是合约ABI 內容。
也可以取得合约的 binary code:
solcjs your_contract.sol --bin
同样的使用 Solidity Compiler,也可以用 Remix。在合约的 Details 可以看到完整的 ABI。可以在 Settings 中指定 Compiler 版本。
许多知名合约会把合约 source code 放上 Etherscan 做验证,可以同时看到h 合约ABI。
另外 Etherscan 提供 API,可用来取得经过验证的合约 ABI。
“以太坊智能合约ABI怎么获取”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
PHP网站源码益阳企业网站设计哪家好大芬至尊标王推荐张掖seo网站优化价格坂田SEO按天收费公司秦皇岛外贸网站设计公司安阳建网站多少钱霍邱网站优化按天扣费哪家好衡水营销型网站建设价格运城百搜标王哪家好信阳网站推广推荐白银seo排名多少钱阜阳网站seo优化运城seo价格迪庆关键词按天计费多少钱大丰网络营销长沙网页设计哪家好郑州外贸网站建设丹竹头网络推广哪家好思茅高端网站设计价格洛阳设计公司网站价格德州SEO按天收费推荐楚雄百姓网标王公司曲靖网站优化哪家好连云港seo网站优化公司湛江至尊标王沈阳模板制作价格红河网站优化软件多少钱湖州百度关键词包年推广公司武汉网站制作设计公司株洲百度标王报价歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运