Ethereum devcon4: part1
程式語言與工具
Solidity
那天主會場 ofollow,noindex" target="_blank">Erik Kundt 分享了Solidity的最新狀況,對0.5.0的新特性做了一些介紹。在寫這篇總結時solidity0.5.0也終於釋出了: https://github.com/ethereum/solidity/releases/tag/v0.5.0
當時Solidity的核心團隊幾個人也都在現場,回答聽眾提問的時候看到solidity專案負責人 Christian Reitwiessner 在臺下做了回覆。
對於0.5.0新特性主要圍繞下面幾點:
- Explicit types
- Explicit visibility
- Explicit data locations
- Scoping rules for function local variables
- New constructor syntax
- emit for events
- address payable
總體而言就是更加嚴格了,增加了更多約束,讓編譯器能提前發現問題。這些例子我沒有一一記錄,感興趣的話等youtube上視訊出來了大家可以再去看一下視訊。
函式的可見性變成了強制的,如下幾個function的可見性修飾符是必須的:
contract Test{ address owner; function Test() public { initialize(); } function initialize() internal { owner = msg.sender; } function withdraw() public { //... } }
實際上在0.4.24版本下對於可見性修飾符已經給出編譯時警告了,對建構函式也建議使用 constructor
替代跟合約同名的函數了,只不過不是強制。
在0.5.0版本里 var
已經不再允許使用,因為它可能在型別推導時產生問題。在0.4版本里它不需要 SMTChecker
編譯器就已給出warning了:
➜cat a.sol pragma solidity ^0.4.24; contract C { function f() public pure returns (uint) { for ( var i = 0; i < 2000; i++) { //... } } } ➜solc a.sol a.sol:6:11: Warning: Use of the "var" keyword is deprecated. for ( var i = 0; i < 2000; i++) { ^---^ a.sol:6:11: Warning: The type of this variable was inferred as uint8, which can hold values between 0 and 255. This is probably not desired. Use an explicit type to silence this warning. for ( var i = 0; i < 2000; i++) { ^-------^
但對這個例子稍作改變,不使用 var
而是現實的型別宣告,但在型別值邊界存在判斷問題的話就必須通過 SMTChecker
才能發現了:
➜cat b.sol pragma solidity ^0.4.24; pragma experimental SMTChecker; contract C { function f() public pure returns (uint) { for ( uint i = 200; i >= 0; i--) { //... } } } ➜solc b.sol b.sol:7:25: Warning: For loop condition is always true. for ( uint i = 200; i >=0; i--) { ^---^ b.sol:7:32: Warning: Underflow (resulting value less than 0) happens here for: value = (- 1) i = 0 for ( uint i = 200; i >=0; i--) { ^-^
對於儲存引用必須初始化。
Yul
之前也被稱為 Julia
或 Iulia
是為了編譯到各種不同後端而設計的中間語言,各類合約語言都先編譯為Yul,這樣不管後端是EVM還是eWASM都能很平滑。為Yul構建高階的優化器階段也將會很容易。Yul作為通用的中間語言,本身不提供操作符,如果目標平臺是EVM則操作碼將作為內建函式提供,如果後端平臺發生了變化可以重新實現它們。參看它的 文件 。
SMTChecker
在第二天有一個專門介紹 SMTChecker
的小會場,看一個例子:
➜cat c.sol pragma solidity ^0.4.24; pragma experimental SMTChecker; contract C { uint c; function f(uint x) public pure returns (uint) { return x * 42; } function g(uint a, uint b) public view { require(a >= b); require(b >= c); assert(f(a) >= f(c)); } }
上面的例子如果不使用 SMTChecker
編譯過程不會給出任何警告,開啟後則會看到詳細的警告:
➜solc c.sol c.sol:8:12: Warning: Overflow (resulting value larger than 0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff) happens here for: value = 0x01000000000000000000000000000000000000000000000000000000000000001a x = 0x0618618618618618618618618618618618618618618618618618618618618619 c = 0 return x * 42; ^----^ c.sol:14:12: Warning: Internal error: Expression undefined for SMT solver. assert(f(a) >= f(c)); ^--^ c.sol:14:20: Warning: Internal error: Expression undefined for SMT solver. assert(f(a) >= f(c)); ^--^ c.sol:14:5: Warning: Assertion violation happens here for: a = 0 b = 0 c = 0 assert(f(a) >= f(c)); ^------------------^
SMTChecker最大優勢是Solidity編譯器直接集成了它。
AxLang
Athanasios Konstantinidis分享了Axoni公司的 AxLang 語言。它是一門基於Scala的帶有形式化驗證的智慧合約語言,將scala語法樹轉換為中間語言,做健壯性分析和優化,然後再編譯到後端EVM。我之前沒有聽說過,這家公司好像主要是面向金融領域。他們在devcon4的視訊有人貼在了 這裡 ,感興趣可以自己去看。
S-gram
S-gram是一個用於智慧合約的Statistical Linter,這個topic是由清華大學的劉浛分享的。會後我們交流了一下,他當前在清華讀博士後,主要方向在系統和安全領域。
Formality
Formality 是一門新的函式式、無垃圾回收、面向EVM和GPU的形式驗證語言,號稱很快。因為給自己貼的標籤太多,對他們的發展和進度不是很樂觀。
ZeppelinOS
ZepplinOS 團隊分享了一些合約開發的實用技巧,對於合約的升級問題可以借鑑。
其他
有一家名叫 trail of bits 的安全公司做了一個《區塊鏈的驗屍報告:selfdestructs分析》的分享,視角比較獨特,他們在devcon4上有好幾個安全相關的分享,感興趣可以去找找他們的 ppt 。
Vyper 語言的開發者也有做一個分享,這個python風格的合約語言似乎歡迎度挺高,不過沒有去這個會場,無法給出太多的資訊。
面向合約的程式語言這幾年百花齊放,畢竟還未形成一家獨大的局面。另外之前看到devcon1上有一個《Monadic Design Patterns for the Blockchain》的分享也很有趣,可以在youtube上找到。
狀態通道與Layer2
在devcon4的前一天晚上,Nervos在一家支付比特幣的酒吧裡組織過一個Layer2的聚會,參與的人也很多,其中有不少是投資人。
因為時差那天晚上沒怎麼聽進去,celer的董沫主持,Jan做了一個簡單的分享,介紹了Nervos是專為Layer2設計的 Layer1。在到布拉格之前從杭州到上海的大巴里碰到過Jan,當時簡單聊過一些Nervos;他們設計的很獨特,Layer1做的事情比較少,鼓勵使用者把計算放到Layer2上去;在Layer1的儲存總量是有上限的,通過經濟模型來調節在Layer1上的儲存使用成本;共識方面仍採用POW,資料採用UTXO模型。
當時坐在我傍邊的是loom network的開發者,一邊很快捷的在tmux下敲打命令,一邊去github他們的產品issue下回答問題。我去查了一下才知道loom是一套正式上線的以太坊第2層擴充套件解決方案。是一個DPoS側鏈網路,允許高度可擴充套件的遊戲和麵向用戶的 DApp 在其之上執行,同時仍然受到以太坊的安全支援。似乎在遊戲領域很有名,在medium上有一箇中文的部落格:https://medium.com/@loomnetworkcn
引用節點研究中心蔡晨曦的 這篇關於狀態通道的分析 裡對各個專案方的一個介紹。基本上這次devcon4這些狀態通道的專案方都來了,看得出是Layer2是當下尋求突破的共識,專案方們也都在相互追趕發力,不排除在可預期的時間內會有不錯的效果。
SpankChain
SpankChain的幾個人都染著紅頭髮,很容易辨識他們。講了他們被黑客攻擊的過程,以及怎麼又把錢給要了回來。支付通道這塊主要是與Connext合作的,在後續計劃裡SpankChain打算整合Gnosis的多重簽名錢包。
Perun
在波蘭語裡Perun是閃電之神,專案方是個學院派背景。他們的主要技術是虛擬通道(virtual channels)採用證明驅動(proof-driven)的方式實現。Virtual channels在Ledger state channels(一種雙向支付通道)基礎之上,在中心輻射(hub-and-spoke)拓撲下對兩個節點(spoke)之間建立一個虛擬通道使得它們之間可以不依賴中心節點(hub)而進行交易。相對於Ledger state channel在建立和關閉的時候都在鏈上執行,只有在執行的時候在鏈下,virtual state channel這三個階段都在鏈下執行。
FunFair
FunFair是面向博彩遊戲的,他們在狀態通道的基礎上整合了隨機數生成器。他們稱之為“命運通道”(Fate Channels),“命運通道”的證明機制可以逐步生成一個確定的且不可預測的隨機數序列。更多資訊可以通過他們的白皮書瞭解。
Celer
在Celer的 主頁 上引用阿西莫夫的解釋,celeritas是拉丁文速度的意思。Celer是分層架構最底層是通道(cChannel),中間是路由層(cRouter),上層是面向應用(cOS)。團隊的背景比較豪華,核心成員基本都是名校博士,有博弈論和系統架構方面的工程背景。看到他們在路由層做了很多的事情,正是他們擅長的領域。在經濟激勵設計上,一方面是對流動性的激勵,設計了多種激勵模式(包含Proof of Liquidity Commitment和Liquidity Backing Auction);另一方面是對狀態守護(State Guardian)提供激勵,這也是Layer2普遍採用的機制,讓參與方參與檢查或校驗來獲取激勵。在會場碰到了Celer的co-founder 李小舟 ,簡單交流了一下。上週Celer團隊來杭州時董沫和其他團隊成員也過來給我們做了一個分享。
其他
光環最顯著的plasma專案,因為時間衝突這次沒有去聽,loom也有個基於plasma cash的分享。當前二層網路是亟待突破的一個階段,大家都在為產品的使用者體驗尋求突破,這也成了整個生態當下最顯著的痛點,逼迫著Layer2加快發展。我們也在密切關注這個方向的技術進展。