精华内容
下载资源
问答
  • solidity virtual关键字
    2022-07-21 16:24:22

    solidity中使用virtual实现hooks

    
    pragma solidity ^0.8.0;
    
    
    
    contract Test {
        
        constructor () {
    
        }
    
        event ShowSomething(string indexed, int);
    
    
        function test() public {
            _begin();
            emit ShowSomething("ffff", 2);
            _end();
        }
    
        // hook
        function _begin() internal virtual {
        }
    
        function _end() internal virtual {
        }
    }
    
    
    contract GenTest is Test{
    
        constructor () {
    
        }
    
        event Begin(string indexed);
        event  End(string indexed);
    
        // 实现父类Test中的hooks
        function _begin()   internal  override{
            emit Begin("fffff");
            Test._begin();
        }
    
        // 实现父类Test中的hooks
        function _end()   internal override{
            emit End("xxxxxxxxx");
            Test._end();
        }
        
    }
    
    
    更多相关内容
  • virtual override 方法上加上virtual关键字,重写的方法加上override方法 solidity 0.6.0后 不可再重写状态变量 // SPDX-License-Identifier: MIT pragma solidity ^0.6.0; contract HelloVritual{ // 使用关键字...

    目录

    1. virtual override2. 抽象 abstract3. 接口 interface4. 库,library5. 合约销毁 selfdestruct

    1. virtual override

    方法上加上virtual关键字,重写的方法加上override方法

    solidity 0.6.0后 不可再重写状态变量

    // SPDX-License-Identifier: MIT
    pragma solidity ^0.6.0;
    
    contract HelloVritual{
        // 使用关键字virtual可以被重写
        function test() public pure virtual returns(string memory){  
            
            return "abc";
        }
    
    }
    
    contract HelloOverride is HelloVritual{
      
    展开全文
  • Solidity学习笔记

    2021-05-20 15:07:35
    1、Solidity特性 相较于javaScript 新增address类型; 语言内嵌框架支持支付;提供了payable等关键字,可以在语言层面直接支持支付; 使用区块链进行数据存储。...2、Solidity关键字 pragma:杂注,在

    1、Solidity特性

    相较于javaScript

    • 新增address类型;
    • 语言内嵌框架支持支付;提供了payable等关键字,可以在语言层面直接支持支付;
    • 使用区块链进行数据存储。数据的每个状态都可以永久存储,所以再使用时需要确定变量使用内存,还是区块链存储;
    • 运行环境实在去中心化的网络上,所以需要强调合约或函数执行的调用方式
    • 不同的异常机制。一旦出现异常,所有的执行都将回回撤,这主要是保证合约执行的原子性,避免中间状态的出现的数据不一致;

    2、Solidity关键字

    • pragma:杂注,在合约文件最上方。pragma solidity ^版本号;
    • address payable:与地址类型基本相同,不过多了transfersend两个成员变量。address payable可以隐式的转换为address,而address无法转换为address payable
    • view:指明函数只读不写;
    • constant:与view相同,一般只修饰状态变量,不允许赋值(除初始化以外)
    • pure:指明函数是一个纯计算的函数;
    • public:公开类型,如果属性设置为public类型,则自动生成一个get函数,外部可以访问;
    • constructor:构造函数,在部署合约时给变量赋初始值;
    • mapping(address => uint):go中的map类型
    • eventevent配合emit使用,使用event定于一个事件,在调用的时候添加emit,在外部就可以监控,放在函数内部似使用。
    • assert:断言,必须为true
    • enum:枚举,不能在函数内部定义,应该在合约内部定义。枚举类型可以转换为任意整型
    • fixed/ufixed:浮点类型,常用fixed128x20,其中128为总长度,小数位长度为20
    • bytes1/bytes2 ……:定长字节数组,里面存储的是16进制数据不是utf8类型,用的时候注意转换
    • 对于存储型(storage)的数组来说,元素类型可以是任意的(即元素也可以是数组类型,映射类型或者结构体);对于内存型(memory)的数组来说,元素类型不能是映射(mapping)类型
    • msg.sender.transfer:要给msg.sender发送
    • 高维数组定义的时候跟go是反着的,例如,一个由5个uint动态数组组成的数组是uint[][5],访问的时候跟go相同,例如,要访问第三个动态数组中的第二个uint,可以使用x[2][1],越界访问将导致调用失败回退。增加新元素,必须使用.push()或者将.length增大,变长的storage数组和bytes(不包括string)有一个push()方法。
    • 所有的复杂类型,即数组、结构体和映射类型,都有一个额外属性,“数据位置”,用来说明数据是保存在内存memory中还是存储storage
    • immutable可以在合约部署时,定义常量;

    3、数据位置

    • 函数参数(包括返回的参数)的数据位置默认都是memory,局部变量的数据位置默认是storage,状态变量的数据位置强制是storage。另外还存在第三种数据位置calldata这是一块只读的,且不会永远存储的位置,用来存储函数参数。外部函数的参数(非返回参数)的数据位置被强制指定为calldata,效果跟memory差不多。

    3.1 数据位置总结

    强制指定的数据位置

    • 外部函数的参数(不包括返回参数):calldata
    • 状态变量:storage

    默认数据位置

    • 函数参数(包括返回参数):memory
    • 引用类型的局部变量:storage
    • 值类型的局部变量:栈(stack)
      特别要求
    • 公开可见(publicly visible)的函数参数一定是memory类型,如果要求是storage类型则必须是private或者internal函数,这是为了防止随意的公开调用占用资源

    4、回退函数(fallback)

    • 回退函数(fallback function)是合约中的特殊函数;没有名字,不能有参数也不能有返回值
    • 如果在一个合约的调用中,没有其他函数与给定的函数标识符匹配(或没有提供调用数据),那么这个函数(fallback函数)会被执行
    • 每当合约收到以太币(没有任何数据),回退函数就会执行。此外,为了接受以太币,fallback函数必须标记为payable。如果不存在这样的函数,则合约不能通过常规交易接受以太币(给合约纯转账)
    • 在上下文中通常只有很少的gas可以用来完成回退函数的调用,所以使fallback函数的调用尽量廉价很重要
    • 回退函数可以使用fallback()receive()调用
      在这里插入图片描述

    在这里插入图片描述

    如果调用合约中不存在的方法,首先判断msg.data是否为空,如果不为空则调用fallback函数,如果为空则判断是否有receive方法,如果存在receive方法则调用receive,否则调用fallback函数
    在这里插入图片描述

    5、memory和storage之间的赋值

    在这里插入图片描述

    • storagememory之间是值拷贝;
    • 其他类型向storage都是值拷贝;
    • memorymemory之间是指针拷贝;
    • storagelocal storage之间是指针拷贝;
    • storage是状态变量,它的修改会改变链上数据memory是局部变量,函数调用结束后会被销毁;
    • 在合约内定义在函数外定义的是状态变量。在函数内定义的只有函数调用时才会创建,并不会改变链上数据;

    6、使用了view依然可以修改

    在这里插入图片描述
    要深入理解
    在这里插入图片描述
    view:只能从合约上读取数据
    pure:既不读取,也不存储,只是进行运算;

    7、delete的用法

    在这里插入图片描述
    在这里插入图片描述

    8、调用合约的Gas消耗

    在这里插入图片描述

    9、函数可见性

    public修饰的变量和函数,任何用户或者合约都能调用和访问(可以被当前合约调用、被继承被外部调用)。
    external 与public 类似,只不过这些函数只能在合约之外调用 - 它们不能被合约内的其他函数调用(只能被外部调用,不能被继承不能被内部调用)。

    internal 和 private 类似,可以被继承合约调用。
    private修饰的变量和函数,只能在其所在的合约中调用和访问,不能被继承合约调用。

    10、数组

    在这里插入图片描述

    • 定义局部变量的数组时,因为要开辟内存,所以必须指定数组长度,例如:uint[] memory a = new uint[](5)
    • 局部变量的数组不能使用pushpop等命令,只能通过下标修改;
    • 如果入参中有数组类型,需要指定memory或者calldata类型(和memory类似,但是只能用于参数中)。使用calldata类型时,两个函数直接可以直接传递参数时会节约gas;

    11、继承

    • 父合约中需要被重写的方法需要使用关键字virtual,子合约中重写函数中使用关键字override
    • 多线继承需要注意父合约顺序,越基础的越靠前。如果多重继承中需要重写,需要在函数override关键字后面加上(x,y)
      在这里插入图片描述
      在这里插入图片描述
    • 继承中的构造函数
      在这里插入图片描述
    • 继承中调用父合约的方法。一种是合约名.方法名另一种是super.方法名 super会自动寻找父合约。如果使用super.方法名,方法在多重父合约中都重写了,会依次调用(出栈顺序 子->父->祖)
      在这里插入图片描述

    12、合约之间调用

    在这里插入图片描述

    • 合约类型(合约地址).方法名

    13、Hash运算

    keccak256:智能合约中进行hash运算
    abi.encode:进行bytes类型的打包,会使用0补齐,更加安全
    abi.encodePacker:进行bytes类型的打包,不会使用0补齐。会出现碰撞,例如"AA","BB""A","ABB"的结果是一样的
    ecrecover:会恢复签名结果,验证签名

    14、节约gas

    • 将入参的存储位置关键字从memory改为calldata
    • 将循环体中的i += 1 替换为 ++i
    • 需要重复读写的数据先存储到局部变量,最后写入状态变量

    15、transfer、send、call

    • transfer:带有2300个Gas,如果失败会调用reverts
    • send:带有2300个Gas,返回一个bool值表示是否发送成功
    • call:发送所有的Gas,返回一个bool值表示是否发送成功和返回data。如果发送地址是一个智能合约,则通过data带回
    展开全文
  • Solidity 合约开发要掌握的特性和关键词解释,全局变量 、保留关键字、修饰符、函数可见性 速查表,常用的OpenZeppelin安全审查后的合约库,省Gas秘籍

    最近看了一些Solidity开发资料,目前latest是0.6.12,记性不好,记录一下。

    1.入门扫盲

    常用的关键词

    变量相关类型备注
    uint无符号整数uint 默认为 uint256的缩写
    mapping映射键值对存储key/val,可嵌套
    address地址类型一般是两种类型:用户或者合约,自带成员函数 transfer 和 send等,更多成员函数
    struct结构体可以有多个属性,类似Go的struct
    enum枚举通常由多个常量值构成的自定义类型
    storage引用类型永久存储在链上,类似硬盘
    memory引用类型临时存储,外部函数对某合约调用完时回收,类似内存
    calldata引用类型只读,用来存储函数传的参数,方便的在函数内引用而不占用空间。0.6.9之前只能外部调用
    delete初始化为0Solidity没有null和undefined的概念,注意:delete数组某个索引后可能留空位置。
    bytes定长字节数组类似byte[],bytes能“紧打包”,将元素连续存起来,意味使用Gas更低。
    strings特殊数组与bytes相同,但不允许用长度或索引来访问。

    更多请查看Solidity文档:全局变量 、保留关键字、修饰符、函数可见性 速查表

    函数相关类型备注
    event事件合约和区块链的通讯机制,前端可触发event方法做出反应。
    emit触发事件事件的调用方法
    indexed事件索引最多三个,特殊数据结构,前端能通过filter筛选事件,普通的是日志数据结构。
    payable函数类型表示可以接受ETH的函数
    Internal函数类型内部,类似private,继承关系可使用。
    external函数类型外部,类似public,不能在继承关系中使用。
    view函数修饰符表示函数只读不改,不会消耗Gas
    pure函数修饰符表示函数只做计算不读不改,不会消耗Gas
    virtual函数类型函数重写,接口默认会进行标记virtual,private不能使用该标记。
    override函数类型函数重写,配合父合约标记的virtual函数使用
    abstract抽象合约定于与现实分离,用于提高扩展性,消除代码重复
    interface接口不实现任何函数,只制定接口,其他合约继承后需要实现
    library两种使用方法,一种是using for,一种是直接实例化,自动添加库所有方法给一个数据类型
    is继承可用“,”多继承,存在钻石问题,注意顺序加载:base,base-A,base-A-A这样写。
    import导入可以导入其他sol文件
    constructor()构造函数初始化合约调用一次的函数
    modifier函数修饰符修饰已有的函数,并且能自定义条件函数。
    receive()特殊函数一个合约只有一个接收以太函数,在没有payable修饰符还转账情况下自动调用。
    fallback()回退函数externall类型,调用不存在的函数时调用,但是转账类型交易如果不加payable会报异常。
    全局变量类型备注
    ether费用单位以太单位,类似还有wei、 finney、 szabo
    Now时间单位当前时间戳,因为是32位,会有2038问题。类似还有seconds、minutes、hours、days、weeks、years(0.5.0因闰年已移除)
    msg.sender全局变量当前调用者的address
    msg.value全局变量当前交易的wei数量
    tx.gasprice全局变量交易的 gas 价格
    block.number全局变量当前区块号

    更多请查看Solidity文档:特殊变量和函数

    用过的一些方法

    方法名描述备注
    require()错误处理不满足条件就撤销更改,0.5版新增第二个参数可以抛出message
    assert()错误处理和 require 类似,require失败会返回剩下的Gas,assert则不会,出现严重错误时使用。
    keccak256()数学和密码学函数伪随机的散列函数,更多数学和密码学函数
    uint8()类型强转uint8 c = a * uint8(b); 类似的有uint256,uint16,但是uint8不能转到uint256。
    arr.push()数组成员方法在尾部加入新元素,类似的还有length、pop
    生成随机数0-100的随机数非安全,可能被算力强的节点利用,只打包对自己有利的区块发布到链上:uint random = uint(keccak256(now, msg.sender, randNonce)) % 100

    记录一些特别的操作

    关键词类型备注
    5 ** 2乘方操作x 的 y次方,5 ** 2 = 25
    变量名含"_"私有变量名一种习惯,区别全局变量
    public函数修饰符默认会提供getter方法
    uint[]动态数组类似的有uint[10]固定数组,Person[]结构体数组
    return (a,b,c)函数参数和返回批量返回函数值和接受值 跟 Go类似
    _;占位符modifier中的_; 表示“被修饰的函数开始执行”
    0x0黑洞地址没有私钥的地址,常用来烧币,主动报废一些token。

    记录常用的OpenZeppelin安全审查后的合约库

    库名描述备注
    SafeMath安全数学运算可防止 overflow 和 underflow 的加减乘除
    SafeCast安全类型转换和SafeMath类似,防止转换时的 overflow 和 underflow
    Ownable访问权限合约的主人才可以调用哦
    Roles角色控制、访问层次比Ownable多了个角色概念,可以进行权限分组了。
    ERC20代币标准普通代币的一些定义
    ERC721代币标准用于加密收藏品,有不可分割、不可互换、整单位交易等特性。
    Address地址检测让我看看你是个合约,还是用户

    具体描述参考:OpenZeppelin 7个最常使用的合约

    2.省Gas秘籍

    以太坊是去中心化的应用,为了防止某些用户无限循环,占用网络资源。每次执行Dapp都需要支付一定的Gas,Gas使用以太币购买。

    利用view特性

    view的定义是只读不改,不会真正改变链上任何数据。因此用户从外部调用一个view修饰的函数,不会产生任何Gas。

    如果 一个 view 函数有进行 内部调用,虽然不属于同一个合约,但依旧会产生Gas。因为调用的函数会生成事务,要进行节点验证产生成本。所以只有外部调用view是免费的。

    结构封装(Struct packing)

    struct MiniMe {
      uint32 a;
      uint32 b;
      uint c;
    }
    

    在Struct里使用合适的uint类型,并且把同样类型的变量放一起(即在 struct 中将把变量按照类型依次放置), 这样能让Solidity空间最小化。

    用uint8代替uint256并不会节省空间,因为Solidity会默认使用256保留。

    参考:
    https://learnblockchain.cn/docs/solidity/
    https://cryptozombies.io/

    展开全文
  • solidity中的重载
  • Solidity

    千次阅读 2022-07-02 10:57:31
    type©.name:获得合约的名字 type©.creationCode:获得创建合约时的字节码 type©.runtimeCode:获得合约运行时的字节码 函数类型 Solidity中的函数也可以是一种类型,并且它属于值类型,用function关键字修饰,...
  • Solidity语法大致总结

    2022-08-11 23:04:16
    Solidity的数据类型,含合约、字符串、数组、结构体、mapping映射;作用域或访问修饰符,含private、public、internal、external;函数修饰符,含pure、view等;修饰器modifier;数据位置,含memory、storage等;...
  • new、abstract、virtual、override,sealed关键字区别和使用代码示例
  • solidity:6.继承

    2022-01-14 10:06:23
    solidity 支持多继承,通过关键字 is 实现,继承的合约可以直接访问父合约的public,internal权限的变量或函数 1.继承与构造函数 有两种方法初始化父类合约,如contract A 、contract B 在继承的时候,父构造函数...
  • solidity定义一个组件语言,这个语言可以在没有Solidity下使用。该组件语言也能在Solidity源代码中被用作“在线组件”。我们从这样使用在线组件以及怎样区分其与脱机组件开始介绍,然后接下来介绍详细介绍组件。 ...
  • solidity中的抽象
  • 验证签名 Verifying Signature solidity版本变化 0.5.0 0.6.0 0.7.0 0.8.0 参考网址 此处主要是针对链接中,增加中文理解说明,有需要可查看原文 (文中参考代码主要摘自该链接)https://solidity-by-example.org/ ...
  • solidity 合约继承

    2022-06-21 23:12:14
    2 继承不允许函数或变量重名从 0.6 开始,solidity 引入了 abstract, virtual, override 几个关键字,用于重写函数。 基类中可以包含没有实现代码的函数,也就是纯虚函数,那么基类必须声明为 abstract。示例以下:....
  • Solidity基础教程:合约的继承与方法的重写 合约继承 合约继承使用is关键字 contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { ... function balanceOf(address owner) public view virtual ...
  • 区块链开发之Solidity编程基础(一)

    千次阅读 2022-01-09 16:42:33
    ETH节点为智能合约提供运行环境:EVM(Ethereum Virtual Machine)以太坊虚拟机。EVM是一个动态运行沙盒,可以将以太坊上所有的智能合约和周围环境全部隔离。因此,EVM上运行的智能合约无法访问网络、文件系统或者在...
  • solidity中的继承
  • 16-Solidity8.0多重继承

    2022-06-15 12:56:09
    16-Solidity8.0多重继承多重...将被子合同覆盖的函数必须声明为virtual.将要覆盖父函数的函数必须使用关键字override。继承顺序很重要。您必须按照从“最基础”到“最衍生”的顺序​​列出父合约。 总结 日拱一卒。...
  • solidity实战

    万次阅读 2022-01-26 17:10:45
    由于solidity更新比较快,本文会持续更新,通过案例的形式记录最新版本的写法。
  • WEB3之路(一)-- solidity学习笔记

    千次阅读 2022-07-20 21:25:00
    是一种特殊的函数,每个合约可以定义一个,并在部署合约的时候自动运行一次。...声明函数时的固定用法,想写函数,就要以function关键字开头。圆括号里写函数的参数,也就是要输入到函数的变量类型和名字。...
  • solidity是一个面向对象的静态语言,很多语法与java等语言很像,都有继承,抽象、多态等概念,这里只重点记录Solidity中的特有的内容。ps:以下有什么说的不对的地方欢迎大家指正,共同进步! 合约(Contract) ​ ...
  • solidity实现账户地址向合约账户转账

    千次阅读 2021-11-02 19:36:35
    不需要 function 关键字,也没有参数和返回值并且必须是 external 可见性和 payable 修饰. 它可以是 virtual 的,可以被重载也可以有 修改器modifier 。 在对合约没有任何附加数据调用(通常是对合约转账)是会...
  • 不需要 function 关键字,也没有参数和返回值并且必须是 external 可见性和 payable 修饰. 它可以是 virtual 的,可以被重载也可以有 修改器modifier 。 在对合约没有任何附加数据调用(通常是对合约
  • solidity 智能合约从入门到发币

    万次阅读 多人点赞 2021-01-14 11:12:35
    solidity 从入门到发币 起源于以太坊(Ethereum),设计的目的是能在以太坊虚拟机(EVM)上运行。Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。所以先从智能合约开始。 参考文档 Solidity...
  • 一个合约中最多有一个receive函数,与fallback带payable形式一样,...不需要function关键字,无参无返回值,且必须是external 与 payable 修饰。receive函数可以是virtual的,可以被重载也可以有修改器modifier。...
  • solidity中合约类似于面对对象的语言中的类。他包括了状态变量中那些长期的数据以及能够修改这些状态的函数。在一个合约中调用另一个合约(实例)的函数会执行一个EVM函数调用,它将转换上下文内容是得状态变量不...
  • solidity 的 0.6.0 版本之后: 重写函数或修饰符时,必须使用新关键字 override 接口会自动作为 virtual,在接口外部没有实现的函数必须标记为 virtual 。 仅当函数被标记为 virtual 或在接口中定义时,才可以...
  • 优秀的Solidity编程实践也应符合这一原则:每个合约都清晰、合理地定义函数的可见性,暴露最少的信息给外部,做好对内部函数可见性的管理。 同时,正确地修饰函数和变量的类型,可给合约内部数据提供不同级别的...
  • Solidity 官方文档中文版(二)

    千次阅读 2017-12-27 11:34:14
    Solidity AssemblySolidity定义了一个汇编语言,可以不同Solidity一起使用。这个汇编语言还可以嵌入到Solidity源码中,以内联汇编的方式使用。下面我们将从内联汇编如何使用着手,介绍其与独立使用的汇编语言的不同...
  • solidity0.6.0特性

    2021-04-11 11:01:16
    pragma solidity ^0.6.0; struct User { // 0.6.0后可以在合约外面定义结构体了,主要用于共享一些数据 uint a; } // 0.6.0开始数组的length属性变为了只读属性,如果需要减少数组长度,需要使用pop()函数 ...
  • 目前尝试 Solidity 编程的最好的方式是使用 Remix (需要时间加载,请耐心等待)。Remix 是一个基于 Web 的 IDE,它可以让你编写 Solidity 智能合约,然后部署并运行该...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 123
精华内容 49
热门标签
关键字:

solidity virtual关键字