博客
关于我
solidity之library 用法(二)库的核心用法总结(一个特殊的contract合约)
阅读量:669 次
发布时间:2019-03-15

本文共 1623 字,大约阅读时间需要 5 分钟。

solidity库的内存与函数调用的深层原则解析

在solidity编写合约时,**库(Library)**作为合约的特殊化实现,具备独特的内存管理机制,这与普通用户合约存在显著差异。本文将重点阐述库内存类型传递的核心原则,以及如何与用户合约协同工作。


库内存类型传递的核心原则

“库的内存类型都是通过引用来传递的”是solidity库编写的核心原则。具体而言,库中的函数参数是通过引用类型传递,这与用户合约中的内存与存储类型处理方式有根本区别。

在用户合约中,函数参数的内存类型为:

  • memory:函数参数的值会被存储到合约的内存中,调用时必须先复制到内存。
  • storage:函数参数的值会被存储到合约的存储中,适用于需要持久化数据的场景。
  • calldata:函数参数的值会被暂时存储在调用标签中,函数处理后立刻丢弃。

而在库中,函数参数是通过引用传递,这意味着:

  • 如果调用者传递的是memory类型数据,库函数将直接操作这些内存数据。
  • 如果传递的是storage类型数据,库函数将通过引用访问用户合约的存储空间。
  • 传递calldata类型数据的情况在库中同样适用,但由于调用类型的不同,处理方式会有所差异。

这一点要求开发者在调用库函数时,严格按照用户合约的传参方式进行操作,确保函数参数的传递和处理是兼容的。


与用户合约的内存管理差异

区分在于,用户合约与库合约在内存管理上的处理方式截然不同

  • 用户合约

    • private函数:函数参数引用类型必须是storagememory
    • internal函数:函数参数引用类型仍需是storagememory
    • public函数:函数参数引用类型只能是memory
    • external函数:函数参数引用类型只能是calldata

    需要注意的是,external类型函数无法对参数存储空间进行修改。

  • 库合约

    • 对于库合约,memorystorage等关键字与privateinternalpublicexternal无关。
    • 当调用库函数时,函数参数的类型完全由调用合约的传参方式决定,例如调用者传递memory类型数据,则库函数将直接处理这些内存数据。
  • 这一差异要求开发者在使用库合约时,需要根据调用方式灵活处理函数参数的传递方式,避免在传参类型上产生混淆。


    Parameters的类型决定了一切

    在呼叫库合约的函数时,函数参数的类型直接影响其内存传递方式:

    • 如果传递memory类型数据,函数处理时将直接操作调用者合约的内存副本。
    • 如果传递storage类型数据,函数处理时将通过引用访问调用者合约的存储空间。
    • calldata类型数据的处理方式则需遵循特定的规则(如函数处理后数据无法持久化保存)。

    这一机制强调了对呼叫方式的严格控制,确保库函数能够正确处理不同的传参类型需求。


    函数类型对内存传递的影响

    不同类型的函数(如internalpublicexternal)对函数参数的内存类型有严格的限制:

    • public函数:只能接收memory类型参数,因为函数执行后不会持久化存储数据。
    • external函数:只能接收calldata类型参数,calldata类型的数据在函数处理后会被丢弃。
    • internalprivate函数:可以接收memorystorage类型参数,具体取决于需求。

    这种设计理念要求开发者在选择函数类型时,充分考虑其对性能和数据持久性的影响。


    库函数与用户合约的内存继承关系

    从内存管理角度来看,库合约可以看作是一个独立的合约,尽管它并非显式地作为基类合约存在。调用库函数时,其this指向的是调用者合约的地址,而不是库合约本身。这一机制确保了库函数能够在不同合约上重复使用,同时保护了数据的安全性。

    总之,库合约的内存类型传递方式与用户合约的内存处理方式存在本质区别,这一特性需要开发者在编写和使用库函数时格外注意,以确保数据的正确传递和处理。

    转载地址:http://msmmz.baihongyu.com/

    你可能感兴趣的文章
    Python 从入门到精通:30天速成教程到底有多狠?你能坚持下来吗?
    查看>>
    Python 从数据库中存储和检索密码的最安全方法
    查看>>
    Python语言及其应用 - 知识点遍历
    查看>>
    Python 优化提速的 8 个小技巧
    查看>>
    Python 余弦相似度与皮尔逊相关系数 计算
    查看>>
    python 使用execjs 报编码错误解决办法,UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 145: il
    查看>>
    python 使用filetype校验文件
    查看>>
    Python 使用flush函数将缓冲区数据立即写磁盘
    查看>>
    python 使用in判断不准确,in不好使
    查看>>
    Python 使用pandas 进行查询和统计详解
    查看>>
    Redis 配置文件redis.conf详细解释
    查看>>
    python网络爬虫(2)——scrapy框架的基础使用
    查看>>
    python网络爬虫实例教程试读_Python网络爬虫实战教程(全套完整版) - 学途无忧网 - 做技术的王者 - Powered By EduSoho...
    查看>>
    Python 使用哈希函数用于加密
    查看>>
    Python 依赖管理的革新——Poetry 深度解析
    查看>>
    python 保留精度及增加去除数字的千位分隔符(金额化数字)
    查看>>
    python 倒计时 9,8,7,。。。。。。0
    查看>>
    Python 入门开发学习笔记之数据的增删改查
    查看>>
    Python 入门教程(2)搭建环境 2.4、VSCode配置Node.js运行环境
    查看>>
    Python 八大排序算法合集
    查看>>