• Solidity智能合约开发 — 4.1-合约创建和函数修饰器


    在创建智能合约时,会执行一次构造函数(与智能合约同名的函数)。该构造函数是可选的,但只允许有一个构造函数,也就是不支持重载。

    1、合约创建

    1.1 构造函数

    初始化合约的owner地址:

    1. address owner; // 定义owner变量
    2. bytes32 name; //定义合约创建者名字
    3. // 构造函数
    4. function OwnerToken(bytes32 _name) public {
    5. owner = msg.sender; // 在部署合约的时候,将owner设置为部署者的地址
    6. name = _name;
    7. }

    1.2 函数可见性控制 

    函数和状态变量有4种可见性类型,分别为external、public、internal和private

    • external:外部函数作为智能合约接口一部分,该函数可以从其他智能合约和交易中心调用。一个外部函数f不能从内部调用(即f不起作用,但this.f可以)。
    • public:可以在内部或通过消息调用,对于公共状态变量,会自动生成gatter函数,gatter函数介绍见下文。
    • internal:这些函数和状态变量只能内部访问,不能使用this调用。
    • private:private函数和状态仅在当前定义他们的智能合约中使用。

    对于所有public的状态变量,Solidity编译器提供了自动状态变量生成对应的gatter(访问器)的特性。gatter函数的可见性是external的,如果从内部访问getter(即没有this),他相当于一个状态变量。如果它是外部访问的(即用this),它被认为是一个函数。

    1. contract C{
    2. uint public data;
    3. function d() public{
    4. data = 10; //内部访问
    5. uint val = this.data();//外部访问
    6. }
    7. }

    2. 函数修饰器

    修饰器的关键字是modifier。modifier的可以改变函数的行为,也可以在运行函数前的自动检查某个条件,例如地址,变量,余额等。下面是使用函数修饰器的列子

    1. 定义一个叫做onlyOwnermodifier

    1. // 定义modifier
    2. modifier onlyOwner {
    3. require(msg.sender == owner); // 检查调用者是否为owner地址
    4. _; // 如果是的话,继续运行函数主体;否则报错并revert交易
    5. }

    2. 带有onlyOwner修饰符的函数只能被owner地址调用 :

    1. function changeOwner(address _newOwner) external onlyOwner{
    2. owner = _newOwner; // 只有owner地址运行这个函数,并改变owner
    3. }

    如果同一个函数有多个修饰器,它们之间用空格隔开,修饰器会被依次检查执行。修饰器或函数体中显式return语句仅仅跳出当前的修饰器和函数体。整个执行逻辑会从前一个修饰器中定义的“_”之后继续执行。

  • 相关阅读:
    图形界面四则运算计算器(Python+PyQt5)
    HTML元素大全(2)-表单
    Linux.14_多线程(重点总结)
    SIGIR2024| RAREMed: 不放弃任何一个患者——提高对罕见病患者的药物推荐准确性
    java面试题-设计模式基础
    lsof的基本应用及恢复误删的文件
    使用Go env命令设置Go的环境
    facebook审核流程
    WPF制作带图标和文字的按钮模板(通过附加属性实现)
    C# NX二次开发-设置背景颜色
  • 原文地址:https://blog.csdn.net/qincheng168/article/details/126124913