Optimism OVM

OVM ( Optimistic Virtual Machine)

OVM是相对于EVM的概念,是Layer2上交易的执行环境,但既然Layer2上也有EVM,为什么还要做个OVM呢?

作用 (欺诈证明)

这是因为Layer2上的交易最终要把交易的执行状态存储在layer1上(SCC Chain 合约)。但为了防止有人做恶,要验证这个交易的状态是否正确。就需要在Layer1上 重新运行这个Layer2的交易(重放交易)。所以Layer2上的chainID要和Layer1上的chainID要保持一致。

OVM OPCODE

为了保持这个交易在Layer2上和Layer1上运行的结果一样,就需要修改EVM上的某些OpCode,,例如加载或存储状态或获取当前时间戳,则它们在L1和L2上的行为将不同。例如:

L2交易调用TIMESTAMP 操作码,例如返回1610889676, 一个小时后,如果我要在layer1上验证这个交易,交易都必须在以太坊L1上重放,如果继续使用EVM 执行这个OPCODE的话,则返回的是 1610889676 +3600 。这就会导致两次执行的交易结果不一致。达不到 验证交易的效果。如果使用OVM的TIMESTAMP,则可以返回
1610889676 。因为OVM重写这个操作码后,返回的是当时这个交易的timestamp.这就保证一致性了。这个TIMESTAMP OPCODE在OVM叫 ovmTIMESTAMP。

所有的这种与当时环境相关的opcde会改为ovm{opcode}

这些不安全操作码包括下面的操作,如果EVM中没有实现的操作符也是不安全因素。也是不允许的。

The following opcodes are disallowed:

ADDRESS
BALANCE
ORIGIN
EXTCODESIZE
EXTCODECOPY
EXTCODEHASH
BLOCKHASH
COINBASE
TIMESTAMP
NUMBER
DIFFICULTY
GASLIMIT
GASPRICE
CREATE
CREATE2
CALLCODE
DELEGATECALL
STATICCALL
SELFDESTRUCT
SELFBALANCE
SSTORE
SLOAD
CHAINID
CALLER*
CALL*
REVERT*
* The CALLER, CALL, and REVERT opcodes are also disallowed, except in the special case that they appear as part of one of the following strings of bytecode:

CALLER PUSH1 0x00 SWAP1 GAS CALL PC PUSH1 0x0E ADD JUMPI RETURNDATASIZE PUSH1 0x00 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x00 REVERT JUMPDEST RETURNDATASIZE PUSH1 0x01 EQ ISZERO PC PUSH1 0x0a ADD JUMPI PUSH1 0x01 PUSH1 0x00 RETURN JUMPDEST
CALLER POP PUSH1 0x00 PUSH1 0x04 GAS CALL

OPCODE验证

那如何验证某个合约是否包含“非法”的opcode呢?在OVM 中实现了 OVM_SafetyChecker.sol,里面的isBytecodeSafe方法会在create布署合约的时候进行opcode的检查。如果包含非法操作符则return 0.否则返回1.

OVM编译器

既然OVM有单独的opcode,但我们又是用solidity写的合约。所以为了和EVM的opcode进行区分。Optimism自己实现了个OVM编译器https://github.com/ethereum-optimism/solidity

Layer2 客户端 (Optimistic Geth)

因为我们要操作laye2,比如,创建和发送交易。总要有个入口。为了更好的利用现有的资源,otimistic 就直接使用了以太坊最流行的客户端(go-ethereum). 我们叫做 L2Geth,在L2Geth中执行交易的过程和在Layer1上执行的过程是一样的。不一样的是交易的结构进行了修改,从下面的代码中可以看到增加了TransactionMeta这个 关于当前Layer1的信息。

type Transaction struct {
    data txdata
    meta TransactionMeta
    // caches
    hash atomic.Value
    size atomic.Value
    from atomic.Value
}

type TransactionMeta struct {
    L1BlockNumber     *big.Int          `json:"l1BlockNumber"`
    L1Timestamp       uint64            `json:"l1Timestamp"`
    L1MessageSender   *common.Address   `json:"l1MessageSender" gencodec:"required"`
    SignatureHashType SignatureHashType `json:"signatureHashType" gencodec:"required"`
    QueueOrigin       *big.Int          `json:"queueOrigin" gencodec:"required"`
    // The canonical transaction chain index
    Index *uint64 `json:"index" gencodec:"required"`
    // The queue index, nil for queue origin sequencer transactions
    QueueIndex     *uint64 `json:"queueIndex" gencodec:"required"`
    RawTransaction []byte  `json:"rawTransaction" gencodec:"required"`
}

通过这些信息,如果这个交易是从Layer1传过来的,则会由Sequener进行填充。如果是直接在Layer2上创建,则在 batch_submitter提交的时候,根据当 前Layer1的信息进行填充。

  private async _getBlock(blockNumber: number): Promise<L2Block> {
    const block = (await this.l2Provider.getBlockWithTransactions(
      blockNumber
    )) as L2Block
    // Convert the tx type to a number
    block.transactions[0].txType = txTypePlainText[block.transactions[0].txType]
    block.transactions[0].queueOrigin =
      queueOriginPlainText[block.transactions[0].queueOrigin]
    // For now just set the l1BlockNumber based on the current l1 block number
    if (!block.transactions[0].l1BlockNumber) {
      block.transactions[0].l1BlockNumber = this.lastL1BlockNumber
    }

    return block
  }
  

L2Geth打包交易后,会被batch_submitter 每隔一段时间,将 一批交易组成batch 交易,提交到layer1的CTC Chain合约中。调用的CTC Chain的合约方法是:appendSequencerBatch

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 144,481评论 1 305
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 61,908评论 1 258
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 95,710评论 0 214
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 41,372评论 0 183
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 49,216评论 1 262
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 38,949评论 1 178
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 30,558评论 2 275
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 29,308评论 0 168
  • 想象着我的养父在大火中拼命挣扎,窒息,最后皮肤化为焦炭。我心中就已经是抑制不住地欢快,这就叫做以其人之道,还治其人...
    爱写小说的胖达阅读 29,183评论 7 237
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 32,675评论 0 214
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 29,416评论 2 217
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 30,757评论 1 232
  • 白月光回国,霸总把我这个替身辞退。还一脸阴沉的警告我。[不要出现在思思面前, 不然我有一百种方法让你生不如死。]我...
    爱写小说的胖达阅读 24,314评论 1 33
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 27,215评论 2 213
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 31,682评论 3 214
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 25,665评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,091评论 0 170
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 33,687评论 2 233
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 33,830评论 2 237

推荐阅读更多精彩内容

  • optimism-rollup 做为目前最流行的以太坊L2解决方案,最近研究了下,写个笔记。 另外,layer2并...
    ttblack阅读 796评论 0 1
  • 本人在昨天(2018-08-04)参加了nervos组织的活动 第一场 区块链智能合约及公链安全 PeckShie...
    已不再更新阅读 339评论 0 0
  • 夜莺2517阅读 127,652评论 1 9
  • 我是黑夜里大雨纷飞的人啊 1 “又到一年六月,有人笑有人哭,有人欢乐有人忧愁,有人惊喜有人失落,有的觉得收获满满有...
    陌忘宇阅读 8,455评论 28 53
  • 兔子虽然是枚小硕 但学校的硕士四人寝不够 就被分到了博士楼里 两人一间 在学校的最西边 靠山 兔子的室友身体不好 ...
    待业的兔子阅读 2,503评论 2 9