Filecoin VM 解释器 - 消息的调用 (外部 VM)

VM解释器从tipset(基于上tipset的父状态)上编排消息的执行,从而生成一个新的状态和消息收据的序列.这个新状态和收据集合的CID被包含在后续epoch的块中,这些epoch必须就这些CID达成一致才能形成新的tipset。

每个状态的更改都有一条消息来驱动,tipset中所有块中得消息都必须全部执行才能产生下一个状态。来自第一个块得所有消息均在tipset中得第二个和后续块得消息之前执行。对于每个块,首先执行BLS聚合得消息,然后执行SECP签名的消息。

隐式消息

除了显式包含在每个块中的消息外,隐含消息还会在每个epoch进行一些状态更改,隐式消息不在节点之间传输,而是由解释器在评估时构成。
对于tipset中的每个块,都有一个条隐式消息:

  • 选举矿工角色成为区块生产者,作为区块中的第一条消息。
  • 调用奖励角色将区块奖励支付给矿工 的 owner账户,作为区块中的最后一条消息。

对于每个tipset, 都已以下一个隐式消息:

  • 调用 cron角色来处理自动检查和付款,作为tipset的最后一条消息

所有隐式消息的构造都使用一个区别于系统账户的角色的From地址。他们的Gas费用位0,但是他们必须被计算。为了计算新状态,他们必须成功(推出代码为0)。隐式消息的收据不包括在收据列表中,只用显式的消息才有明确的收据。

Gas 支付

在大多数情况下,消息的发送者向产生包含该消息的块的矿工支付执行该消息所需的gas费。执行该消息后,每次执行该消息所产生的gas费将立即支付给矿工的owner账户。获得块奖励和gas费用没有任何阻碍,他们都是立即支付的。

重复消息

由于不同矿工在同一时期产生区块,因此,单个tips中的多个区块可能包含相同的消息(由CID标识)。发生这种情况时,在tipset的规范顺序中第一次遇到它是才会处理该消息,消息的后续实例将会被忽略,不会导致任何状态变化,也不会产生收据和向区块生产者支付费用

因此,tipset的执行顺序是:

  • 支付第一块的奖励
  • 选举第一个区块的生产者
  • 处理第一个区块的消息(首先处理BLS,其次处理SECP)
  • 支付第二个区块的奖励
  • 选举第二个区块的生产者
  • 处理第二个块的消息(首先处理BLS,其次处理SECP,跳过任何已经遇到的消息)
  • [...随后的块处理同上....]
  • cron角色标记

正确和失败的消息

有效块中的每一条消息都可以被处理并产生收据(注意,块的有效性表示所有消息在语法上均有效且正确签名)。但是,执行的成功与否取决于消息的执行状态。如果消息执行失败,则相应的收据将携带非零的退出代码。
如过一条消息由于矿工打包在父状态就不可能成功消息的原因而失败,或者由于发送者缺乏资金来支付最大消息成本,则矿工将通过消耗Gas的方式支付罚款(而不是发送者向矿工支付费用)。
消息失败导致的唯一状态变更是:

  • 增加发送者的 CallSeqNum,并且发送者向创造包含该消息的块的矿工的onwer支付Gas费,或者
  • 矿工通过支付等同于失败消息的Gas费的罚款(发送者的CallSeqNum不改变)

如果发生以下情况,消息将会失败:

  • From的角色在状态中不存在(矿工罚款)
  • From的角色不是账号角色(矿工罚款)
  • 消息的CallSeqNumFrom的角色的CallSeqNum不匹配(矿工罚款)
  • From的角色没有足够的资金来支付整个消息消耗的Gas成本GasLimit * GasPrice(矿工罚款)
  • To的角色不存在并且To的地址不是一个公钥类型的地址
  • To的角色存在(或者作为隐式账户创建)但是没有对应于非零的方法MethodNum
  • 反序列化的Params长度不匹配ToMethodNum方法的长度的数组
  • 反序列化的Params对于To 角色的MethodNum方法执行的类型无效
  • 所调用的方法消耗的Gas多于GasLimit允许的量。
  • 调用的方法以非零代码(通过Runtime.Abort())推出
  • 由于以上任何原因,接收方发送的任何内部消息都会失败。

如果To账户在状态中不存在,并且该地址是有效的H(pubkey)地址,则会为其创建账户角色


翻译自https://spec.filecoin.io/#section-systems.filecoin_vm.interpreter

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,590评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,808评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,151评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,779评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,773评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,656评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,022评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,678评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,038评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,756评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,411评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,005评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,973评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,053评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,495评论 2 343

推荐阅读更多精彩内容