一文读懂以太坊最新二层隐私技术Zkopru,实现ETH、ERC20和ERC721原子互换 | BTC

 91y游戏中心在线     |      2020-09-10

7月20日,Ethereum 9¾ 创首人 Wanseob Lim在太坊技术论坛 ethresear.ch上正式发布了Zkopru,这是一栽二层(Layer 2)幼我营业扩容解决方案,同时行使了zk-SNARK和Optimistic rollup技术。 它能够以很矮的成本声援ETH,ERC20,ERC721代币在二层网络内进走幼我迁移和原子交换。 此外,借助预支款功能,用户能够在营业确认之前从二层挑取资产。 专门起劲分享以太坊二层隐私技术Zkopru的实现。 从往年11月最先,吾和@barryWhiteHat最先构建此项现在,现在效果如下。

  Zkopru是什么?   它是一栽二层(layer 2)幼我营业解决方案。 它行使了Optimistic rollup技术来管理区块。 它行使了zk SNARK技术来创建幼我营业 性能   在以太坊网络上实现每笔幼我营业成本仅8000gas。 当gas节制为1195万且区块时间为13.2秒时,最大TPS为105 亮点功能   声援ETH、ERC20、甚至ERC721 声援幼我原子互换。能够与幼我订单匹配系同一首行使。 Subtree rollup将成本裁减为merkle树形的20分之1 在区块最后确认之进展走迅速挑款 行使大量存款和大量迁移,吾们能够构建一个第2层间网络。 而且,最主要的是,它现在已经起师长产区块! 迎接在吾们的测试网上试用:https://zkopru.network

  介绍  

Zkopru是一栽二层(Layer 2)幼我营业扩容解决方案,同时行使了zk-SNARK和Optimistic rollup技术。 它能够以很矮的成本声援ETH,ERC20,ERC721代币在二层网络内进走幼我迁移和原子交换。 此外,借助预支款功能,用户能够在营业确认之前从二层挑取资产。

营业

zk营业能够批准众个UTXO行为其流入(inflow),并为其流出(outflow)创建新的UTXO。 因此,最主要的是验证流入和流出。

7d555c11d3ac74c4a0db6106b16f805428556127_2_1050x1000

流入验证

Zkopru行使准许清除器方案实现隐私。 这意味着zk营业消耗了UTXO,而异国泄漏已行使了哪个票据。 取而代之的是,吾们展现了源自UTXO的无效符,但无法与其原首UTXO链接。

要行使UTXO,必须已足以下条件: UTXO表明 tx构建器会挑交每个UTXO的Merkle表明以表明其存在。 为了进走有效的SNARK计算,UTXO树行使Poseidon行为其哈希函数。 一切权表明 只有一切者才能够行使UTXO。 在这栽情况下,每个note都有一个公钥字段,即一个Babyjubjub点。 行使配对的私钥,一切者能够创建EdDSA签名以表明其一切权。 commitment表明 该回路答具有相关输入UTXO的详细新闻,以计算流入的总和。 因此,一切者答挑供详细新闻,其Poseidon哈希值答等于Merkle表明和一切权表明的leef哈希值。 Nullifier表明 给定的Nullifier能够从输入的UTXO切确得出。

流出验证

zk营业能够创建三栽类型的输出:UTXO,取款(Withdrawal)和迁移(Migration)。 倘若zk事务创建了UTXO,则Zkopru将它们附添到UTXO树中。 创建挑款输出时,Zkopru会将它们附添到挑款树中。 末了,行为二层区块一片面的大周围迁移(mass migration),包括该区块每个zk营业的迁移输出。

因此,流出(outflow)答已足以下条件: 当输出为UTXO类型时,输出的公共哈希值等于在SNARK回路中计算出的值。 倘若输出的类型是挑款或迁移,则答表现详细新闻,由于它将切确数目的资产移至网络外部。 零和表明(zero-sum proof)

末了,zk营业答保证流入等于流出,包括手续费。

  区块结构  

7ca5c3fb18baa85ea1c4b1f5d9042ba9207103e8_2_1128x1000

区块头(header)

数据的前372个字节答为区块头(header)。 区块头包含以下数据:  WX20200720-172127@2x 区块体(block body)

区块主体由营业,大量存款和大周围迁移构成。 此外,区块头答包含来自区块体的正相新闻。 倘若区块头的值不切确,挑出者将议定质询编制被裁减。

营业

d592b30cb05b28ecf9628c96d0ff97aeab30ba3e_2_852x750

大量存款

fbab0542d90ce861f07565468aa53ddd5075f4c0

大周围迁移(mass migration)

787be20995fd6d83af417450d2907434d15e1ed5

账户

Zkopru将挑出了一栽新的公共密钥结构。 仔细此规范异日将进走更新。

Zkopru帐户管理着1层和2层密钥对。 最先,该帐户具有一个以随机手段生成的私钥的以太坊帐户。 这用于1层上的交互。 其次,Zkopru钱包从以太坊帐户的私钥中创建一个Babyjubjub私钥和公钥集。 此Babyjubjub密钥集用于二层的EdDSA和添密的备注字段。

WX20200720-171800@2x

UTXO

很快会挑出一栽新的UTXO规范

WX20200720-171728@2x

Zkopru行使Poseidon哈希计算leaf哈希:

var intermediate_hash = poseidon(ether, pub_key.x, pub_key.y, salt)

var result_hash = poseidon(intemediate_hash, token_address, erc20, nft)

  授与者如何清新?  

zk营业能够为授与者包括81个字节的添密备注字段。 由于具有零知识特性,倘若异国交互过程,授与者也无法清新怎么授与。 因此,为了保持非交互手段,吾们能够在批准者的备注字段中放入一些添密的数据。

 

添密(encryption)

 

行使Diffie-Hellman密钥交换制定生成共享密钥。 为发送者生成共享密钥的详细步骤为:

1. 创建一个一时密钥及其同态暗藏值:

ephemeral=epublic_ephemeral=ge

2. 将其一时密钥乘以授与者的公共密钥:

recipient_pubkey=gashared_key=(ga)e

3. 准备对压缩数据进走添密:

data = {

salt // 16 byte

tokenId, // 1 byte

value, // 32 byte

}

4.行使chacha20算法对数据进走添密,并行使一时公共密钥创建备忘录数据:

ephemeral = random.new()

public_ephemeral = generator.multiply(ephemeral)

shared_key = recipient_jubjub.multiply(ephemeral)

ciphertext = chacha20.encrypt(data, shared_key)

memo = public_ephemeral + ciphertext

 

解密(decryption)

 

行使Diffie-Hellman密钥交换制定,授与者还行使公共一时密钥和私有密钥创建共享密钥。

1. 解析备注(memo)并获取共享密钥:

public_ephemeral, ciphertext = parse(memo)

shared_key = public_ephemeral.multiply(private_key)

2. 行使共享密钥解密ciphertext:

decrypted = ciphertext.decrypt(shared_key)

3. 授与者行使解密效果尝试生成各栽能够的UTXO。 这是由于添密的数据只有49个字节以最幼化调用数据(calldata)的大幼。 因此,授与者答尝试各栽组相符以检查营业是否包括被恢复的UTXO哈希。 倘若未能在TX中找到已恢复的UTXO,则认为TX异国授与方的输出。

5a2a3ae10211b52ae7344de4d9dc34336a87488a 压缩数据  

为了最大水平地缩短调用数据(calldata),Zkopru将原首数据压缩为49字节数据。 最先,它脱离了添密候选者的公钥,由于授与者将行使本身的公钥来揣摸出。 并且,它行使Token ID,该Token ID将声援的token地址和索引从0映射到255。然后,由于value能够是ether,erc20Amount或nftId,因此授与者针对这3栽情况创建了三栽类型的UTXO。 末了,倘若在营业的输出列外中存在任何揣摸出的UTXO,则授与者成功授与了UTXO。

局限性

Zkopru不会强制回路(circuit)检查添密制定。因此,倘若发送者未行使正当的共享密钥或数据,则批准者将不会收到备注。

  原子交换  

Zkopru以直接手段声援原子交换。倘若A和B想要交换其资产,则它们会彼此创建备注(note)并将所需的备注公开在营业数据上。然后,融合者答对相逆的营业进走配对或被裁减。

例如,喜欢丽丝(Alice)想用天的50ETH交换鲍勃(Bob)的1000 DAI。 喜欢丽丝支拨她的60 ETH note,并为本身创建了10 ETH note,并为鲍勃创建了50 ETH note。 喜欢丽丝还计算她异日的1000 DAI note的哈希值,并将该哈希值袒露给她营业的swap字段。 鲍勃则支拨他的3000 DAI note,并为本身创建了2000 DAI note,为喜欢丽丝创建了1000 DAI note。 鲍勃还计算他异日的50 ETH note的哈希值,并将该哈希值袒露给他的营业的swap字段。 一旦融合者匹配了营业池中成对的营业集,它将把营业对包括在一个新区块中。 倘若一个区块仅包含其中一个,则融合者将被裁减。 09dcea1b401e618fa321a78362c7105c48149620

Zkopru正在行使一栽浅易版本的原子互换。然而倘若你想要检验一栽基于MPC的zk原子互换模型,你能够在这边望到详细新闻。

  Merkle树结构  

UTXO树和withdrawal树中的备注(note)在下一个版本将有64深度。将只有一个单一的UTXO树和一个挑取树。

Zkopru的树林由UTXO树,nullifier树和withdrawal树构成。

UTXO树是仅追添用法,包含UTXO的Merkle树。 议定挑交包含Merkle表明,用户能够将UTXO用作营业的流入。 并将营业的输出效果附添回最新的UTXO树中。

另外,倘若zk-transaction创建withdrawal输出,则Zkopru会将它们附添到最新的withdrawal树中。 将树的根被标记为已完善后,一切者能够议定表明一切权来挑取资产。

然后,议定 commitment-nullifier方案,将用过的UTXO的nullifier标记为在nullifier树(唯一的稀奇Merkle树)中行使。 倘若营业试图行使已经无效的叶子(leaf),它将变为无效(nullified),并且挑衅者编制会大幅裁减区块挑议者。

ca4e3fd77d2d108e0b1e79b8545489123e254a62

Merkle树规范

WX20200720-172743@2x

{% hint style=“warning” %}

UTXO树&withdrawal树在Burrito版本上有64深度 https://github.com/zkopru-network/zkopru/issues/35

{% endhint %}

  如何管理UTXO树  

单个UTXO树是用于成员资格表明的稀奇Merkle树。 它行使Poseidon哈希(SNARK中最益处的哈希函数之一)生成zk SNARK表明以暗藏支拨哈希及其路径。

要将新树叶(leaf)追添到UTXO树,融合者将实走以下步骤。 1.准备一个阵列。 2.融合者选摘要包括的MassDeposits,并将MassDeposits中的每笔存款附添到阵列中。 3.二层营业生成新的UTXO。 将重生成的UTXO附添到阵列。 4.以区块大幼为32对准备益的数组进走分割。5. 构造子树(sub-tree)并实走子树rollup。

倘若UTXO树已被(2 ^ 31)个事项十足填充,编制将被填充的树进走存档并启动一个新树。 也批准行使归档树来引用营业的包含表明。

7fd022be927d62031a6aea5f3b6f514ed6b741d6

Nullifier树

 

每次转账,挑款和迁移营业都支拨带有包含表明的UTXO,并标记在nullifier树上行使的派生nullifier。因此,nullifier树是一个很大的稀奇Merkle树,它记录了深度为254的稀奇Merkle树中每一个用过的UTXO。因此,Zkopru行使最益处的哈希函数keccak256行为nullifier树的哈希函数。

要更新nullifier树,融合者实走以下步骤: 选择营业(迁移,取款,迁移)并从营业中搜集一切nullifier。 检查是否存在任何已行使的nullifier。 将每个nullifier标记为已行使。在更新过程中,倘若一切nullifier都异国更改nullifier树的根,请屏舍该营业,由于它会尝试进走双花。 就像UTXO树相通,Zkopru笑不都雅地更新了nullifier树的根。倘若有任何题目,吾们能够议定生成防敲诈链上表明一个nullifier被行使了不止一次。要查望做事原理,请参阅RollUpChallenge.sol和SMT.sol。

 

挑款树(withdrawal树)

 

与withdrawal树和UTXO树的唯一不同在于,withdrawal树行使keccak256行为哈希函数。 之因而行使keccak256,是由于Zkopru在智能相符约上必要挑取树的Merkle表明,而在SNARK回路中则必要UTXO树的Merkle表明。 在树的根定型后,withdrawal树中的叶子(leaves)在1层智能相符约中便是能够挑取的。

要更新挑款树,融合者实走以下步骤: 搜集已选择营业的一切withdrawal叶子。 拆分出区块大幼为32的withdrawal数组。 构造子树(subtree)并实走子树rollup。  

大量存款(mass deposit)

 

当用户将资产存入Zkropu时会发生什么: Zkopru相符约将给定数目的资产从用户帐户迁移到自身。 验证note是否带有给定新闻的一个有效哈希。 将note相符并到MassDeposit []列外的末了一项。 什么是MassDeposit?

MassDeposit是用于rollup表明的单个mergedLeaves bytes32值。 可在此处检查什么是rollup表明mergedLeaves。 倘若融合员挑出一个包含MassDeposits的区块,则该区块会将MassDeposit中的一切note追添到其UTXO Merkle树。

融合员如那里理MassDeposits?

融合员只能包括不再更改的“已准许(commited)” MassDeposit。 为了包含MassDeposit,融合员将监视Zkopru相符约中的存款事件。

MassDeposit什么时候变成“已准许”?

尽快将存款推到二层网络。 因此,当融合员挑出每个新区块时,它将凝结最新的MassDeposit。

融合员能够包含众个MassDeposit吗?

是的,能够在最大挑衅成本周围内一次包含众个MassDeposit。

 

大周围迁移(mass migration)

 

大周围迁移的基本思维专门浅易。 固然1层相符约上的存款营业创建了MassDeposit对象,但是营业的“迁移”类型输出能够创建MassMigration,该MassMigration为其主意地网络构造MassDeposit。

营业能够具有UTXO,迁移(migration)或取款(withdrawal)类型的输出。

在Zkopru中,要进走迁移,就会涉及到源网络和现在标网络。 一旦完善源网络上的大周围迁移(相关代码请查望),就能够实走源网络上的migrationTo函数。 该函数能够移动资产(包括Ether,ERC20和ERC721),同时为现在标网络创建MassDeposit对象。

因此,现在标网络答实现acceptMigration函数。 更众新闻在这边

rollup之间的迁移标准将议定EIP进走标准化。

 

即时取款(instant withdrawal)

 

在Zkopru中,挑取者能够议定竖立每个挑取note的即时挑取费用来乞求即时挑取。 然后,任何人都能够挑前为未完善的挑款付款并收取费用。

为了乞求即时挑款,一切者为她的note生成ECDSA签名并进走广播。 拥有有余资产且可支出的任何人都能够行使签名挑前支出取款。 一旦Zkopru成功包含该营业,智能相符约便将挑款note的一切权迁移给付款人。 末了,预支款人在完善营业后将其挑取。

吾们能够有一个松散的公开市场来收取即时取款费。 要跟进最新进展,请订阅此github: https://github.com/zkopru-network/zkopru/issues/333 结论  

按照此规范,吾们已成功行使Circom,Solidity,Typescript等构建了测试网。

行使zk-SNARK和Optimistic rollup的以太坊二层幼我营业扩展解决方案。 -zkopru-network / zkopru

最先,吾们能够实现了一栽每笔zk营业可承受的gas成本。 平均值约为8800gas,当gas节制为1,150,000且区块时间为13.2秒时,理论上最大的TPS为105。 在Zkopru中,营业数据消耗约534个字节。 由于表明数据为256字节,因此倘若异日行使表明聚相符,吾们能够缩短大约两倍的营业成本。 否则,每个区块挑出和最后确定的存储成本别离约为168k gas和55k gas。 当吾们包括350笔营业时,此成本约为区块生成成本的6.7%。

此外,吾们能够行使Optimistic Rollup的变通性来实现很众功能。 最先,Zkopru议定众个SNARK验证密钥声援各栽类型的营业。 您甚至能够行使1个输入和4个输出,或4个输入和1个输出完善一笔营业。 议定Optimistic Rollup的变通性,使其声援众栽类型的营业专门浅易。 其次,Zkopru实现了准确类型的挑衅案例。 这意味着,倘若区块的第n个营业有题目,则质询仅检查该特定营业。

另外,Zkopru必要您在计算机上运走节点,这一点也很主要。 因此,SNARK高效果性和轻节点是柔件实现要考虑的主要因素。 因此,吾们将行使Typescript和NodeJS构建该项现在,以供异日在基于本机的移动行使程序中行使。 展望轻型节点将仅消耗约50〜100 MB的存储空间用于树管理。

总结一下做事,吾们期待Zkopru能够用于以太坊的隐私营业层。 它既迅速,益处,又可移植到升级版本。 迎接感有趣的人造该项目进展走捐款。 您能够议定Zkopru的文档页面(https://docs.zkopru.network)查望一个已经布局过的版本。

感谢你浏览本文。

参考文献: Ethereum 9 3/4: Optimistic rollup for zk-Mimblewimble1 BarryWhitehat’s zk-rollup1 John Adler’s Minimal Viable Merged Consensus1 Plasma-group’s Optimistic Rollup Batch Deposits for [op/zk] rollup / mixers / MACI Mass migration to prevent user lockin in rollup