如何理解稳定性的字节码和操作码

  介绍

本篇文章为大家展示了如何理解稳定性的字节码和操作码,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

坚固的字节码和操作码

随着我们更深入地编写智能合约,我们将遇到诸如“PUSH1”、“SSTORE”、“CALLVALUE”等术语。他们是什么,我们什么时候应该使用到他们?

要了解这些命令,我们必须更深入地了解以太坊虚拟机(维生素)。本文将会尝试尽可能简单地解释一些维生素与基础。希望大家都有所收获。

像许多其他流行的编程语言一样,可靠性是一种高级编程语言。我们可以读懂,但是机器却不能够。如果大家学过诸如java、c++等编程语言,应该会很容易明白这个道理。

当我们安装诸如geth之类的以太坊客户端时,它还附带了以太坊虚拟机,这是专门为运行智能合约而创建的轻量级操作系统。

当我们使用solc编译器编译坚固代码时,它将代码转换为只挣值管理有都可以理解的字节码。

让我们以一个非常简单的合同为例:

 pragma  solidity  ^ 0.4.26;
  contract  OpcodeContract  {
  ,,,uint 小姐:=,(10,+,2),*,2;
  }

如果我们在混音浏览器中运行此代码,然后单击合同详细信息,则会看到很多信息。

如何理解稳定性的字节码和操作码

在这种情况下,编译后的代码为:

字节码
  {
  ,,,“linkReferences":, {},
  ,,,“object":,“60806040526018600055348015601457600080 fd5b5060358060226000396000f3006080604052600080fd00a165627a7a72305820db1d567e501f1682876df36eea80a02d25a8b2adb186da705e2e98e134b08cc60029"
  ,,,“opcodes":,“PUSH1  0 x80  PUSH1  0 x40  MSTORE  PUSH1  0 x18  PUSH1  0 x0  SSTORE  CALLVALUE  DUP1  ISZERO  PUSH1  0 x14  JUMPI  PUSH1  0 x0  DUP1  REVERT  JUMPDEST  POP  PUSH1  0 x35  DUP1  PUSH1  0 x22  PUSH1  0 x0  CODECOPY  PUSH1  0 x0  RETURN  STOP  PUSH1  0 x80  PUSH1  0 x40  MSTORE  PUSH1  0 x0  DUP1  REVERT  STOP  LOG1  PUSH6  0 x627a7a723058  KECCAK256  0 xdb  SAR  JUMP  PUSH31  0 x501f1682876df36eea80a02d25a8b2adb186da705e2e98e134b08cc6002900 “
  ,,,“sourceMap":,“25:54:0: -;;; 64:12; 55:21;; 25:54; 9: 1; 2 .;;; 30:1的;27;20:12;5:2;25:54:0;;;;;;;“
  }

其中对象就是编译后的代码。他们是最终合同的十六进制表示形式,也称为字节码。

在混音浏览器的“Web3部署”部分下,我们看到:

 var  opcodecontractContract =, web3.eth.contract ([]);
  var  opcodecontract =, opcodecontractContract.new (
  ,,{
  ,,,,:,web3.eth.accounts [0],,
  ,,,,数据:,& # 39;0 x60806040526018600055348015601457600080fd5b5060358060226000396000f3006080604052600080fd00a165627a7a72305820db1d567e501f1682876df36eea80a02d25a8b2adb186da705e2e98e134b08cc60029& # 39;,,
  ,,,,气体:,& # 39;4700000 & # 39;
  ,,,},function  (e,合同){
  ,,,console.log (e,合同);
  ,,,if  (typeof  contract.address  !==, & # 39;未定义# 39;),{
  ,,,,,,,,console.log (& # 39; Contract 开采!,地址:,& # 39;,+,contract.address  +, & # 39;, transactionHash:, & # 39;, +, contract.transactionHash);
  ,,,}
  之前,}) 

简单来说,这意味着当我们部署合同时,我们需要将编译后的16进制码当成数据传递,并且建议的天然气为4700000。

任何以“0 x”开头的内容都表示该值采用十六进制格式。十六进制前面的“0 x”并不是强制的,因为维生素会将任何值都视为十六进制。

我们还看到了操作代码(又称操作码):

“opcodes":,“PUSH1  0 x80  PUSH1  0 x40  MSTORE  PUSH1  0 x18  PUSH1  0 x0  SSTORE  CALLVALUE  DUP1  ISZERO  PUSH1  0 x14  JUMPI  PUSH1  0 x0  DUP1  REVERT  JUMPDEST  POP  PUSH1  0 x35  DUP1  PUSH1  0 x22  PUSH1  0 x0  CODECOPY  PUSH1  0 x0  RETURN  STOP  PUSH1  0 x80  PUSH1  0 x40  MSTORE  PUSH1  0 x0  DUP1  REVERT  STOP  LOG1  PUSH6  0 x627a7a723058  KECCAK256  0 xdb  SAR  JUMP  PUSH31  0 x501f1682876df36eea80a02d25a8b2adb186da705e2e98e134b08cc6002900 “

操作码是程序的低级可读指令。所有操作码都具有对应的十六进制值,例如“MSTORE”为“0 x52 SSTORE”为“0 x55”……等等。

如何理解稳定性的字节码和操作码