• solidty-基础篇-结构体和数组,私有 / 公共函数,函数的返回值和修饰符,事件


    使用结构体和数组

    创建新的结构体

    struct Person {
      uint age;
      string name;
    }
    Person[] public people;
    
    • 1
    • 2
    • 3
    • 4
    • 5

    这个是Person 结构,接下来我们创建新的 Person 结构,然后把它加入到名为 people 的数组中.

    // 创建一个新的Person:
    Person evelyn = Person(16, "Evelyn");
    
    // 将新创建的satoshi添加进people数组:
    people.push(evelyn);
    //也可以两步并一步,用一行代码更简洁:
    people.push(Person(16, "Evelyn"));
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    注:array.push() 在数组的 尾部 加入新元素 ,所以元素在数组中的顺序就是我们添加的顺序

    私有 / 公共函数

    Solidity 定义的函数的属性默认为公共。 这就意味着任何一方 (或其它合约) 都可以调用你合约里的函数。

    显然,不是什么时候都需要这样,而且这样的合约易于受到攻击。 所以将自己的函数定义为私有是一个好的编程习惯,只有当你需要外部世界调用它时才将它设置为公共。

    定义一个私有的函数,在函数名字后面使用关键字 private 即可:

    uint[] numbers;
    function _addToArray(uint _number) private {
      numbers.push(_number);
    }
    
    • 1
    • 2
    • 3
    • 4

    这意味着只有我们合约中的其它函数才能够调用这个函数,给 numbers 数组添加新成员。

    函数的返回值和修饰符

    要想函数返回一个数值,按如下定义:

    string greeting = "What's up dog";
    function sayHello() public returns (string) {
      return greeting;
    }
    
    • 1
    • 2
    • 3
    • 4

    Solidity 里,函数的定义里可包含返回值的数据类型(如本例中 string)。
    上面的函数实际上没有改变 Solidity 里的状态,即,它没有改变任何值或者写任何东西。
    把函数定义为 view, 意味着它只能读取数据不能更改数据,
    把函数定义为 pure , 表明这个函数甚至都不访问应用里的数据,它的返回值完全取决于它的输入参数

    function sayHello() public view returns (string) {
    
    function _multiply(uint a, uint b) private pure returns (uint) {
      return a * b;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    散列函数Keccak256

    散列函数keccak256,它用了SHA3版本。一个散列函数基本上就是把一个字符串转换为一个256位的16进制数字。字符串的一个微小变化会引起散列数据极大变化。

    //6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
    keccak256("aaaab");
    //b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
    keccak256("aaaac");
    
    • 1
    • 2
    • 3
    • 4

    事件

    事件 是合约和区块链通讯的一种机制。你的前端应用“监听”某些事件,并做出反应。

    // 这里建立事件
    event IntegersAdded(uint x, uint y, uint result);
    
    function add(uint _x, uint _y) public {
      uint result = _x + _y;
      //触发事件,通知app
      IntegersAdded(_x, _y, result);
      return result;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    你的 app 前端可以监听这个事件。JavaScript 实现如下:

    YourContract.IntegersAdded(function(error, result) {
      // 干些事
    })
    
    • 1
    • 2
    • 3
  • 相关阅读:
    基于单片机GP2D12测距-proteus仿真-源程序
    开源LC3编解码器测试Demo
    6187. 完成所有交易的初始最少钱数(每日一难phase2--day19)
    系统架构师笔记——计算机网络
    Himall商城图形码帮助类二维码中生成图片(2)
    matlab实现杨氏双缝干涉实验可视化界面
    RabbitMQ 高级功能
    【Proteus仿真】Arduino UNO利用74LS148扩展中断
    C++实战之基于多态的文件交互型职工管理系统的实现
    耐心一些,总有一种清理方法能让你靠近幸福
  • 原文地址:https://blog.csdn.net/weixin_52723971/article/details/125547598