solidity 智能合約編譯成wasm 和wast

摘要

1、用solc 將solidity 代碼編譯成evm 字節(jié)碼
2多艇、用evm2wasm 將evm 轉(zhuǎn)化成wasm和wast 格式

準(zhǔn)備開發(fā)環(huán)境

1、安裝solidity

mac 上通過brew 安裝

$ brew install solidity

或者參照安裝教程
https://solidity.readthedocs.io/en/latest/installing-solidity.html#building-from-source

然后命令行輸入

$ solc --version

如果安裝成功會(huì)打印出來solc版本號(hào)

note:如果實(shí)在不愿意用命令行工具,也可以考慮使用在線編輯器https://remix.ethereum.org/

2醉者、安裝evm2wasm

首先確保已經(jīng)安裝nodejs,然后下載源碼 https://github.com/ewasm/evm2wasm
clone下來后披诗,先修改根目錄下的package.json 文件

"wabt": "^1.0.0"

改為

"wabt": "1.0.0"

然后撬即,在根目錄輸入

$ npm install

下載依賴庫可能會(huì)比較慢,可執(zhí)行js文件是 bin/evm2wasm.js

正式開工

1呈队、solc 編譯solidity 智能合約

創(chuàng)建一個(gè)solidity智能合約hello.sol剥槐,文件內(nèi)容如下

pragma solidity ^0.5.4;

contract HelloWorld {
  function helloWorld() external pure returns (string memory) {
    return "Hello, World!";
  }
}

在hello.sol 所在目錄輸入編譯命令

$ solc --bin hello.sol -o hello

輸出文件HelloWorld.bin 位于hello 目錄下,將它重命名宪摧,以方便后續(xù)操作粒竖。可以看到輸出文件內(nèi)容是hex 格式的evm字節(jié)碼几于。

$ mv hello/HelloWorld.bin hello.evm
$ cat hello.evm
 608060405234801561001057600080fd5b50610139806100206000396000f3fe6080604052348 
 01561001057600080fd5b5060043610610048576000357c01000000000000000000000000000 
 0000000000000000000000000000090048063c605f76c1461004d575b600080fd5b6100556100 
 d0565b604051808060200182810382528381815181526020019150805190602001908083836 
 0005b8381101561009557808201518184015260208101905061007a565b5050505090509081 
 0190601f1680156100c25780820380516001836020036101000a031916815260200191505b50 
 9250505060405180910390f35b60606040805190810160405280600d81526020017f48656c6c6 
 f2c20576f726c64210000000000000000000000000000000000000081525090509056fea16562 
 7a7a72305820fd3ae219ac96e3ff3152d3d6afc304cec55cc9685c2ecfa46f05e9dc69bafd6e0029  

solc 這個(gè)工具功能很強(qiáng)大蕊苗,忍不住想嘗試一下獲取智能合約abi 的功能,雖然在下文中并沒有卵用沿彭。

$ solc --abi hello.sol

======= hello.sol:HelloWorld =======
Contract JSON ABI 
 [{"constant":true,"inputs":[],"name":"helloWorld","outputs": 
 [{"name":"","type":"string"}],"payable":false,"stateMutability":"pure","type":"function"}]

2朽砰、evm2wasm 轉(zhuǎn)換成wasm

由于 bin/evm2wasm.js 這個(gè)工具只支持二進(jìn)制格式的evm字節(jié)碼,所以需要對(duì)它進(jìn)行一點(diǎn)兒改造喉刘,使之可以接受hex 格式的輸入瞧柔。

bytecode = Buffer.from(bytecode, 'hex')

只需要把上述代碼下邊添加一行代碼即可。

bytecode = Buffer.from(bytecode, 'hex')
bytecode = Buffer.from(bytecode.toString(), 'hex')

接下來執(zhí)行命令把wast 格式轉(zhuǎn)換成wasm 格式睦裳,前面的絕對(duì)路徑請(qǐng)自行修改T旃!廉邑!

/Users/ff/dev/install/evm2wasm-master/bin/evm2wasm.js -e hello.evm -o hello.wasm

用十六進(jìn)制編輯器打開生成的wasm 文件哥蔚。

 0061736D 01000000 01080260 017E0060 00000213 01086574 68657265 756D0675  
 73654761 73000003 02010105 040100F4 03062106 7F014100 0B7F0141 600B7F01  
 41000B7F 0041A888 020B7E01 42000B7E 0142000B 07110206 6D656D6F 72790200  
 046D6169 6E00010A 37013501 027F417F 21000240 03400240 23024504 40410124  
 020C0105 23004100 46044000 05230021 01410024 0020010E 00020B0B 0B0B0B0B  

3、evm2wasm 轉(zhuǎn)換成wast

命令與轉(zhuǎn)換成wasm 類似鬓催,前面的絕對(duì)路徑請(qǐng)自行修改7嗡亍!宇驾!

/Users/ff/dev/install/evm2wasm-master/bin/evm2wasm.js -e hello.evm -o hello.wast --wast

這是生成的wast 文件倍靡。

$ cat hello.wast 

(module
  (import "ethereum" "useGas" (func $useGas (param i64)))
  (global $cb_dest (mut i32) (i32.const 0))
  (global $sp (mut i32) (i32.const -32))
  (global $init (mut i32) (i32.const 0))

  ;; memory related global
  (global $memstart i32  (i32.const 33832))
  ;; the number of 256 words stored in memory
  (global $wordCount (mut i64) (i64.const 0))
  ;; what was charged for the last memory allocation
  (global $prevMemCost (mut i64) (i64.const 0))

  ;; TODO: memory should only be 1, but can't resize right now
  (memory 500)
  (export "memory" (memory 0))

  

  
  (func $main
    (export "main")
    (local $jump_dest i32) (local $jump_map_switch i32)
    (set_local $jump_dest (i32.const -1))

    (block $done
      (loop $loop
        
  (block $0 
    (if
      (i32.eqz (get_global $init))
      (then
        (set_global $init (i32.const 1))
        (br $0))
      (else
        ;; the callback dest can never be in the first block
        (if (i32.eq (get_global $cb_dest) (i32.const 0)) 
          (then
            (unreachable)
          )
          (else 
            ;; return callback destination and zero out $cb_dest 
            (set_local $jump_map_switch (get_global $cb_dest))
            (set_global $cb_dest (i32.const 0))
            (br_table $0  (get_local $jump_map_switch))
          ))))))))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市课舍,隨后出現(xiàn)的幾起案子塌西,更是在濱河造成了極大的恐慌他挎,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捡需,死亡現(xiàn)場(chǎng)離奇詭異办桨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)站辉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門呢撞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饰剥,你說我怎么就攤上這事殊霞。” “怎么了汰蓉?”我有些...
    開封第一講書人閱讀 156,674評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵绷蹲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我顾孽,道長(zhǎng)祝钢,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評(píng)論 1 283
  • 正文 為了忘掉前任若厚,我火速辦了婚禮拦英,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘盹沈。我一直安慰自己龄章,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,404評(píng)論 5 384
  • 文/花漫 我一把揭開白布乞封。 她就那樣靜靜地躺著,像睡著了一般岗憋。 火紅的嫁衣襯著肌膚如雪肃晚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,749評(píng)論 1 289
  • 那天仔戈,我揣著相機(jī)與錄音关串,去河邊找鬼。 笑死监徘,一個(gè)胖子當(dāng)著我的面吹牛晋修,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凰盔,決...
    沈念sama閱讀 38,902評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼户敬!你這毒婦竟也來了睁本?” 一聲冷哼從身側(cè)響起呢堰,我...
    開封第一講書人閱讀 37,662評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤枉疼,失蹤者是張志新(化名)和其女友劉穎鞋拟,沒想到半個(gè)月后严卖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,110評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡来颤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年福铅,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了滑黔。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,577評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖汛兜,靈堂內(nèi)的尸體忽然破棺而出通今,到底是詐尸還是另有隱情,我是刑警寧澤漏策,帶...
    沈念sama閱讀 34,258評(píng)論 4 328
  • 正文 年R本政府宣布掺喻,位于F島的核電站巢寡,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏树叽。R本人自食惡果不足惜谦絮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,848評(píng)論 3 312
  • 文/蒙蒙 一层皱、第九天 我趴在偏房一處隱蔽的房頂上張望叫胖。 院中可真熱鬧,春花似錦怎棱、人聲如沸绷跑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垦藏。三九已至掂骏,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背袜爪。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工辛馆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昙篙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,271評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像焚辅,于是被迫代替她去往敵國(guó)和親同蜻。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,452評(píng)論 2 348

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