1. 引言

在EVM中,每个word对应256个bit。在zkevm中,对word的encode方式有所不同:

  • 为random linear combination of 8 bit words

这种编码方式有助于使用plookup来表达Arithmetic、Bitwise oprations和Comparators。而stack和memory不需要关注该编码方式,因为stack和memory仅需处理commitments值。

将256 bit 拆分为 8 bit chunks主要基于以下2方面考虑:

  • 1)使用的BN254曲线。BN254曲线的最大值可以254 bit表示,所有的arithmetic都是对254 bit素数取模完成。
  • 2)通过plookups来进行conditional checks和bitwise operations。2252^{25}225行的size限制了需要work in smaller chunks of the word。在plookup中需要做多项式除法。Plonk prover使用FFT来高效实现多项式触发。BN254曲线支持的最大FFT size为2282^{28}228。某些需要常量开销和自定义约束。因此,限制了多项式最大degree为2252^{25}225。

2. Word编码举例(Endianness)

将256 bit word以little endian编码。
如对于256 bit的value 1:

word256 = 1

word256变量切分为32个8 bit words表示:

word8s = [1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

3. Commitment

该256 bit表示为其8 bit words的random linear combination。
该commitment check应保证该32 chunks in 8 bit range。

4. Addition

验证a256 + b256 = c256。支持overflow来匹配EVM behavior。
如:

a8s    ff 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0
b8s     2 1 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0
carry     1 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 0
sum8s   1 2 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0 | 0 0 0 0 0 0 0 0
a8s    ff ff ff ff ff ff ff ff | ff ff ff ff ff ff ff ff | ff ff ff ff ff ff ff ff | ff ff ff ff ff ff ff ff
b8s     2  0  0  0  0  0  0  0 |  0  0  0  0  0  0  0  0 |  0  0  0  0  0  0  0  0 |  0  0  0  0  0  0  0  0
carry      1  1  1  1  1  1  1 |  1  1  1  1  1  1  1  1 |  1  1  1  1  1  1  1  1 |  1  1  1  1  1  1  1  1  1
sum8s   1  0  0  0  0  0  0  0 |  0  0  0  0  0  0  0  0 |  0  0  0  0  0  0  0  0 |  0  0  0  0  0  0  0  0

5. Comparator

会检查如下关系:

  • a256 > b256
  • a256 < b256
  • a256 == b256

将8 bit chunks group为 16 bit chunks来优化该table。
result会carry the conclusion of the comparision from the higher significant chunks all the way down。
如:

a       1 0 0 0 | 0 0 0 0 | 0 0 0 0 | 0 1 0 0 |
b       1 0 0 0 | 0 0 0 0 | 0 0 0 0 | 0 0 0 0 |
result  1 1 1 1 | 1 1 1 1 | 1 1 1 1 | 1 1 0 0 |

6. Comparator Take 4

# This value is determined by the curve we use
FIELD_SIZE = 2**254 # 为SCALAR_FIELD_SIZEclass SignTable:"""x: 18 bits signed ( -(2**17 - 1) to 2**17 - 1)sign: 2 bits (0, -1, 1)(1 column and 2**18 - 1 rows)"""def __init__(self):self.rows = []self.rows.append({"x": 0, "sign": 0})for x in range(1, 2**17):self.rows.append({"x": x, "sign": 1})self.rows.append({"x": -x + FIELD_SIZE, "sign": -1})def lookup(self, diff: int, sign: int) -> bool:"""Returns True if the row exists in the table"""...def compare(a8s: Sequence[U8],b8s: Sequence[U8],result: Sequence[int],) -> int:"""returns -1 if a < b0 if a == b1 if a > b"""assert len(a8s) == len(b8s) == 32assert len(result) == 16# Before we do any comparison, the previous result is "equal" result = result[:] + [0]for i in reversed(range(0, 32, 2)):a16 = a8s[i] + 256 * a8s[i + 1]b16 = b8s[i] + 256 * b8s[i + 1]diff = (a16 - b16) % FIELD_SIZEprevious, current = result[i//2+1], result[i//2]require(SignTable.lookup((diff + 2**16 * previous) % FIELD_SIZE, current))return result[0]

previous会影响当前lookup结果。previous=0表示仅由diff决定result
对于u256比较,需16次linear combination和16次lookup。
具体举例为:

参考资料

[1] https://hackmd.io/HfCsKWfWRT-B_k5j3LjIVw
[2] https://hackmd.io/QUiYS3MnTu29s62yg9EtLQ
[3] https://hackmd.io/6jzBI4nmRR-JvSG2TFHrDw
[4] zkEVM-specs Word Encoding

appliedzkp的zkevm(3)Word Encoding相关推荐

  1. 使用socket实现信用卡程序和迷你购物商城

    #-*- coding:utf-8 -*- from moudle import * import socketserver import json import os import time imp ...

  2. NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练、测试(某个单词的相关词汇)

    NLP之词向量:利用word2vec对20类新闻文本数据集进行词向量训练.测试(某个单词的相关词汇) 目录 输出结果 设计思路 核心代码 输出结果 寻找训练文本中与morning最相关的10个词汇: ...

  3. 邮件头解析=?utf-8?Q?乱码

    一图胜千言 import email.headerdef decode_mime_words(s):return u''.join(word.decode(encoding or 'utf8') if ...

  4. 【NLP实战】Task1 数据集探索

    一.THUCNews数据集 传送门 链接: https://pan.baidu.com/s/1lziUTaCF7VfnuAKXrGftTw 提取码: saag 概述 本数据集是清华NLP组提供的THU ...

  5. AAAI 2018论文解读 | 基于文档级问答任务的新注意力模型

    在碎片化阅读充斥眼球的时代,越来越少的人会去关注每篇论文背后的探索和思考. 在这个栏目里,你会快速 get 每篇精选论文的亮点和痛点,时刻紧跟 AI 前沿成果. 点击本文底部的「阅读原文」即刻加入社区 ...

  6. CNN进行新闻文本分类代码实战,包含分类文本

    依次运行三个文件: cnews_loader.py cnn_model.py run_cnn.py cnews新闻文件夹下载路径:链接:https://pan.baidu.com/s/1H3K94E7 ...

  7. C# 词典数据结构设计【附demo】

    分析 要建立词典,最基本的应该有词典的描述信息.词典索引文件以及词典数据文件. /// <summary> /// 索引文件 /// </summary> string idx ...

  8. 基于sigmoid的文本多标签分类模型代码实现

    sigmoid一般是用来做二分类的,它是将一个标量的数字转换成[0,1]之间的一个概率值,如果概率值大于0.5, 则判定为是某个分类,否则则不是某个分类,公式如下: 本文基于sigmoid做了一个将一 ...

  9. 基于softmax的文本多分类模型代码实现

    对于多分类问题,可以使用softmax来做,但是效果不是那么好,当做一个算法的练手吧 首先是数据集处理的代码: 文件名:data_loader.py # coding: utf-8import sys ...

最新文章

  1. 计算机知识课后反思,计算机硬件和软件知识课后反思
  2. vim文本编辑器详解
  3. Kubernetes1.5新特性(一):Kubelet API增加认证和授权能力
  4. 將軍苑 - 收藏集 - 掘金
  5. Apache防DDOS模块mod_evasive的安装配置和使用
  6. Remove Nth Node From End of List
  7. SAP云平台开发权威指南的目录
  8. python开发小型数据库_Python开发【第十七篇】:MySQL(一)
  9. Windows Mobile Widget Emulator
  10. 用Visual Studio2019自定义项目模板
  11. Asp.Net Core 中IdentityServer4 实战之角色授权详解
  12. 深度学习去燥学习编码_我们问了15,000个人,他们是谁,以及他们如何学习编码
  13. 抽象工厂模式_设计模式3之抽象工厂模式
  14. ...............
  15. python基于django的学生在线考试自动阅卷系统(含错题本功能)
  16. 基于springboot+mysql的房地产中介管理系统
  17. 2011系列服务器,2011年中服务器领域大事件盘点
  18. 三行代码搭建一个全能书籍系统(wiki)
  19. 风影墙纸,一天看N回。
  20. 网络管理系统、网管、network manage system、运维系统

热门文章

  1. python爬虫系列(2):分析Ajax 爬取搜狗高清壁纸
  2. 浅谈对java编程思想的理解
  3. 用animation实现无缝轮播图
  4. 福利福利~262集前端免费视频!
  5. mPaas-如何排查离线包(H5应用/小程序)无法更新的问题
  6. Java程序设计任务驱动式教程(第三版)课后习题答案下载
  7. SqlServer数据库定时备份
  8. python可视化开源工具_这5款Python可视化神器,总有一款适合你!
  9. DDS设计产生线性调频信号(一)
  10. 虚拟机Oracle BIEE下载