乐趣区

关于区块链:Solidity-的-ABI-和-bytecode-是什么

当你作为 Solidity 开发者开始写 Ethereum 智能合约的时候,你会很快接触到一些概念像是 EVM(Ethereum Virtual Machine),bytecode 和 ABI(application binary interface),如果你是一个 Javascript 开发者(就像我第一次学习代码的时候一样),这些专有名字可能对你来说并不生疏,你可能想晓得在 Solidity 和 Ethereum 世界中,这些名字和你了解的意思一不一样。

这篇文章会从技术的角度去理解这三个概念,看完这篇文章当前,你会晓得什么是 EVM,Bytecode 和 ABI,而且会理解怎么样在我的项目中疾速生成和应用 bytecode 和 ABI。

VM 和 EVM

让咱们从以太坊虚拟机(EVM)开始理解,首先先把 EVM 放在一边,了解什么是 VM。艰深的来讲,VM 也是一个可能在硬件上运行的软件,然而与其他软件不同的是,VM 次要是被设计来模仿硬件的。即这个软件是用来“伪装”本人是一个硬件,就像音乐 App 是一个虚构的播放零碎一样,它不是一个物理的硬件,然而模仿了一个物理机器。

为什么咱们须要虚拟机?答案是虚拟机能够无效地扩大,治理和降级软件运行所以来的基础设施。要应用 1000 个物理服务器的业务,你可能只须要应用 20 个而后在每一个物理服务器上跑 50 个虚拟机。你甚至能够让每一个虚拟机都运行不同的操作系统,比方一个虚拟机运行 Windows 服务器,第二个运行 Linux Debian,第三个运行 Gentoo Linux,而后第四个运行 ChromeOS!

在同一个硬件上的不同虚构即运行多个操作系统

这样做的益处是你能够在这些虚拟机上运行多个利用,所有的这些都是运行在同一个硬件中的,所以这个硬件的计算资源和系统资源的应用效率更高,晋升了基础设施的性价比。

以太坊虚拟机(EVM)也是一种虚拟机。然而 EVM 的目标是发明一个去中心化的“世界计算机”,而不是最高效地应用硬件资源。区块链网络中每一个“节点”都是一个独自的硬件,EVM 是泛滥节点的汇合。每一个运行客户端软件的节点,都会实现以太坊技术规范,因为他们须要彼此连贯,造成一个网络。而后这个网络上的节点会同步他们的状态,以造成一个常常更新的微小的数据库。网络中的节点须要实现对数据状态的同步,而数据的同步是由共识算法实现的。

EVM 作为一个去中心化虚拟机,能够运行叫做智能合约的程序。就像其余利用一样,咱们写完智能合约当前会去编它,而后能力被部署(部署在以太坊区块链网络)。因为区块链是不可篡改的,所以合约一旦部署实现,就不能被批改了。合约部署实现当前,EVM 就是这个合约中的代码被执行的环境,也就是运行咱们部署的智能合约的虚拟机。

咱们应用人类可读的代码语言来写程序的(即便在刚开始学习的时候,可读性并不是十分强),这是因为咱们须要浏览,编辑,保护和 debug 软件。然而机器是无奈执行人类可读代码的,它们只可能辨认二进制数据,也就是一串由 0 和 1 所组成的数据流。所以在咱们实现代码之后,须要申请编译器(也是一个软件)来将其编译以便它在机器上运行。

在 Solidity 中,咱们编译代码当前,会失去两个“artifact”:bytecode 和 ABI。

Solidity 中的 Bytecode

Bytecode 是 Solidity 代码被翻译当前的信息,它包含了二进制的计算机指令。Bytecode 通常是将数字,常量和其余信息以一种编码方式写在一起。每一个指令都是一个被称为 opcode 的操作,这些 opcode 的大小都是 1 比特(8 位)。这也是为什么咱们叫它“bytecode”,即长度为 one-byte 的 opcode。

因为每一行代码都会被分拆变成一个个 opcode,所以计算机会在运行代码的时候会分明的晓得要做什么。

在以太坊,其实被部署在区块链上的就是 bytecode。当咱们用 Metamask 将合约部署到区块链,并确认交易的时候,咱们实际上能够看到 bytecode 被部署了。bytecode 能够被拆分成多个 opcode,然而本文不会波及。

通过 Metamask 部署智能合约时能够看到 bytecode.

Bytecode 就是咱们存储在以太坊网络的货色,同时它在咱们与智能合约交互的时候会被执行。有很多工具和库(包含 Solidity 编译机,solc)能够帮忙你将 Solidity 代码编译为 bytecode。最快的形式就是通过在线 IDE Remix 来编译合约,而后复制 ABI 和 bytecode。

这里举个小例子,怎么生成和复制 bytecode,点击这个连贯而后关上 Chainlink Price Feed,能够在 Remix 中看到 Solidity 智能合约。点击编译而后就能够复制 bytecode 了,非常简单!

应用 Remix 生成 bytecode

什么是 Solidity ABI?

你可能据说过 API(application programming interfaces),它实际上蕴含很多办法,函数,变量和常量,你能够通过 API 与一个库,网络的 endpoint,后端服务或者是其余的软件服务和利用。API 能够以一种可控,稳固和易于应用的形式,将一个软件的性能提供给外界。API 是一个接口,能够帮忙两个软件彼此之间进行交互。

ABI 是 application binary interfaces,它定义了智能合约中能够进行交互的办法和变量。因为智能合约在部署到区块链之前就曾经转变为 bytecode,所以咱们须要晓得有哪些能够应用的操作,同时咱们也须要一个规范来展现这些接口以便别的编程语言也能够与智能合约交互。只管 Javascript 是与智能合约交互最罕用的语言(次要是因为 Javascript 是一个前端语言,而咱们通常调用合约的形式通过前端网页),然而只有你有 ABI,就能够应用任何一种变成语言与合约交互。

Solidity 中 ABI 的构造

所以 ABI 就是一些定义,帮忙咱们晓得办法名字,参数,数据类型以便咱们与合约交互,同时也是智能合约 emit 的事件的构造。对于函数,以下是在 ABI 中找到的属性:

  • type: 定义了函数的类型,类型是 function, constructor, receive or fallback 中的一个。
  • name: 函数的名称是什么。
  • inputs: 一个蕴含了下列信息的对象的数组
  • name: 参数名称。
  • type: 参数类型。
  • components: 参数类型是 tuple 的时候会应用到。
  • outputs: 相似于 inputs 的对象数组。
  • stateMutability: 标注函数状态的字符串。值能够是 view, pure, view, nonpayable, 和 payable

定制化的谬误和工夫有很类似的数据结构,你能够在官网文档中学习它。

ABI 能够被示意成一个相似于上面的 JSON 文件

[
      {"inputs": [],
            "stateMutability": "nonpayable",
            "type": "constructor"
      },
      {"inputs": [],
            "name": "getLatestPrice",
            "outputs": [
                  {
                        "internalType": "int256",
                        "name": "","type":"int256"
                  }
            ],
            "stateMutability": "view",
            "type": "function"
      }
]

你能够再次在 Remix IDE 中关上 Chainlink Price Feed 合约,而后生成相似于上述 ABI。编译代码,而后再获取 ABI,如下图所示。

应用 Remix 疾速生成 ABI

你能够从 ABI 中看出一个函数是一个一般函数还是构造函数,它的输出是什么,返回值的数据类型是什么和其余更多的信息。这就是你与智能合约交互时所须要用到的信息。当然,在应用形式上,你能够最终会应用像是 EtherJS 这样的库来与合约交互,然而 ABI 是必要的。

还有另外一个获取 ABI 和 Bytecode 的办法:你能够通过 Remix 中的“Compilation Details”取得须要的信息,如下图所示。留神这里你只能取得你本人写的智能合约的 ABI 和 bytecode,引入的库和合约没法通过这种形式获取对应的 ABI 和 bytecode。

通过 Reimx 取得 ABI 和 bytecode

你当初曾经理解 EVM 是什么,bytecode 是什么,为什么 ABI 对于智能合约很重要了。更重要的是,你曾经学习到一些技巧,在浏览器中就能够取得 compiled artifact,心愿这些常识能够帮忙你晋升开发效率。
您能够关注 Chainlink 预言机并且私信退出开发者社区,有大量对于智能合约的学习材料以及对于区块链的话题!

退出移动版