携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 2 天,点击查看活动详情
Solidity 是啥?
- Solidity 是一种面向对象的高级语言,用于实现智能合约。它是运行在ETH 虚拟机(EVM)上的
- 它是静态类型的,支持继承、库和复杂的用户定义类型等特性。
helloworld
pragma solidity ^{version};
contract HelloWorld {
}
变量和类型
Solidity 中有 3 种类型的变量
-
本地的
- 在函数内部声明并且不存储在链上
-
状态
- 在维护智能合约状态的函数之外声明
- 存储在链上
-
全局的
- 提供有关区块链的信息。它们在运行时由以太坊虚拟机注入。
- 包括交易发送者、区块时间戳、区块哈希等。
- 全局变量示例
变量的范围是由它们的声明位置定义的,而不是它们的值。将局部变量的值设置为全局变量不会使其成为全局变量,因为它仍然只能在其范围内访问。
再看一个更详细的例子:
contract Variables {
/*
uint 代表无符号整数,意思是非负整数 有不同的大小可供选择,例如:
- uint8 范围 0 to 2 ** 8 - 1
- uint256 范围 0 to 2 ** 256 - 1
`public` 表示变量可以在内部访问
通过合约,也可以被外部世界读取
*/
uint8 public u8 = 10;
uint public u256 = 600;
uint public u = 1230; // uint 是 uint256 的别名
/*
int 类型允许使用负数。例如
int256 范围 -2 ** 255 to 2 ** 255 - 1
*/
int public i = -123;
// 公钥地址
address public addr = 0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c;
bool public defaultBoo1 = false;
// 未初始化的变量会给一个初始值
bool public defaultBoo2; // false
uint public defaultUint; // 0
int public defaultInt; // 0
address public defaultAddr; // 0x0000000000000000000000000000000000000000
function doSomething() public {
// 本地变量
uint ui = 456;
// 全局变量
uint timestamp = block.timestamp; // 区块的时间戳
address sender = msg.sender; // 这个地址的调用方,调用函数
}
}
循环和 If/Else 案例
pragma solidity ^{version};
contract Conditions {
uint public num;
/*
一个公共函数,接受一个 uint 并设置状态变量 num。
它可以从合约内部调用,也可以从外部调用。
*/
function set(uint _num) public {
num = _num;
}
/*
该函数不会改变任何变量的状态。
solidity 中的 view 函数不需要 gas。
*/
function get() public view returns (uint) {
return num;
}
function foo(uint x) public returns (uint) {
if (x < 10) {
return 0;
} else if (x < 20) {
return 1;
} else {
return 2;
}
}
function loop() public {
// for loop
for (uint i = 0; i < 10; i++) {
if (i == 3) {
// Skip to next iteration with continue
continue;
}
if (i == 5) {
// Exit loop with break
break;
}
}
}
}
数组、字符串
pragma solidity ^{version};
contract Array {
// 全局字符串
string public greet = "Hello World!";
// 定义数组的几个方式, 这里初始化的数据会放到链上
uint[] public arr;
uint[] public arr2 = [1, 2, 3];
// 固定大小的数组,数组的所有值都会被初始化为 0
uint[10] public myFixedSizeArr;
function get(uint i) public view returns (uint) {
return arr[i];
}
/*
memory - 这个字段只在内存中存储
*/
function getArr(uint[] memory _arr) public view returns (uint[] memory) {
return _arr;
}
/*
这里仅在函数执行时才需要字符串也是加上了 memory 关键字
*/
function foo() public returns (string memory) {
return "C";
}
function doStuff(uint i) public {
arr.push(i);
arr.pop();
uint length = arr.length;
uint index = 1;
delete arr2[index];
uint[] memory a = new uint[](5);
string memory hi = "hi";
}
}
回顾
本章主要介绍了一些 Solidity 基本语法和概念,帮助我们更好的了解怎么使用这个语言去实现一些简单的合约逻辑