Zcash 深度技术分析 - 交易结构

Zcash 深度技术分析 - 交易结构

Reminder: 本系列文章将详细介绍 Zcash 1.0 技术,codebase 是 v2.0.2.

交易结构

Zcash Sprout 的交易类型与 Bitcoin 相比,增加了一个所谓的 Shield Transfer,并把 Bitcoin 风格的转账称为 Transparent Transfer.

transparent transfer

   vin       ->         vout 
old utxo     ->        new utxo 

对应的数据结构是:

const std::vector<CTxIn> vin;   
const std::vector<CTxOut> vout; 

//这就是一个UTXO
//COutPoint   
class COutPoint   
{
      uint256 hash;
      uint32_t n;
};
//CTxIn   
class CTxIn   
{      
      COutPoint prevout;
      ...
};
//CTxOut   
class CTxOut   
{      
      CAmount nValue; //UTXO包含的值
      CScript scriptPubKey;
};  

在 Bitcoin 的转账中,任何人都可以看到 vinvout,也就可以看到转账交易的双方身份(scriptPubKey),以及转账金额(nValue).

shield transfer

为了克服 Bitcoin 转账会泄露隐私的缺点, Zcash 提出了 shield transfer 的概念. 在shield transfer 中,转账涉及的不再是 utxo, 而是 所谓的 note. note 包含足够的所有权信息:

  1. 持有者的公钥 a_pk
  2. 面额: value,
  3. 随机数: rho,
  4. 随机数: r

其思路其实很简单: 既不公开 old note, 也不公开 new note.

但是,这样如何能够防止双花呢?

解决办法是,公开 old note 的一个 commitment(类似于 Monero 中的 key image),commitment 完全绑定 note,对于两个不同的utxo,他们的 commitment 一定不相同. 从 commitment 又无法推测出 其背后的 note. 这在 Zcash spec 文档中被称为 nullifier.

我们公开 new note 的 commmitment.

最终证明(in a zk way) :

  • old note 存在 (包含证明, merkle proof)
  • nullifier 确实是由 old note 计算得到;
  • sum(values in old notes) = sum(values in new notes)
  • 知道 old note 的私钥, i.e. PK(a_sk) == a_pk
  • new note 的 commitment 确实是按照协议规则计算得到的;

Shield transfer 需要公开的信息有:

  • nullifiers
  • commitments of new notes
  • macs (防止零知识证明被复用)
  • old note 所在的 merkle tree 的树根 root
  • new notes 的密文(使用 ECDH, ed25519曲线 来共享一个密钥,用于 加密 new notes)
// src/zcash/Zcash.h 
#define ZC_NUM_JS_INPUTS 2
#define ZC_NUM_JS_OUTPUTS 2

// src/primitives/transaction.h
class JSDescription   
{      
     uint256 anchor;
     std::array<uint256, ZC_NUM_JS_INPUTS> nullifiers;
     std::array<uint256, ZC_NUM_JS_OUTPUTS> commitments;
     std::array<uin256, ZC_NUM_JS_INPUTS> macs;

     uint256 ephemeralKey;
     std::array<ZCNoteEncryption::Ciphertext, ZC_NUM_JS_OUTPUTS> ciphertexts;

     uint256 randomSeed;

     libzcash::SproutProof proof; //重点:零知识证明
};


相关阅读

  • Paige Peterson, Anatomy of A Zcash Transaaction, Nov. 23, 2016.
Anatomy of A Zcash Transaction - Zcashz.cash图标

编辑于 2019-08-08

文章被以下专栏收录