合约的基础内容

  • 版本制定
  • 合约内容
    一个合约的模板如下所示
pragma solidity ^0.4.19;contract HelloWorld {}

状态变量和整数

状态变量是被永久地保存在合约中。也就是说它们被写入以太币区块链中. 想象成写入一个数据库。

contract Example {// 这个无符号整数将会永久的被保存在区块链中uint myUnsignedInteger = 100;
}

无符号整数:uint
uint 无符号数据类型, 指其值不能是负数,对于有符号的整数存在名为 int 的数据类型。

数学运算

加法: x + y
减法: x - y,
乘法: x * y
除法: x / y
取模 / 求余: x % y
乘方:x**y

结构体

结构体允许使用更为复杂的数据结构

struct Person {uint age;string name;
}

数组

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

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

也可以创建一个结构体类型的数组

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

公共数组

可以定义 public 数组, Solidity 会自动创建 getter 方法. 语法如下:

Person[] public people;

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

定义函数

定义函数的语句如下

function eatHamburgers(string _name, uint _amount) {}

使用结构体和数组

创建新的结构体

struct Person {uint age;string name;
}Person[] public people;

然后把数据添加到数组中,采用push的方式

// 创建一个新的Person:
Person satoshi = Person(172, "Satoshi");// 将新创建的satoshi添加进people数组:
people.push(satoshi);或者直接一步直接推进去
people.push(Person(16, "Vitalik"));

私有、公有函数

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

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

以下为定义一个私有函数的方式

uint[] numbers;function _addToArray(uint _number) private {numbers.push(_number);
}

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

可以看到,在函数名字后面使用关键字 private 即可。和函数的参数类似,私有函数的名字用(_)起始。

函数的更多属性

返回值

string greeting = "What's up dog";function sayHello() public returns (string) {return greeting;
}

函数的修饰符

上面的函数实际上没有改变 Solidity 里的状态,即,它没有改变任何值或者写任何东西。

这种情况下我们可以把函数定义为 view, 意味着它只能读取数据不能更改数据:

function sayHello() public view returns (string) {

Solidity 还支持 pure 函数, 表明这个函数甚至都不访问应用里的数据,例如:

function _multiply(uint a, uint b) private pure returns (uint) {return a * b;
}

这个函数甚至都不读取应用里的状态 — 它的返回值完全取决于它的输入参数,在这种情况下我们把函数定义为 pure.

Keccak256 和 类型转换

如何返回一个全随机的uint值呢

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

这在 Ethereum 中有很多应用,但是现在我们只是用它造一个伪随机数。

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5
keccak256("aaaab");
//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9
keccak256("aaaac");

显而易见,输入字符串只改变了一个字母,输出就已经天壤之别了。

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

类型转换

uint8 a = 5;
uint b = 6;
// 将会抛出错误,因为 a * b 返回 uint, 而不是 uint8:
uint8 c = a * b;
// 我们需要将 b 转换为 uint8:
uint8 c = a * uint8(b);

a * b 返回类型是 uint, 但是当我们尝试用 uint8 类型接收时, 就会造成潜在的错误。如果把它的数据类型转换为 uint8, 就可以了,编译器也不会出错。

事件

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

// 这里建立事件
event IntegersAdded(uint x, uint y, uint result);function add(uint _x, uint _y) public {uint result = _x + _y;//触发事件,通知appIntegersAdded(_x, _y, result);return result;
}

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

YourContract.IntegersAdded(function(error, result) {// 干些事
})

Web3.js

我们的 Solidity 合约完工了! 现在我们要写一段 JavaScript 前端代码来调用这个合约。

以太坊有一个 JavaScript 库,名为Web3.js

在后面的里,我们会进一步地教你如何安装一个合约,如何设置Web3.js。 但是现在我们通过一段代码来了解 Web3.js 是如何和我们发布的合约交互的吧。

// 下面是调用合约的方式:
var abi = /* abi是由编译器生成的 */
var ZombieFactoryContract = web3.eth.contract(abi)
var contractAddress = /* 发布之后在以太坊上生成的合约地址 */
var ZombieFactory = ZombieFactoryContract.at(contractAddress)
// `ZombieFactory` 能访问公共的函数以及事件// 某个监听文本输入的监听器:
$("#ourButton").click(function(e) {var name = $("#nameInput").val()//调用合约的 `createRandomZombie` 函数:ZombieFactory.createRandomZombie(name)
})// 监听 `NewZombie` 事件, 并且更新UI
var event = ZombieFactory.NewZombie(function(error, result) {if (error) returngenerateZombie(result.zombieId, result.name, result.dna)
})// 获取 Zombie 的 dna, 更新图像
function generateZombie(id, name, dna) {let dnaStr = String(dna)// 如果dna少于16位,在它前面用0补上while (dnaStr.length < 16)dnaStr = "0" + dnaStrlet zombieDetails = {// 前两位数构成头部.我们可能有7种头部, 所以 % 7// 得到的数在0-6,再加上1,数的范围变成1-7// 通过这样计算:headChoice: dnaStr.substring(0, 2) % 7 + 1,// 我们得到的图片名称从head1.png 到 head7.png// 接下来的两位数构成眼睛, 眼睛变化就对11取模:eyeChoice: dnaStr.substring(2, 4) % 11 + 1,// 再接下来的两位数构成衣服,衣服变化就对6取模:shirtChoice: dnaStr.substring(4, 6) % 6 + 1,//最后6位控制颜色. 用css选择器: hue-rotate来更新// 360度:skinColorChoice: parseInt(dnaStr.substring(6, 8) / 100 * 360),eyeColorChoice: parseInt(dnaStr.substring(8, 10) / 100 * 360),clothesColorChoice: parseInt(dnaStr.substring(10, 12) / 100 * 360),zombieName: name,zombieDescription: "A Level 1 CryptoZombie",}return zombieDetails
}

我们的 JavaScript 所做的就是获取由zombieDetails 产生的数据, 并且利用浏览器里的 JavaScript 神奇功能 (我们用 Vue.js),置换出图像以及使用CSS过滤器。在后面的课程中,你可以看到全部的代码。

Solidity教程一相关推荐

  1. AUTOCAD自学教程一

    AUTOCAD自学教程一 AUTOCAD自学教程 在学习任何一款软件的时候,第一步也是非常必要的一步就是如何的安装软件. 下面我们讲解如何的安装这个软件. 1.安装autocad 2.安装产品 3.正 ...

  2. pytorch打印模型参数_Pytorch网络压缩系列教程一:Prune你的模型

    Pytorch网络压缩系列教程一:Prune你的模型 本文由林大佬原创,转载请注明出处,来自腾讯.阿里等一线AI算法工程师组成的QQ交流群欢迎你的加入: 1037662480 深度学习模型取得了前所未 ...

  3. MongoDB 教程一: 安装和使用 (Mongodb启动命令mongod参数说明)

    视频: MongoDB 教程一: 安装和使用 Mongodb启动命令mongod参数说明 我们可以通过mongod --help查看mongod的所有参数说明,以下是各参数的中文解释. 基本配置 –q ...

  4. 初识c语言教程,第1课C语言教程一: 初识C程序.doc

    第1课C语言教程一: 初识C程序 第1课 初识C程序 教学目标 1.计算机语言介绍 2.了解C语言 3.如何学好C语言(多做题,多上机调试程序) 4.C语言上机调试环境 教学过程 计算机程序设计语言的 ...

  5. 大学英语综合教程一 Unit 8 课文内容英译中 中英翻译

    大学英语综合教程一 Unit 8 课文内容英译中 中英翻译   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文 ...

  6. 大学英语综合教程一 Unit 2 课文内容英译中 中英翻译

    大学英语综合教程一 Unit 2 课文内容英译中 中英翻译   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文 ...

  7. 原创 | k8s系列教程一:开篇

    作者:潘吉祥 欢迎加入k8s学习系列教程,在接下来的系列文章,你将可以在较短的时间内达到入门k8s的效果. k8s是什么 Kubernetes(K8S)作为Google在2014年发布的一个开源项目, ...

  8. 大学英语综合教程一 Unit 6 课文内容英译中 中英翻译

    大学英语综合教程一 Unit 6 课文内容英译中 中英翻译   大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文 ...

  9. R语言七天入门教程一:配置运行环境

    R语言七天入门教程一:配置运行环境 一.R语言介绍 1.R语言是什么? 参考:R语言教程-R语言介绍 R 语言是为数学研究工作者设计的一种数学编程语言,主要用于统计分析.绘图.数据挖掘.R语言有丰富的 ...

  10. Spring认证中国教育管理中心-Spring Data Neo4j教程一

    原标题:Spring认证中国教育管理中心-Spring Data Neo4j教程一(Spring中国教育管理中心) 5. 开始 我们为 SDN 提供了 Spring Boot 启动器.请通过您的依赖管 ...

最新文章

  1. ohmyzsh用在mysql_oh-my-zsh,让你的终端从未这么爽过
  2. Go开发之路 -- 指针类型
  3. LeetCode Flatten a Multilevel Doubly Linked List(dfs)
  4. ELK集群的搭建和Elasticsearchd api的简单使用
  5. 数据结构经典算法集锦
  6. 新人如何快速上手项目管理
  7. random(随机函数生成)
  8. 如何隐藏 video 元素的下载按钮
  9. Spring MVC学习总结(7)——Spring MVC整合Ehcache缓存框架
  10. 树形图,多层级目录等其他名称待补充……
  11. 【实践】LightSeq:高性能NLP序列推理实践-字节跳动.pdf(附下载链接)
  12. 尚硅谷设计模式-观察者模式
  13. JAVA常见算法题(十九)
  14. 解读前端开发工程师必备技能
  15. linux ssh 免密登陆
  16. Linux 运维工程师 必掌握的技能 ?
  17. NB-IoT的优势是什么?
  18. 基于成熟网管平台的网管软件开发模式
  19. PX4 ---- Mixer
  20. HTML5 2D平台游戏开发#9蓄力技

热门文章

  1. CISSP国际注册信息系统安全专家
  2. 解决安装VC2015失败的问题
  3. J2EE架构师路线脑图
  4. 基于PHP图书馆图书借阅管理系统
  5. javashop源码,java开源电子商城系统,Javashop 开源电子商务平台
  6. android 音乐均衡器,App+1 | 不懂均衡器调校也能量身定制,无需折腾的 Android 音效提升工具...
  7. steam加速_《盗贼之海》发行之初荣登Steam榜首,UU加速器为您开黑提供保障
  8. Vue经典开源项目汇总
  9. pclint vc2012配置
  10. 计算机win10分区软件,分区工具哪个好? win10系统分区助手值得拥有