Solidity学习笔记(1)- 版本声明,构造合约,结构体,数组,函数,类型转换,散列,事件

目录

1, 版本声明

2, 构造一个合约

 3, 构造结构体

4, 构造一个数组

添加元素

5, 定义一个函数

返回值

函数的修饰符

6,类型转换

7,Keccak256

8,事件


1, 版本声明

//向上兼容
pragma solidity ^0.4.19;
program solidity >= 0.8.2 < 0.9.0

2, 构造一个合约

contract Example {
  uint myUnsignedInteger = 100;
}

 3, 构造结构体

结构体允许你生成一个更复杂的数据类型,它有多个属性。

struct Book{
    uint page;
    string name;
}

4, 构造一个数组

Solidity 支持两种数组: _静态_ 数组和_动态_ 数组:

// 固定长度为2的静态数组:
uint[2] fixedArray;
// 固定长度为5的string类型的静态数组:
string[5] stringArray;

// 动态数组,长度不固定,可以动态添加元素:
uint[] dynamicArray;

//构造一个结构体类型的数组
Book[] book;
//定义 public 数组, Solidity 会自动创建 getter 方法
Book[] public book1;

添加元素

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

// 创建一个新的Book:
Book zhiku = Book(999, "Zhiku");

// 将新创建的添加进book数组:
book.push(zhiku);

//也可将以上两步合并为
book1.push(Book(99, "senlinshu"));

5, 定义一个函数

定义一个名为 createBook 的函数,它接受两个参数:一个 string类型的 和 一个 uint类型的

注:习惯上函数里的变量都是以(_)开头 (但不是硬性规定) 以区别全局变量。

function _createBook(string _name, uint _page) {
        // 
    }

Solidity 定义的函数的属性默认为公共。 这就意味着任何一方 (或其它合约) 都可以调用你合约里的函数。显然,不是什么时候都需要这样,而且这样的合约易于受到攻击。 所以将自己的函数定义为私有是一个好的编程习惯,只有当你需要外部世界调用它时才将它设置为公共

function _createBook(string _name, uint _page) private {
        
    }

返回值

function sayHello() public returns (string) {
  return "hello world";
}

函数的修饰符

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

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

function sayHello() public view returns (string) {

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

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

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

6,类型转换

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

7,Keccak256

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

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

8,事件

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

// 这里建立事件
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;
}

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

YourContract.IntegersAdded(function(error, result) {
  // 
})
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值