WebAssembly 二進(jìn)制編碼介紹(九)

WebAssembly 是基于棧式虛擬機(jī)的虛擬二進(jìn)制指令集(V-ISA),它被設(shè)計(jì)為高級編程語言的可移植編譯目標(biāo)。長安鏈?zhǔn)褂玫氖莣asm的二進(jìn)制模塊,我們這里著重分析WebAssembly的二進(jìn)制模塊。WebAssembly的各組件含義及關(guān)聯(lián)關(guān)系需要一段時(shí)間的學(xué)習(xí)來掌握,需要大家自己不斷的研究與琢磨。

WebAssembly的官方介紹: https://www.wasm.com.cn/docs/binary-encoding/

wasm的二進(jìn)制模塊包含11大組件:


二進(jìn)制模塊組件.png

官方文檔中提供解析wasm二進(jìn)制的方式:

  1. magic & version
    magic - uint32 - 0x6d736100
    version - uint32 - 0x1
  2. 根據(jù)不同的sec type 分別解析


    section信息.png
  3. 各section有詳細(xì)字段說明


    section字段描述.png
  4. 在官方文檔描述中,字段類型uint32、int32比較好理解4字節(jié)。但varuintN、varintN并未見過,這是LEB128編碼格式,具體解碼方式可參考下述代碼
func DecodeUint32(r io.Reader) (ret uint32, num uint64, err error) {
    const (
        uint32Mask  uint32 = 1 << 7
        uint32Mask2        = ^uint32Mask
    )

    for shift := 0; shift < 35; shift += 7 {
        b, err := readByteAsUint32(r)
        if err != nil {
            return 0, 0, fmt.Errorf("readByte failed: %w", err)
        }
        num++
        ret |= (b & uint32Mask2) << shift
        if b&uint32Mask == 0 {
            break
        }
    }
    return
}
  1. 我們以長安鏈官方合約(鏡像chainmaker-go-contract:1.1.1中的合約為例)進(jìn)行解析。
5.1)執(zhí)行hexdump main.wasm > main.dump命令以二進(jìn)制形式查看。使用sublime等編輯工具打開。
hex.png
5.2)magic & version

a) 開始00 61 73 6d四個(gè)字節(jié)表示magic,二進(jìn)制使用的是小端方式編碼(大小端的含義還需要自行百度學(xué)習(xí)),實(shí)際為:0x6d736100
b) 隨后01 00 00 00四個(gè)字節(jié)表示version,0x01

5.3)Type Section

該組件定義了函數(shù)的簽名聲明信息,定義函數(shù)的入?yún)ⅰ⒎祷刂祩€(gè)數(shù)及類型。解析如下:

a) 隨后一個(gè)字節(jié)01表示下面的section為Type Section
b) 隨后varuint32類型73一個(gè)字節(jié),表示該section的長度,通常在處理的時(shí)候會(huì)忽略該字段,除非session的id 為0。
c)隨后12表示后面有18個(gè)type要描述(12是16進(jìn)制)。
d) 隨后60作為每個(gè)type的分割符,隨后01表示一個(gè)形參,隨后7f 表示該形參的類型為i32。
e)隨后00表示函數(shù)返回值為0個(gè)。
f)重復(fù)d,e流程,直到遍歷18個(gè)type

5.4)Function Section

該組件包含指向Type Section的Index,F(xiàn)unction Section是數(shù)組結(jié)構(gòu),數(shù)組下標(biāo)與Code Section組件一一對應(yīng),Index表示執(zhí)行Type Section的函數(shù)簽名。

5.5)Code Section

該組件包含函數(shù)具體的實(shí)現(xiàn)邏輯以及本地變量信息,Code Section是一個(gè)數(shù)組,大小與Function Section相對應(yīng)。

5.6)Export Section

該組件描述的是外部可訪問的內(nèi)存、變量、方法等。以方法組件為例,每個(gè)Export Section元素會(huì)關(guān)聯(lián)一個(gè)Index,該Index指向Code Section。當(dāng)外部調(diào)用某method,可以先在export區(qū)找到匹配的method,在通過export的index,找到要執(zhí)行的字節(jié)碼,然后裝載執(zhí)行。

5.7)Data Section

該組件描述對線性的memory進(jìn)行數(shù)據(jù)初始化,組件記錄數(shù)據(jù)信息以及要初始化的位置信息。

5.8)Memory Section

該組件描述程序內(nèi)存塊數(shù)量以及最大、最小值等。

wasm二進(jìn)制執(zhí)行流程可以參照:https://github.com/mathetake/gasm.git,學(xué)習(xí)字節(jié)碼的解析流程。長安鏈基于該開源代碼進(jìn)行bug修復(fù),描述在 chainmaker-go/module/vm/gasm/README.md

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,412評論 6 532
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,514評論 3 416
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,373評論 0 374
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,975評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,743評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,199評論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,262評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,414評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,951評論 1 336
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,780評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,983評論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,527評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,218評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,649評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,889評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,673評論 3 391
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,967評論 2 374

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