午夜咖啡午夜咖啡

jolestar 的文章与笔记。

Post

合约分片中的接收方路由问题

2018-09-04 13:04:14Post

普通转账按发送方分片还比较直接,但合约调用会把状态读写带进来,这时如果仍然只按发送方路由,分片之间的合约状态就很容易失去一致性。

今天看到一篇 Zilliqa 关于智能合约分片的文章:《Provisioning Sharding for Smart Contracts: A Design for Zilliqa》。上次分片侧链研讨会里,大家其实也碰到过同一个问题。

Zilliqa 的分片只是网络和交易分片,并没有做状态分片,理论上要更容易实现一些(相比于以太坊的状态分片),但当分片遇到智能合约的时候就复杂了。

比如 A 转账给 B,可以按 A 的地址的后几个字节分配分片,保证同一个发送者发出的交易都由同一个分片处理,这样就可以避免双花。

但智能合约需要维护内部状态,比如 A 和 B 都给合约地址 C 转账,按发送者地址可能分配到不同的分片上去,执行后合约在不同分片的内部状态就不一致了。所以这种情况下也需要考虑接收方的地址。

所以 Zilliqa 把交易分成了几类(图 1):

  1. 用户之间的转账
  2. 用户给合约转账,但合约不再产生其他调用
  3. 用户给合约转账,合约又调用其他合约

Zilliqa 针对不同交易类型做了不同的分配策略(图 2)。简单概括就是:如果发送方和接收方地址的后几个字节相同,可以分到同一个分片,就由该分片处理;否则就交给全局的 DS committee 处理。

当然这种方式 DS 处理的交易会有点多,所以可以进一步做一个优化(图3)。第一类的交易可以按发送方地址分片,第二,三类的交易则按上面的规则。

按照 Zilliqa 公布的计划,合约分片将在 18 年第三季度发布。

原微博中的媒体