本篇文章为大家展示了如何理解稳定性的字节码和操作码,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
坚固的字节码和操作码
随着我们更深入地编写智能合约,我们将遇到诸如“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”……等等。
如何理解稳定性的字节码和操作码