---
title: 合约分片中的接收方路由问题
date: '2018-09-04 13:04:14'
draft: false
summary: 普通转账按发送方分片还比较直接，但合约调用会把状态读写带进来，这时如果仍然只按发送方路由，分片之间的合约状态就很容易失去一致性。
slug: zilliqa-contract-sharding-needs-recipient-aware-routing
syndication:
- platform: Weibo
  url: https://weibo.com/1648815335/GxMwMyWfO
tags:
- blockchain
- zilliqa
- sharding
- smart-contract
topics:
- blockchain
type: post
---

今天看到一篇 `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 年第三季度发布。

<!-- WEIBO_MEDIA_START -->
## 原微博中的媒体

![](./weibo-4280513688327084-1.jpg)

![](./weibo-4280513688327084-2.jpg)

![](./weibo-4280513688327084-3.jpg)
<!-- WEIBO_MEDIA_END -->
