专栏首页陈冠男的游戏人生智能合约:solidity语法(一)

智能合约:solidity语法(一)

版本声明

首先,所有的 solidity 源码前面必须标明编译器版本

pragma solidity ^0.4.18;

这个就声明了版本是 0.4.18 到 0.5.0 的编译器中是可以工作的

合约

写一个合约的基本框架是:

contract name{}

变量

下面来看一下怎么声明变量,状态变量会永久的保存在合约里

uint 表示无符号整数,int 表示有符号的

在 solidity 里面 uint 默认表示 uint256,其他的还有 uint8、uint16、uint32...

声明一个变量:

uint id = 115;

结构体

solidity 也可以用结构体:下面声明了一个叫 Student 的结构体,有两个属性一个是 string 类型的 name,另一个是 uint 类型的 id

struct Student{  string name;  uint id;}

数组

solidity 支持两种类型的数组,静态数组、动态数组

uint 类型的固定长度为 10 的静态数组 id

uint[10] id;

uint 类型的长度不定的动态数组 id

uint[] id;

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

Student[] students;

函数

习惯上,函数里面的变量都是以 _ 开头的

function sayhello (string _name, uint _id) {}

使用结构体和数组

下面我们来了解一下怎么使用结构体和数组

Student yichen=Student('yichen', 115); //创建一个新的 studentstudents.push(yichen); //把创建的 yichen 添加到 students 结构体数组里面

当然也可以一步完成

students.push(Student('yichen', 115));

函数的属性

solidity 默认的属性是公共的(public),也就是说谁都可以调用,这样明显是不安全的,所以我们将它设置为私有的(private),只需要在函数后面加上一个 private 就可以,另外私有函数习惯名称前带个下划线

function _sayhello (string _name, uint _id) private {}

函数的更多属性

想让函数返回一个值的话可以这样:

string greeting = "hello yichen!";function _sayhello () returns (string){return greeting;}

在以太坊中,你去执行一些操作比如:转账、部署合约等是需要花费一些钱的(gas),因为以太坊需要消耗资源去计算

我们可以发现上面那个函数并没有修改任何东西,所以可以给他设置一个 view 修饰符,表示它只是读取数据,没有改变或者写任何东西,那么运行这个函数的时候只需要去查询保存的数据就可以,不需要全世界都知道并且把它写进区块中,所以不会消耗 gas

还有个 pure 修饰符,表示这个函数甚至不会访问合约里的任何东西,他的返回值完全取决于我们的输入,例如:

function _multiply(uint a, uint b) private pure returns (uint) {return a * b;}//这个函数接收我们的输入,然后把两个数的乘积返回给我们

Keccak256

Ethereum 内部有一个散列函数 keccak256,他会把一个字符串转换成 16 进制的数字

//6e91ec6b618bb462a4a6ee5aa2cb0e9cf30f7a052bb467b0ba58b8748c00d2e5keccak256("aaaab");//b1f078126895a1424524de5321b339ab00408010b7cf0e6ed451514981e58aa9keccak256("aaaac");

类型转换

uint8 -> uint16小单位变到大单位,值不变uint16 -> uint8大单位变到小单位,变为 原值 mod 256bytes8 -> bytes16后面补0bytes16 -> bytes8只取前面的 8 数address -> uint按照 uint 的单位从地址后面开始截取对应长度address -> bytes按照 bytes 的单位从地址前面开始截取对应长度uint/bytes -> address前面填充 0,直到符合 address 长度

事件

事件是以太坊虚拟机(EVM)日志功能中提供的一组方便的接口。当事件被触发时,它们会将参数保存到交易日志中——区块链中一种特殊的数据结构。这些日志与合约地址相关联,并且会被打包进区块中,因此可以被永久访问(不过 Serenity 版本或许会有所改变)。注意,日志和事件的数据是不能被合约访问的,即便是创建它们的合约也不行(不然常规的数据存储就没意义了)

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;}

可以在前端监听这个事件,当触发事件的时候就做一些事

YourContract.IntegersAdded(function(error, result) {}

本文分享自微信公众号 - 陈冠男的游戏人生(CGN-115),作者:yichen

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 智能合约:solidity语法(二)

    0x3C7f1E9B49B2f7c92e25224199d05D5Cb6923824

    yichen
  • 手工修复PE导入表

    可以看到导入表全是0,就是这里的原因使得无法正常打开,要想打开,我们需要修复导入表

    yichen
  • 【Vulnhub】symfonos2

    把里面的 log.txt 下到本地,然后查看一下,没发现 password 相关的,找到一个 user:aeolus

    yichen
  • [译]优化 Solidity 中的百分数和比例运算

    本文是 Solidity 中进行数学运算系列文章中的第三篇,这篇文章的主题是: 百分数和比例运算.

    Tiny熊
  • 高通 display 驱动【转】

    233333
  • 精选11条知乎干货回答,保证让你看到就是赚到

    为了方便读者朋友,决定把我在知乎上一些的个人觉得干货比较多,比较受欢迎的回答整合起来,方便大家查阅!

    谭庆波
  • Solidity 教程系列11 - 视图函数、虚函数讲解

    Solidity 教程系列第11篇 - Solidity 视图函数、虚函数讲解。 Solidity 系列完整的文章列表请查看分类-Solidity。

    Tiny熊
  • 哈希革新Transformer:这篇ICLR高分论文让一块GPU处理64K长度序列

    大型的 Transformer 往往可以在许多任务上实现 sota,但训练这些模型的成本很高,尤其是在序列较长的时候。在 ICLR 的入选论文中,我们发现了一篇...

    机器之心
  • [ffffffff0x] Windows认证原理 网络认证(进阶篇)

    在上一篇浅谈windows认证原理中,我们介绍了windows认证的基本流程和加密的hash原理。本文我们将通过抓包分析,进一步了解windows网络认证相关的...

    r0fus0d
  • Spring官网阅读(七)容器的扩展点(二)FactoryBean

    上面这些概念可能刚刚说的时候大家不是很明白,下面我们通过FactoryBean的一些应用来进一步体会这个接口的作用。

    程序员DMZ

扫码关注云+社区

领取腾讯云代金券