美文网首页
【Solidity学习笔记】函数、变量的可见性

【Solidity学习笔记】函数、变量的可见性

作者: 海阳之新 | 来源:发表于2018-03-30 18:15 被阅读42次

3.9.1可见性

函数或者状态变量的可见性定义了谁可以看到它。
函数和状态变量有四种可见性:external、public、internal、private
函数可见性默认为public,状态变量可见性默认为internal。各可见性函数的含义如下:
external:外部函数只能由其他合约调用,或者通过交易调用。外部函数f不能被内部函数调用,
也就是说,f()没有用,但是this.f()有用。不能把external可见性应用到状态变量。
public:公共函数和状态变量可以用所有可行办法访问。编译器生成的存取器(accessor)函数
都是公共状态变量。用户不能创建自己的存取器。事实上,它只生成getters,而不生成setters。
internal:内部函数和状态变量只可以内部访问,也就是说,从当前合约内和继承它的合约访问。
不可以使用this访问它。状态变量默认为internal,可以在当前合约内和继承它的合约访问。
private:私有函数和状态变量类似于内部函数,但是继承合约不可以访问它们。
下面给出了可见性和存取器(accessor)的一个示例:

pragma solidity ^0.4.21;

contract sample1
{
    int public b = 78; //int256型,public
    int internal c = 90;
    function sample1()
    {
        this.a(); //外部访问
        a(); //编译会出错
        b = 21; //内部访问,internal,类似php中的protect
        this.b; //外部访问
        this.b(); //外部访问
        this.b(8); //编译会出错
        this.c(); //编译会出错
        c = 9; //内部访问,internal,类似php中的protect
    }

    function a() external //外部修饰符
    {

    }
}


contract sample2
{
    int internal d = 9; //内部访问,internal,类似php中的protect
    int private e = 90; //与php中的一致,仅限在类内部使用,不能被继承
}

contract sample3 is sample2 //is为继承关键词,相当于php中的extend
{
    sample1 s;
    function sample3()
    {
        s = new sample1();
        s.a(); //外部访问
        var f = s.b; //外部访问
        s.b = 18; //编译会出错,b是内部变量,不能访问到
        s.c(); //编译会出错
        d = 8; //内部访问
        e = 7; //编译会出错
    }
}

风格建议

Yes

function kill() public onlyowner { #函数的可见性修饰符应该在任何自定义修饰符之前出现。
    selfdestruct(owner);
}

No

function kill() onlyowner public {
    selfdestruct(owner);
}

相关文章

  • 【Solidity学习笔记】函数、变量的可见性

    3.9.1可见性 函数或者状态变量的可见性定义了谁可以看到它。函数和状态变量有四种可见性:external、pub...

  • 区块链Solidity安全-默认可见性漏洞

    默认可见性漏洞说明 Solidity中的函数可以被可见性说明符修饰,可见性说明符会定义用户如何调用Solidity...

  • 以太坊智能合约编写技巧

    函数 Solidity的函数结构如上 函数可见性分析 public - 任意访问 private - 仅当前合约内...

  • 3.5 solidity 可见性和函数

    3.5 solidity 可见性和函数 可见性 public 公开函数是合约接口的一部分,可以通过内部,或者消息来...

  • 3.3 全局变量和函数

    3.3 全局变量和函数 全局变量和函数可以理解为solidity提供的一些API,在我们编写智能合约的时候,我们可...

  • JavaScript作用域链

    作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域...

  • 关于作用域链

    作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域...

  • js作用域和作用域链

    一、作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作...

  • JS 作用域与作用域链详解

    作用域 作用域就是变量和函数的可访问范围,控制着变量和函数的可见性与生命周期,在JavaScript中变量的作用域...

  • 2017-9-13学习总结

    今天上午学习了程序的结构。 笔记内容: 一.作用域:是标识符(变量、常量、类、对象、函数等)的有效范围; 可见性:...

网友评论

      本文标题:【Solidity学习笔记】函数、变量的可见性

      本文链接:https://www.haomeiwen.com/subject/hvnicftx.html