1.指令结构
CairoCPU原生支持的word是一个域元素,而这个域是特征值大于P>2^63。每个指令会占用1到2个word,如果指令后面跟着立即值(="12345678")则该指令占用2个word,并且值存在第二个word里。每个指令的第一个word由以下元素组成:
2.状态转换
状态转换函数代表了一个通用的状态转换单元,而一个计算通常会分解成多个连续执行的指令,因此我们需要:
a.确保指令的内容,以及指令执行前后的状态的有效性
b.确保执行的指令是一个有效的指令
2.1转换逻辑
如果指令执行前后的状态是一致的,那么其状态的更新一定是按照以下逻辑执行:
ShibaInu测试网区块链Puppynet交易量突破3000万:金色财经报道,根据Puppyscan数据,Shibarium测试网Puppynet自3月11日推出以来已完成3000万笔交易。Puppynet在5月20日达到1000万笔交易,6月11日达到2000万笔交易。同时,Shibarium实用性的增加是另一个里程碑。Shibarium测试网Puppynet处理的区块总数超过1,700,764个,钱包地址数量增加至17,061,835个。区块链保持稳定,平均出块时间为5-7秒,gas费接近1Gwei。然而,连日来日交易笔数从300万多笔下降至260万笔。[2023/7/16 10:57:30]
Safe、BitKeep等超30个项目合作推出MEV Blocker RPC:4月5日消息,Safe、BitKeep、DODO、Oasis、Balancer、1inch等超过30个以太坊项目合作推出MEV Blocker RPC,该工具旨在保护用户免受各种类型的MEV攻击。
MEV Blocker RPC是一个路由用户交易到“搜索器”网络而不是公共内存池的工具,这些搜索器通过竞标获取反向运行交易的权利,保护用户免受抢先交易和三明治攻击。[2023/4/5 13:46:40]
2.2指令校验
如图1所示,?个指令由以下元素组成:
3.指令示例
3.1断言相等
断言相等指令可以用下述语法表示:
<left_handle_op>=<right_handle_op>
流媒体服务Napster 收购 Mint Songs以扩大Web3业务:金色财经报道,流媒体服务 Napster 宣布收购 Mint Songs 以扩大其 Web3 业务,但具体收购金额暂未披露。Napster 在周三的一份新闻稿中表示,这将是其为加快 Web3 功能而计划进行的一系列收购中的第一家公司。Mint Songs 开发了允许艺术家创作歌曲并为粉丝构建 NFT 项目的技术,此前从 Freestyle Capital 和 Castle Island Ventures 等投资者那里筹集了 430 万美元。(The Block)[2023/2/15 12:09:08]
它确保了公式两边是相等的,否则程序的执行将会被返回。
Note2:除法和减法可以分别表示为具有不同操作数顺序的乘法和加法。
assert指令可以被认为是一条赋值指令,其中?边是已知的,另一边是未知的。例如=4可以被认为是断言的值为4,或者根据上下文将赋值为4。
图4给出了断言相等指令的一些示例,以及每个指令对应的标志值:
英伟达CEO:元宇宙不限于人,也可以是“机器对机器”:金色财经报道,英伟达首席执行官黄仁勋在最新访谈中表示,英伟达是进军元宇宙市场的最大主流科技公司之一,但会专注于构建自动化工业元宇宙。利用英伟达的 Omniverse、基于人工智能的自动化程序、以及 VR/AR 设备可以将现实世界连接到元宇宙,相关技术也被用于包括美国军队在内的军事单位的训练计划中。黄仁勋强调,元宇宙可以在 3D 中体验,也可以在 2D 中体验,物理世界和虚拟世界可以通过很多不同的方式联系起来,而且不仅必须是人类,也可以是机器对机器。(nftgators)[2022/10/20 16:32:08]
解释指令=5:
?为assert指令=>opcode=4
?next_ap=ap=>ap_update=00=0
?next_pc=pc+instruction_size=>pc_update=000=0
?op0和op1没有addormul=>res_logic(res)=00=0
瑞士豪表制造商泰格豪雅在美接受ApeCoin支付:8月5日消息,LVMH旗下瑞士豪表制造商泰格豪雅(Tag Heuer)宣布接受消费者通过BitPay使用ApeCoin支付,目前该服务仅在美国开展。[2022/8/5 12:04:16]
?存在立即数=>op1_src(op1)=001=1
?立即数地址指令地址相邻=>off_op1=1
?等式左边=>dst_reg(dst)=1
?等式左边=>off_dst=1
?op0_reg/off_op0=>initalvalue(1/-1)//因为这个指令用不到这些flags,所以填充默认值
3.2条件和非条件跳转
jmp指令允许更改程序计数器pc的值。
Cairo支持相对跳转和绝对跳转-分别用关键字rel和abs表示;jmp指令或许是有条件的,比如当某个内存单元的值不为0时,触发jmp指令。
指令的语法如下所示:
#Unconditionaljumps.
jmpabs<adress>
jmprel<offset>
#Conditionaljumps.
jmprel<offset>if<op>!
图5给出了jmp指令的一些示例,以及每个指令对应的标志值:
解释指令jmprel+:
?为jmp指令=>opcode=0
?next_ap=ap=>ap_update=b00=0
?next_pc=pc+res=>pc_update=b010=2
?res=op0+op1=>res_logic(res)=b01=1
?op1:=>op1_src(op1)=b010=2
?op1:=>off_op1=-7
?op0:=>op0_src(op0)=0
?op0:=>off_op0=1
?dst_reg/off_dst=>initalvalue(1/-1)///因为这个指令用不到这些flags,所以填充默认值
3.3call和ret
call和ret指令允许实现函数堆栈。call指令更新程序计数器(pc)和帧指针(fp)寄存器。程序计数器的更新类似于jmp指令。之前fp的值被写入,以允许ret指令将fp的值重置为调用之前的值;类似地,返回的pc(调用指令后面指令的地址)被写到,以允许ret指令跳回并继续执行调用指令后面的代码的执行。由于写入了两个存储单元,ap向前进了2,fp被设置为新的ap。
指令的语法如下:
callret<adress>
callrel<offset>
ret
图6给出了call和ret指令的一些示例,以及每个指令对应的标志值:
解释指令callabs:
?为call指令=>opcode=0
?next_ap=ap=>ap_update=b00=0
?next_pc=res=>pc_update=b001=1
?res=op1=>res_logic(res)=b00=0
?op1:=>op1_src(op1)=b010=2
?op1:=>off_op1=4
?op0_reg/off_op0=>initalvalue(0/1)///因为这个指令用不到这些flags,所以填充默认值
?dst_reg/off_dst=>initalvalue(0/0)///因为这个指令用不到这些flags,所以填充默认值
3.4高级ap
指令ap+=<op>通过给定的操作数增加ap的值。
图7给出了高级ap指令的一些示,以及每个指令对应的标志:
解释指令ap+=123:
?为advancingap指令=>opcode=0
?next_ap=ap+res=>ap_update=b01=1
?next_pc=pc+instruction_size=>pc_update=b000=0
?res=op1=>res_logic(res)=b00=0
?op1=123=>op1_src(op1)=b001=1
?op1=123=>off_op1=1
?op0_reg/off_op0=>initalvalue(1/-1)///因为这个指令用不到这些flags,所以填充默认值
?dst_reg/off_dst=>initalvalue(1/-1)///因为这个指令用不到这些flags,所以填充默认值
关于我们
Sin7y成立于2021年,由顶尖的区块链开发者组成。我们既是项目孵化器也是区块链技术研究团队,探索EVM、Layer2、跨链、隐私计算、自主支付解决方案等最重要和最前沿的技术。
微信公众号:Sin7Y
GitHub|Twitter|Telegram|Medium|Mirror|HackMD|HackerNoon
郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。