死磕以太坊源碼分析之EVM指令集

死磕以太坊源碼分析之EVM指令集

配合以下代碼進行閱讀:https://github.com/blockchainGuide/

寫文不易卷仑,給個小關(guān)注,有什么問題可以指出,便于大家交流學(xué)習(xí)访得。

以下指令集持續(xù)更新寻狂,最新文章請參考上面

f4a720afd869d70c3d1d2149980ba0e9

EVM 指令集概念

EVM執(zhí)行的是字節(jié)碼访娶。由于操作碼被限制在一個字節(jié)以內(nèi)又固,所以EVM指令集最多只能容納256條指令。目前EVM已經(jīng)定義了100多條指令须教,還有100多條指令可供以后擴展皿渗。這100多條指令包括算術(shù)運算指令,比較操作指令轻腺,按位運算指令乐疆,密碼學(xué)計算指令,棧贬养、memory挤土、storage操作指令,跳轉(zhuǎn)指令煤蚌,區(qū)塊耕挨、智能合約相關(guān)指令等细卧。

EVM指令集

算數(shù)運算指令集

0x0

    STOP:       "STOP",
    ADD:        "ADD", //加法運算
    MUL:        "MUL", //乘法運算
    SUB:        "SUB", //減法運算
    DIV:        "DIV", //無符號整除運算
    SDIV:       "SDIV", //有符號整除運算
    MOD:        "MOD", //無符號取模運算
    SMOD:       "SMOD", //有符號取模運算
    EXP:        "EXP",  //指數(shù)運算
    NOT:        "NOT",
    
    //從棧頂彈出兩個元素尉桩,進行比較,
    //然后把結(jié)果(1表示true贪庙,0表示false)推入棧頂蜘犁。
    //其中LT和GT把彈出的元素解釋為無符號整數(shù)進行比較,
    //SLT和SGT把彈出的元素解釋為有符號數(shù)進行比較止邮,EQ不關(guān)心符號
    LT:         "LT",  //無符號小于比較
    GT:         "GT", //無符號大于比較
    SLT:        "SLT", //有符號小于比較
    SGT:        "SGT", //有符號大于比較
    EQ:         "EQ",  // 等于比較
    
    //SZERO指令從棧頂彈出一個元素这橙,判斷它是否為0奏窑,如果是,則把1推入棧頂屈扎,否則把0推入棧頂
    ISZERO:     "ISZERO", //布爾取反
    
    //SIGNEXTEND指令從棧頂依次彈出k和x埃唯,并
    //把x解釋為k+1(0 <= k <= 31)字節(jié)有符號整數(shù),然
    //后把x符號擴展至32字節(jié)鹰晨。比如x是二進制10000000墨叛,k是0,
    //則符號擴展之后模蜡,結(jié)果為二進制1111…10000000(共249個1)
    SIGNEXTEND: "SIGNEXTEND" //符號位擴展

位運算指令集

0x10

    //AND漠趁、OR、XOR指令從棧頂彈出兩個元素忍疾,進行按位運算闯传,然后把結(jié)果推入棧頂
    AND:    "AND",
    OR:     "OR",
    XOR:    "XOR",
    
    //BYTE指令先后從棧頂彈出n和x,取x的第n個字節(jié)并推入棧頂卤妒。
    //由于EVM的字長是32個字節(jié)甥绿,所以n在[0, 31]區(qū)間內(nèi)才有意義,
    //否則BYTE的運算結(jié)果就是0荚孵。另外妹窖,字節(jié)是從左到右數(shù)的,因此第0個字節(jié)占據(jù)字的最高位8個比特
    BYTE:   "BYTE", 
    
    //這三條指令都是先后從棧頂彈出兩個數(shù)n和x收叶,
    //其中x是要進行位移操作頂數(shù)骄呼,n是位移比特數(shù),然后把結(jié)果推入棧頂
    SHL:    "SHL",
    //SHR和SAR的區(qū)別在于判没,前者執(zhí)行邏輯右移(空缺補0)蜓萄,后者執(zhí)行算術(shù)右移(空缺補符號位)
    SHR:    "SHR",
    SAR:    "SAR",
    
    ADDMOD: "ADDMOD",
    
    //MULMOD指令依次從棧頂彈出x、y澄峰、z三個數(shù)嫉沽,
    //先計算x和y的乘積(不受溢出限制),再計算乘積和z的模俏竞,最后把結(jié)果推入棧頂
    //假定乘積不會溢出绸硕,那么MULMOD(x, y, z)等價于x * y % z
    MULMOD: "MULMOD",

加密指令集

0x20

SHA3: "SHA3"

關(guān)閉狀態(tài)指令集

0x30

   ADDRESS:        "ADDRESS",
    BALANCE:        "BALANCE",
    ORIGIN:         "ORIGIN",
    CALLER:         "CALLER",
    CALLVALUE:      "CALLVALUE",
    CALLDATALOAD:   "CALLDATALOAD",
    CALLDATASIZE:   "CALLDATASIZE",
    CALLDATACOPY:   "CALLDATACOPY",
    CODESIZE:       "CODESIZE",
    CODECOPY:       "CODECOPY",
    GASPRICE:       "GASPRICE",
    EXTCODESIZE:    "EXTCODESIZE",
    EXTCODECOPY:    "EXTCODECOPY",
    RETURNDATASIZE: "RETURNDATASIZE",
    RETURNDATACOPY: "RETURNDATACOPY",
    EXTCODEHASH:    "EXTCODEHASH",

塊操作指令集

0x40

    BLOCKHASH:   "BLOCKHASH",
    COINBASE:    "COINBASE",
    TIMESTAMP:   "TIMESTAMP",
    NUMBER:      "NUMBER",
    DIFFICULTY:  "DIFFICULTY",
    GASLIMIT:    "GASLIMIT",
    CHAINID:     "CHAINID",
    SELFBALANCE: "SELFBALANCE"

存儲和執(zhí)行指令集

0x50

    POP: "POP",  // 棧頂彈出元素
    MLOAD:    "MLOAD",
    MSTORE:   "MSTORE",
    MSTORE8:  "MSTORE8",
    SLOAD:    "SLOAD", //先取出棧頂元素x,然后在storage中取以x為鍵的值(storage[x])存入棧頂
    SSTORE:   "SSTORE", //存儲storage是一個鍵值存儲魂毁,可將256位字映射到256位字
    JUMP:     "JUMP",
    JUMPI:    "JUMPI",
    PC:       "PC",
    MSIZE:    "MSIZE",
    GAS:      "GAS",
    JUMPDEST: "JUMPDEST"

Push指令集

0x60

    // PUSH系列指令把緊跟在指令后面的N(1 ~ 32)字節(jié)元素推入棧頂
    PUSH1:  "PUSH1",
    ...
    PUSH32: "PUSH32",

    //DUP系列指令復(fù)制從棧頂開始數(shù)的第N(1 ~ 16)個元素玻佩,并把復(fù)制后的元素推入棧頂
    DUP1:  "DUP1",
    DUP2:  "DUP2",
    ...
    DUP16: "DUP16",

    //SWAP系列指令把棧頂元素和從棧頂開始數(shù)的第N(1 ~ 16)+ 1 個元素進行交換。
    SWAP1:  "SWAP1",
    ...
    SWAP16: "SWAP16",
    
    LOG0:   "LOG0",
    ...
    LOG4:   "LOG4",

參考

https://mindcarver.cn

https://github.com/blockchainGuide

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末席楚,一起剝皮案震驚了整個濱河市咬崔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖垮斯,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件郎仆,死亡現(xiàn)場離奇詭異,居然都是意外死亡兜蠕,警方通過查閱死者的電腦和手機扰肌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來熊杨,“玉大人狡耻,你說我怎么就攤上這事『锇迹” “怎么了夷狰?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長郊霎。 經(jīng)常有香客問我沼头,道長,這世上最難降的妖魔是什么书劝? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任进倍,我火速辦了婚禮,結(jié)果婚禮上购对,老公的妹妹穿的比我還像新娘猾昆。我一直安慰自己,他們只是感情好骡苞,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布垂蜗。 她就那樣靜靜地躺著,像睡著了一般解幽。 火紅的嫁衣襯著肌膚如雪贴见。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天躲株,我揣著相機與錄音片部,去河邊找鬼。 笑死霜定,一個胖子當(dāng)著我的面吹牛档悠,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播望浩,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辖所,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了曾雕?” 一聲冷哼從身側(cè)響起奴烙,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤助被,失蹤者是張志新(化名)和其女友劉穎剖张,沒想到半個月后切诀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡搔弄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年幅虑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾犹。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡倒庵,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出炫刷,到底是詐尸還是另有隱情擎宝,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布浑玛,位于F島的核電站绍申,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏顾彰。R本人自食惡果不足惜极阅,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望涨享。 院中可真熱鬧筋搏,春花似錦、人聲如沸厕隧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吁讨。三九已至帖族,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間挡爵,已是汗流浹背竖般。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茶鹃,地道東北人涣雕。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像闭翩,于是被迫代替她去往敵國和親挣郭。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容