文章目录

  • 第一章 数组
    • 数组
    • 公共数组
    • 实战
  • 第二章 使用结构体和数组
    • 创建新的结构体
    • 实战
  • 第三章 keccak256散列函数使用
    • 实战
  • 第四章 事件
    • 实战

第一章 数组

数组

如果你想建立一个集合,可以使用数组这种数据类型。Solidity支持两种数组: 静态数组和动态数组

// 固定长度为3的静态数组:
uint[3] fixedArray;
// 固定长度为5的string类型的静态数组:
string[6] stringArray;
// 动态数组,长度不固定,可以动态添加元素:
uint[] dynamicArray;

你也可以建立一个结构体类型的数组,例如上一章提到的Book:

// 这是动态数组,我们可以不断添加元素
Book[] books;

记住:状态变量被永久保存在区块链中。所以在你的合约中创建动态数组来保存结构化的数据是非常有意义的。

公共数组

你可以定义公共数组,使用 public 关键字。Solidity 会为公共数组自动创建 getter 方法.。

定义公共数组的语法如下:

Book[] public books;

其它的合约可以从这个数组读取数据(但不能写入数据),所以这是一种在合约中保存公共数据的方法。

实战

为了把小蚂蚁保存在我们的合约里,并且能够让其它合约看到这些蚂蚁,我们需要一个公共数组。

  1. 创建一个数据类型为 Ant 的结构体数组,用 public 修饰,命名为:ants
pragma solidity ^0.4.20;contract AntFamily {uint dnaDigits = 12;uint dnaModulus = 10 ** dnaDigits;struct Ant {string name;uint dna;}Ant[] public ants;function createAnt(string _name, uint _dna) {}}

第二章 使用结构体和数组

创建新的结构体

还记得上个例子中的 Book 结构体吗?

struct Book {string name;uint page;
}Book[] public books;

现在我们学习创建新的 Book 结构体,然后把它加入到名为 book 的数组中。

// 创建一个新的Book:
Book fish = Book("fish", 156);
// 将新创建的fish添加进book数组:
books.push(fish);

你也可以将上面的两步合并成一步,用一行代码实现更简洁:

books.push(Book("fish", 156));

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

uint[] numbers;
numbers.push(1);
numbers.push(2);
numbers.push(3);
// 这时候numbers数组是 [1, 2, 3]

实战

让我们创建名为createAnt的函数来做点儿什么吧。

  1. 在函数体里新创建一个 Ant, 然后把它加入 ants 数组中。 新创建蚂蚁的 name 和 dna,来自于函数的参数。
  2. 让我们用一行代码简洁地完成它。
pragma solidity ^0.4.20;contract AntFamily {uint dnaDigits = 12;uint dnaModulus = 10 ** dnaDigits;struct Ant {string name;uint dna;}Ant[] public ants;function createAnt(string _name, uint _dna) {ants.push(Ant(_name, _dna));}}

第三章 keccak256散列函数使用

散列函数keccak256是把一个字符串转换为一个256位的16进制数字。字符串的一个微小变化会引起散列数据的极大变化。在我们的课程中,我们利用它来造一个伪随机数。

下面是一个例子:

//bc6bb462e38af7da48e0ae7b5cbae860141c04e5af2cf92328cd6548df111fcb
keccak256("xxx");
//3a60bbc72c8477330650d5aae5e7d73f0d15a6efe7e8aab4fa3c33a3a8c3b467
keccak256("xxy");

如上所示,输入的字符串只改变了一个字母,输出就已经天壤之别了。

注: 在区块链中安全地产生一个随机数是一个很难的问题,本课程的方法不安全,但是在我们的蚂蚁DNA算法里不是那么重要,这已经很好地满足我们的需求了。

实战

建立一个函数,命名为createRandomAnt。它将被传入一个变量 _name (数据类型是 string)。

  1. 函数的第一行代码取 _name 的 keccak256 散列值生成一个伪随机十六进制数,类型转换为 uint, 最后保存在类型为 uint 名为 rand 的变量中。
  2. 我们只想让我们的DNA的长度为12位。所以第二行代码应该 计算 上面计算的数值对 dnaModulus 求余数(%),结果保存在一个类型为 uint 的变量里,命名为 randDna。
  3. 第三行调用 createAnt 函数, 传入参数: _name 和 randDna。
  4. 整个函数应该是5行代码 (包括函数的结束符号 } )。
pragma solidity ^0.4.20;contract AntFamily {// 在这里建立事件uint dnaDigits = 12;uint dnaModulus = 10 ** dnaDigits;struct Ant {string name;uint dna;}Ant[] public ants;function createAnt(string _name, uint _dna) {ants.push(Ant(_name, _dna));}function createRandomAnt(string _name) {uint rand = uint(keccak256(_name));uint randDna = rand % dnaModulus;createAnt(_name, randDna);}}

第四章 事件

事件是合约和区块链通讯的一种机制。你的应用可以“监听”某些事件,并做出反应。我们使用event关键字来定义事件,使用emit关键字在函数中触发事件。

实战

我们想每当一个蚂蚁创造出来时,我们的应用都能监听到这个事件,并将它显示出来。

  1. 定义一个事件叫做NewAnt。

    它有3个参数: antId (uint) 带indexed属性, name (string), 和 dna (uint)。

  2. 修改 createAnt 函数使得当新蚂蚁造出来并加入ants数组后,生成事件NewAnt。

  3. 需要定义蚂蚁id。 array.push() 返回数组的长度类型是uint,因为数组的第一个元素的索引是 0, 所以array.push() - 1 将是我们加入的蚂蚁的索引。 ants.push() - 1 就是 id,数据类型是 uint。在下一行中你可以把它用到 NewAnt 事件中。

pragma solidity ^0.4.20;contract AntFamily {event NewAnt(uint indexed antId, string name, uint dna);uint dnaDigits = 12;uint dnaModulus = 10 ** dnaDigits;struct Ant {string name;uint dna;}Ant[] public ants;function createAnt(string _name, uint _dna) {uint id = ants.push(Ant(_name, _dna)) - 1;emit NewAnt(id, _name, _dna);}function createRandomAnt(string _name) {uint rand = uint(keccak256(_name));uint randDna = rand % dnaModulus;createAnt(_name, randDna);}}

【蚂蚁链学习2】蚂蚁链智能合约初级语法(数组、结构体、散列函数、事件)相关推荐

  1. 区块链学习笔记21——ETH智能合约

    区块链学习笔记21--ETH智能合约 学习视频:北京大学肖臻老师<区块链技术与应用> 笔记参考:北京大学肖臻老师<区块链技术与应用>公开课系列笔记--目录导航页 智能合约简介 ...

  2. Zeppelin:用于区块链应用的开源安全智能合约架构

    9月15日,Zeppelin的路线图建议发布.Zeppelin是一种构建安全智能合约的开源架构,遵循MIT许可.该建议的推出正是时候,从DevCon2大会上围绕着智能合约形式验证的报告和讨论的次数上就 ...

  3. solidity payable_以太坊区块链搭建与使用(五)-智能合约Solidity

    一.智能合约Solidity开发工具 1.remix-ide http://remix.ethereum.org/ 在线版本,也可以去github下载安装到本地.开发.编译.发布.执行.测试 2.re ...

  4. 【区块链技术开发】剖析区块链Ganache模拟器工具及其智能合约部署区块链的查询方式

    专栏:[区块链技术开发] 前期文章: [区块链技术开发]基于Web3.js以太坊网络上的智能合约的交互及其应用 [区块链技术开发]OpenZeppelin智能合约库:提高智能合约的安全性和可靠性,加速 ...

  5. SAP云平台,区块链,超级账本和智能合约

    前一篇文章<Hyperledger Fabric on SAP Cloud Platform>,我的同事Aviva已经给大家介绍了基于区块链技术的超级账本(Hyperledger)的一些概 ...

  6. 在Xuper链上部署Java语言智能合约和分析存证合约的实现逻辑

    前言 这篇文章咱们先简单的叙述下官方刚发布的最新版本中的native部署java语言编写的智能合约的过程然后再说下存证合约的代码实现逻辑,下一篇文章咱们说下如何根据自己公司的业务逻辑定义合约里面的数据 ...

  7. 赛联区块链培训:Web3的核心要素——区块链、加密资产、智能合约和预言机

    在2008年,中本聪发布了比特币白皮书,彻底颠覆了我们对数字化交易的概念,并首次提出了一种无需可信中间方的安全在线交易模式.中本聪写道:"需要基于加密证明,而非信任,来建立电子支付系统.&q ...

  8. 关于区块链、Web3.0、智能合约、DApp、DAO一文解释清楚

    目录 区块链(Block Chain) 概念 使用范围 Web3.0 智能合约(Smart Contract) DApp(Decentralized Application) DAO(Decentra ...

  9. 区块链论文7(oyente智能合约漏洞检测工具)

    Making Smart Contracts Smarter 文章路径 参考链接1 参考链接2 参考链接3 Abstract: Cryptocurrencies record transactions ...

  10. 区块链每日必学:智能合约如何接收以太

    目前来看,智能合约接受以太共有五种可能性: 1. receive() 一个合约最多有一个 receive 函数, 声明函数为: receive() external payable {} 无需 fun ...

最新文章

  1. hadoop 依赖式job_Hadoop Job使用第三方依赖jar文件
  2. SQL中的事物【转】
  3. 张一鸣:优秀年轻人的五个特点
  4. HTML5外贸实木家具商城网站源码
  5. 微信小程序 页面如何自动滚动到底部
  6. MongoDB 运行状态、性能监控,分析
  7. 学习: 导航器添加修饰符
  8. python基础篇–变量和简单的数据类型(下)
  9. 记:用notepad2替换系统自带记事本notepad
  10. 推荐一款录屏软件——EV录屏
  11. python结构_科学网—Python与结构分析(1)---反应谱 - 潘超的博文
  12. 两幅图像幅度谱和相位谱替换
  13. bat的errorlevel || bat判断语句是否执行成功
  14. Redis 微博微信场景使用案例
  15. 2021-05-04 16:37:16.550 ERROR 3268 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] :
  16. easyUI-疯狂的秀才
  17. 朗涛任命Juanita Zhang为中国大陆区总经理,Peggy Hon为中国香港区总经理
  18. PDF不能编辑怎么办,如何去掉编辑权限
  19. U牌“唤醒生命,未来可7”
  20. 利用beef盗取浏览器cookie,并实现页面跳转

热门文章

  1. VegaFEM免费试用
  2. 由摊余成本法谈到债券估值
  3. 低信噪比环境下GPS信号识别捕获技术
  4. 路飞学城Python-Day5
  5. Redhat 9.0之xtt+xft2,可显示粗斜体美化总结(第二版)
  6. 重置Win10网络网卡命令
  7. 华为od机考真题-平安果
  8. Typora恢复文件,找回忘记保存的记录
  9. Java获取区间随机数公式
  10. 【物联网开发基础】plc简介