首页 > 编程语言 >Ethereum学习笔记 ---- 多重继承中的 C3线性化算法

Ethereum学习笔记 ---- 多重继承中的 C3线性化算法

时间:2024-09-12 16:24:39浏览次数:10  
标签:__ 多重 继承 ---- merge Ethereum C3 class

目录
学习 solidity 合约多重继承时,官方文档介绍 solidity 采用 C3线性化算法 来确定多重依赖中的继承顺序。
维基百科上有很好的说明:
C3线性化
C3 linearization

下面通过实验来深入理解一下。

举个反例

在 c3_notok.py 中定义如下类

class Type(type):
    def __repr__(cls):
        # Will make it so that repr(O) is "O" instead of "<__main__.O>",
        # and the same for any subclasses of O.
        return cls.__name__

class O(object, metaclass=Type): pass

class A(O): pass

class X(O, A): pass

if __name__ == '__main__':
    print(X.mro())

执行会 throw error:

$ python3 c3_notok.py

TypeError: Cannot create a consistent method resolution
order (MRO) for bases O, A

分析错误原因

根据 C3 线性化算法,计算 X 的 mro:

L(O) := [O]

L(A) := [A] + merge(L(O), [O])
     := [A] + merge([O], [O])
     := [A, O]

L(X) := [X] + merge(L[O], L[A], [O, A])
     := [X] + merge([O], [A, O], [O, A])

可以看到在最后一步计算中, OA[A, O], [O, A] 两个列表中分别为 head 和 tail,算法无法继续进行下去,所以 class X(O, A) 的定义不合法。

举个正例

在 c3_ok.py 中定义如下

class Type(type):
    def __repr__(cls):
        # Will make it so that repr(O) is "O" instead of "<__main__.O>",
        # and the same for any subclasses of O.
        return cls.__name__

class O(object, metaclass=Type): pass

class A(O): pass

class X(A, O): pass

if __name__ == '__main__':
    print(X.mro())

执行脚本,可以看到正常的输出结果:

$ python3 c3_ok.py 
[X, A, O, <class 'object'>]

分析

根据 C3 线性化算法,计算 X 的 mro:

L(O) := [O]

L(A) := [A] + merge(L(O), [O])
     := [A] + merge([O], [O])
     := [A, O]

L(X) := [X] + merge(L[A], L[O], [A, O])
     := [X] + merge([A, O], [O], [A, O]) 
     := [X, A] + merge([O], [O], [O])
     := [X, A, O]

solidity 中的多重继承

需要注意的是,在 solidity 中定义合约时,如果是多重继承,parent contracts 的顺序跟 python 中的 parent classes 的顺序是相反的,即 farthest parent contract 应该书写得离当前定义的合约最近,如下:

contract O {}

contract A is O {}

contract X is O, A {}

多重继承合约的 storage layout

remix 中编写如下合约

// SPDX-License-Identifier: GPL-3.0

pragma solidity >=0.8.0 <0.9.0;

import "hardhat/console.sol";

struct UintStruct {
    uint value;
}

contract O {
    uint v0 = 0;
}

contract A is O {
    uint v1= 1;
}

contract B is O {
    uint v2= 2;
}

contract C is O {
    uint v3= 3;
}

contract D is O {
    uint v4= 4;
}

contract X1 is O, A, B, C, D {
    uint vx1 = 6;

    function showStorageInX1() public view {
        UintStruct storage us;
        uint i;
        for (; i < 6; ++i) {
            assembly {
                us.slot := i
            }
            console.log(i, us.value);
        }
    }
}

contract X2 is A, B, C, D {
    uint vx2 = 7;

    function showStorageInX2() public view {
        UintStruct storage us;
        uint i;
        for (; i < 6; ++i) {
            assembly {
                us.slot := i
            }
            console.log(i, us.value);
        }
    }
}

可以看到, OABCD 合约的共同 parent contract,而 X2X1 少继承了一个 O

部署两个合约,分别调用两个合约中的函数 showStorageInX1()showStorageInX2(),结果如下:

可以看到,X1 和 X2 的 storage layout 是一样的,所以,在多重继承定义中,其实可以省略公共 parent contract。

标签:__,多重,继承,----,merge,Ethereum,C3,class
From: https://www.cnblogs.com/dongling/p/18410516

相关文章

  • EdrawMax v13 解锁版下载及安装教程 (综合图形图表设计软件)
    前言万兴亿图图示(WondershareEdrawMax)是一款综合图形图表设计软件,Visio国产替代.亿图图示中文版(EdrawMax)是一款办公绘图软件的思维导图软件.无需任何绘图功底,即可轻松创建各类思维导图.亿图图示专家,提供大量事例和在线模板,用于创建流程图,信息图,组织结构图,科学教育插......
  • 公司服务器有必要选好的系统盘吗
    公司服务器选择系统盘(通常是指固态硬盘SSD或机械硬盘HDD作为操作系统和应用程序的安装盘)时,选择一个性能良好、可靠度高的系统盘是非常有必要的。以下是选择好的系统盘的几个理由:1.启动和加载速度使用高质量的系统盘可以显著提高服务器的启动速度和应用程序的加载速度。SSD比HDD拥......
  • FlexibleBI高效精确的SPC数据分析系统,实时监控与智能报告生成
    在制造领域中,稳定的生产过程控制和质量分析是企业保持竞争力的核心。而我们推出的SPC(统计过程控制)系统,正是为满足现代生产需求而设计,提供了一系列灵活、智能的功能,帮助企业实现高效精准的数据分析与质量控制。FlexibleBI一键生成全面SPC分析报告通过我们的系统,只需轻松一键......
  • PbootCMS:帐号格式不正确,请输入正确的邮箱帐号!
    当您在使用PbootCMS进行注册或某些操作时遇到“帐号格式不正确,请输入正确的邮箱帐号!”的错误提示,这通常意味着系统认为您输入的邮箱地址不符合其预设的邮箱格式标准。根据提供的信息,这个错误可能是由于邮箱地址中包含了特殊字符(例如点 .,加号 +,等),而PbootCMS的正则表达式......
  • 傲软录屏下载解锁版安装教程
    前言傲软录屏是一款非常好用的专业录屏软件,主要是可以用于录制各种电脑的视频内容,不管是游戏也好,还是各种电脑的桌面操作,还有各种视频会议,不仅可以将电脑屏幕的内容录制下来,最关键的是还可以录制电脑的音频,这样画面就可以和声音对的上了。支持多种格式的保存,MP4,AVI,WMV,MOV等等,现在......
  • ipguard的安装与加解密配置
    控制策略的好与坏与目标明确性、环境适应性、实施效果、资源配置、数据支持、反馈机制、利益相关者需求、风险管理、技术支持以及组织文化等多个因素密切相关。1.IP-Guard安装基础条件1.1.资源信息介绍机器信息CPU内存磁盘空间windowsserver20164vcpu8GRAM......
  • shell脚本处女作
    #!/bin/bashrm-rf/root/.ssh/{id_rsa,id_rsa.pub}ssh-keygen-trsa-f/root/.ssh/id_rsa-N""&>/dev/nullend=$(tail-1/passwd1.txt)echo>/success.txtecho>/failure.txt#b(){sshpass-p"$passwd"ssh-oConnectTimeo......
  • 可以直接考试rhce么?考试技巧分享
    RHCE考试并非仅仅着眼于理论知识的考查,而是将重点更多地置于实际操作能力方面。它明确要求考生必须具备独立完成诸如Linux系统的安装、配置、优化、故障排除以及网络服务等一系列任务的能力。就在当下,让我们一同深度剖析如何能够高效地备战RHCE考试,共同分享那些能够为您提供强......
  • Matlab 2024a下载安装教程附安装包全网最详细的教程怎样安装?
    Matlab2024a是一款超厉害的数学计算软件。Matlab2024a下载安装教程附安装包全网最详细的教程怎样安装?它有很多新功能和改进呢。比如有新的常微分方程求解器,能更好地解决复杂微分方程问题,还支持灵敏度分析。后向斜杠操作符也改进了,处理大规模矩阵运算更高效。现在在脚本里可......
  • 评估您的数据是否可用于人工智能的三个考虑因素
    评估您的数据是否可用于人工智能的三个考虑因素​多数组织正在人工智能和生成性人工智能的炒作中迷失方向。在许多情况下,他们并没有准备好人工智能项目所需的数据基础。三分之一的高管认为,只有不到50%的组织有了人工智能所需的数据,而多数组织并未准备好。因此,在开展人工智能......