【開發智能合約 - Solidity系列】概念篇: 關於虛擬沙盒Ethereum Virtual Machine(EVM)
基本概念
每個產品在實驗室研發出來後,勢必會面臨到賣給客戶的階段,那麼當我們將產品移交給客戶時,意味著也要進行環境的安裝,但問題來了,每一個客戶的環境差異甚大,總不可能為了A客戶就建立一個A客戶的環境,因應B客戶就建立B客戶的環境,這樣隨著產品的銷售量增長也將連帶耗盡公司的資源,想必這不是我們所樂見的現象,當然在最理想的狀況下只要能夠一個封閉的環境,將系統中的所有組件逐一打包成一個可執行的「虛擬環境檔」,而我們帶到客戶端的部分只有這一包「虛擬環境檔」,安裝後,所有環境都封閉在虛擬環境之中,客戶外部系統不論如何異動都不會去影響到產品的運作,想必聽到這裡,大家心裡應該都浮現了幾個重要名詞,VM、Docker、Virtual Box…,這類的產品就是在實現這樣的夢想,但區塊鏈呢?
沒錯,區塊鏈也是有一套虛擬機的設計機制,區塊鏈的最重要特性莫過於不可竄改的特性,執行結果理應也是可靠的,而且也不應該開發一份智能合約之後去影響到區塊鏈上的千千萬萬個智能合約,因此才會有Ethereum Virtual Machine(EVM)的產生,開發者只要專注於開發智能合約,不需要去擔心環境問題,這樣的隔離方式才能夠讓整個區塊鏈更加健康、安全,這也就是Ethereum Virtual Machine(EVM)為什麼需要存在的最大原因。
以程式語言來說,就好比Java的JVM一樣,程式轉譯成Byte Code並執行於JVM環境之中,而作業系統只要能夠運行JVM即可,而且環境獨立封閉,基本上不會受到外部的干擾。
關鍵的ByteCode
由於Ethereum Virtual Machine(EVM)所認定的程式碼是ByteCode這種較低階的語言,因此人類不容易閱讀,通常也不會有人直接去寫ByteCode,因此才發展出高階語言Solidity,讓開發更平易近人,以易讀的語言來進行設計,最後再轉譯成ByteCode讓Ethereum Virtual Machine(EVM)讀取並執行。
來一段ByteCode的範例,第一眼看到的反應大部分應該會是「天啊!這什麼文字天書」,相信看到就不會想玩智能合約了!
================================================
PUSH1 0x00 CALLDATALOAD
PUSH1 0x00
SSTORE
================================================
再來看看Solidity這套程式語言的範例,相對平易近人又容易讀取:
================================================
// Pay salary
function pay() public view returns (uint) {
return salary;
}
================================================
也由於這種高階語言的出現,讓市面上的許多智能合約應用如雨後春筍般的出現。
重要功能
● 容易測試: 為了確保各式各樣的智能合約能夠順利執行,必須讓環境一致,而環境統一的狀況下,開發者只要專注於程式碼的開發並測試邏輯的正確與否,因此不容易因為外部系統改A壞B的狀況產生。
● 安全性: 由於沙盒的概念,因此程式碼都執行於封閉的盒子中,不會隨意的攻擊主鏈,導致鏈上的其他智能合約無法正常運作。
● 穩定性: 由於環境封閉獨立,不會因為某個合約故障導致整個鏈上資源鎖死,因此對故障的容忍度較高。
實際動動手來編譯一下智能合約
我們可以使用browser-solc套線上編譯工具,讓撰寫好的智能合約編譯成Bytecode,而這些Bytecode就是EVM能夠讀得懂的語言,雖然一層的轉譯會受到一些效能的挑戰,但安全、隔離的環境相信帶來的好處更甚,因此也是為什麼會有一層EVM的主因吧!
結語
沒有仔細了解區塊鏈的相關技術之前都覺得怎麼可能去開發這麼複雜的技術,一步步探究之後才發現事實上與我們傳統的開發核心理念相差不遠,大部分技術與概念都是互相連通的,因此我們在接觸新技術之前不要去排斥,並試著學習跟動手,將知識技術烙印在腦海中才能持續進步。
-------------------------------------------------------------------------------
喜歡撰寫文章的你,不妨來了解一下:
Web3.0時代下為創作者、閱讀者打造的專屬共贏平台 - 為什麼要加入?
歡迎加入一起練習寫作,賺取知識,累積財富!