Ethereum devcon4: part2

Swarm

在Devcon4的前一天去参加了Swarm的一个专场,他们和Ethereum magicians共同在Smichov的National House组织的一个mini-summit,在大会之前的这些暖场活动都是Status赞助或组织的,Status也在那几天组织过一个黑客马拉松。

Swarm是以太坊生态重要的基础服务。在Gavin和Vitalik早先构想的Web3的技术栈底层: 由以太坊的智能合约实现去中心化的运行逻辑;Swarm提供去中心化的存储;Whisper则提供去中心化的消息服务。但这几年的发展进度不那么乐观,IPFS的势头也盖过了Swarm。

《Data Structures on Swarm》

《Deep SQL and NoSQL Blockchains for Provable Database Storage》
这个是 Wolk 的演讲,Wolk 是基于SWARM的去中心数据库服务平台。他们属于Layer3,锚定的Layer2 是Plasma Cash并提供Provable Storage。

另外的几个分享有《Cooperative protocol evolution with virtualization layers》《Privacy & Access Control 》《Observability in Swarm》 这个相对简单,主要是讲swarm的tracing机制,同一般互联网公司的分布式链路跟踪系统。

《Building Unstoppable Chat》
这个是 mainframe的CTO做的一个演讲,他为了增加大家对他的记忆,穿了一个独角兽的衣服,带着Vitalik的面具来做的演讲,博得了不少眼球。利用 Swarm 的 Mutable Resource (swarm feeds) 的能力,实现了一个区中心化的不可阻挡的(unstoppable)聊天工具。但跟现实中的IM比起来,聊天的过程还是明显偏慢。

《Swarm feeds》这是一个非常有趣的演讲,feeds在之前被称为 "Mutable Resource Updates" (可变资源更新) 它可以当作一个 KV store甚至microblogging platform,可以对某个话题发帖,订阅其他人的更新。
有这种基础设置之后,可以创造出各种不同的应用。甚至可以跟IoT结合,现场演示了一个气温检测的例子。

在第二天Devcon的第一天大会上Swarm团队也去做了状态汇报,项目负责人Viktor Tron在最后汇报了一下整体情况和后续工作。他似乎受过很重的腰伤,走路有明显的问题,站着的时候身体也有些发抖。

Whisper

Whisper在最近一年发布了v6,后续还有很多事情要做。

Ethereum 2.0

Vitalik的分享ethfans已经做过翻译,参考Devcon4 | ETH 2.0 in 30 minutes,Part-1:回顾Devcon4 | ETH 2.0 in 30 minutes,Part-2:展望

Prysmatic Labs分享了sharding的一些实现过程。Prysm是他们用go实现的Ethereum 2.0 client,使用的技术栈提到了bazel, grpc, libp2p, boltdb等

Ethereum 2.0没有给出具体的日期,VDF芯片的开发可能就要18个月;Sharding有7个阶段,现在还处于phase0或phase1阶段?

  • Phase 0: PoS beacon chain without shards
  • Phase 1: Basic sharding without EVM
  • Phase 2: EVM state transition function
  • Phase 3: Light client state protocol
  • Phase 4: Cross-shard transactions: see here and more.
  • Phase 5: Tight coupling with main chain security: here and more.
  • Phase 6: Super-quadratic or exponential sharding

Vlad对2.0里的PoS共识 Casper CBC做了分享,很难理解。

Libp2p也有分享,可以参考ethfans的这篇:Serenity 中的 P2P 网络

客户端&库

ConsenSys下的PegaSys推出了企业级的 Pantheon客户端,用Java实现,后续将增加iBFT共识(i是istanbul的缩写,BFT的一个变种,企业私有链采用的一种共识)。

Slock.it的incubed客户端,用于Slock.it的物联网设备的服务器节点网络

Turbo-Geth 对 Geth的优化。

web3j 4.0 的一些特性,大会演讲ppt的时候还未发布,这几天刚刚发布。

ethereumjs也演示了ethereumjs-client

基础设施&运维

AirSwap 讲了他们在亚马逊上节点运维的一些经验,云硬盘有支持Burst特性

  • Magnetic / spinning disk drives don't work – you are I/O bound
  • provisioned IOPS doesn't work due over allocation of IOPS – costs too much
  • Burst-based IOPS requires 3TB drives and cap at 10000 IOPS
  • EFS network overhead is too slow
  • NVMe drives WORK PERFECTLY

还有一个workshop是基于k8s搭建基础设置的。

其他

这是一个关于避免交易被 front-running 的技巧,是基于这篇To Sink Frontrunners, Send in the Submarines,它基于EIP-86里的CREATE2操作码,目前还未被采用。

AvalancheLabs的Emin Gün Sirer(Emin是康奈尔大学的教授,Avalanche字面意思是雪崩的意思,可以参考 Snowflake to Avalanche:一种新型的亚稳态共识协议族)分享了Pos的例子。他提到硬件也是一种特殊的权益(hardware is just a specialized kind of stake),在指出pow的各种问题时还调侃了一下JihanWu。

大会也有一个专门讨论安全的topic,里面有不少关于隐私、零知识证明方面的讨论。

Ethereum devcon4: part1

编程语言与工具

Solidity

那天主会场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之前也被称为JuliaIulia是为了编译到各种不同后端而设计的中间语言,各类合约语言都先编译为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加快发展。我们也在密切关注这个方向的技术进展。