网站开发岗位实际情况,番禺网站建设培训班,网页美工设计ppt,泰州seo平台一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机#xff08; EVM #xff09;智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能#xff1a;区块链项⽬⼤部分是开源的#xff0c;如果你能读懂代码#xff0c;就可以 规避很多亏钱项⽬。…一.Solidity 简介 Solidity 是⼀种⽤于编写以太坊虚拟机 EVM 智能合约的 编程语⾔。我认为掌握 Solidity 是参与链上项⽬的必备技 能区块链项⽬⼤部分是开源的如果你能读懂代码就可以 规避很多亏钱项⽬。 Solidity 具有两个特点 1. 基于对象 学会 Solidity 之后可以助你在区块链领 域找到好⼯作挣钱找对象。 2. ⾼级 不会 Solidity 在币圈会显得很 low 开发⼯具Remix ⽹址 https://remix.ethereum.org 进去之后会有四个选项选择第三个
第⼀个 Solidity 程序
文件后缀名为.sol //SPDX-License-Identifier: MIT
pragma solidity ^ 0.8.24;
contract test1{string public _str Hello World;
} 第 1 ⾏是注释说明代码所使⽤的软件许可 license 这⾥使⽤的是 MIT 许可。如果不写许可 编译时会出现警告 warning 但程序仍可运⾏。 Solidity 注释以 “//” 开头后⾯跟注释内容注释不会被程 序执⾏。 // SPDX-License-Identifier: MIT 第 2 ⾏声明源⽂件所使⽤的 Solidity 版本因为不同版本 的语法有差异。这⾏代码表示源⽂件将不允许⼩于 0.8.4 版本或⼤于等于 0.9.0 的编译器编译第⼆个条件由 ^ 提供。 Solidity 语句以分号 ; 结尾。 pragma solidity ^0.8.4; 第 3-4 ⾏是合约部分。第 3 ⾏ 创建合约contract 并 声明 合约名为 test1 。第 4 ⾏是合约内容声明了 ⼀个 string 字符串 变量 _str 并赋值为 Hello World 。 contract test1{string public _str Hello World;
}
//public表示能见度
点击ctrls,可以直接编译 部署 二.Solidity中的变量类型 1. **值类型(Value Type)**包括布尔型整数型等等这类变量赋值时候直接传递数值。 2. **引用类型(Reference Type)**包括数组和结构体这类变量占空间大赋值时候直接传递地址类似指针3. **(Mapping Type)**: Solidity中存储键值对的数据结构可以理解为哈希表 值类型
布尔型
布尔型是二值变量取值为 映射类型true 或 false。
bool public _bool true;
布尔值的运算符包括
- ! 逻辑非
- 逻辑与and
- || 逻辑或or
- 等于
- ! 不等于
// 布尔运算
bool public _bool1 !_bool; // 取非
bool public _bool2 _bool _bool1; // 与
bool public _bool3 _bool || _bool1; // 或
bool public _bool4 _bool _bool1; // 相等
bool public _bool5 _bool ! _bool1; // 不相等 整型
int public _int -1;//整数包括负数
uint public _uint 1;//正整数
uint256 public _number 20220330; // 256位正整数
常用的整型运算符包括
- 比较运算符返回布尔值 !
- 算数运算符 - * / %取余**幂 // 整数运算
uint256 public _number1 _number 1; // -*/
uint256 public _number2 2**2; // 指数
uint256 public _number3 7 % 2; // 取余数
bool public _numberbool _number2 _number3; // 比大小地址类型
地址类型(address)有两类
- 普通地址address: 存储一个 20 字节的值以太坊地址的大小。
- payable address: 比普通地址多了 transfer 和 send 两个成员方法用于接收转账。
// 地址
address public _address 0x7A58c0Be72BE218B41C608b7Fe7C5bB630736C71;
address payable public _address1 payable(_address); // payable address可以转账、查余额
// 地址类型的成员
uint256 public balance _address1.balance; // balance of address 引用类型
定长字节数组
字节数组分为定长和不定长两种
- 定长字节数组: 属于值类型数组长度在声明之后不能改变。根据字节数组的长度分为 bytes1, bytes8, bytes32 等类型。定长字节数组最多存储 32 bytes 数据即bytes32。
- 不定长字节数组: 属于引用类型之后的章节介绍数组长度在声明之后可以改变包括 bytes 等。
// 固定长度的字节数组
bytes32 public _byte32 MiniSolidity;
bytes1 public _byte _byte32[0];
在上述代码中MiniSolidity 变量以字节的方式存储进变量 _byte32。如果把它转换成 16 进制就是0x4d696e69536f6c69646974790000000000000000000000000000000000000000
_byte 变量的值为 _byte32 的第一个字节即 0x4d。
映射类型
枚举 enum
枚举enum是 Solidity 中用户定义的数据类型。它主要用于为 uint 分配名称使程序易于阅读和维护。它与 C 语言 中的 enum 类似使用名称来代替从 0 开始的 uint
// 用enum将uint 0 1 2表示为Buy, Hold, Sell
enum ActionSet { Buy, Hold, Sell }
// 创建enum变量 action
ActionSet action ActionSet.Buy;
// enum可以和uint显式的转换
function enumToUint() external view returns(uint){return uint(action);
}
三.函数
function function name(parameter types) {internal|external|public|private} [pure|view|payable] [returns (return types)]看着有一些复杂让我们从前往后逐个解释(方括号中的是可写可不
写的关键字)
1. function声明函数时的固定用法。要编写函数就需要以 function 关键字开头。
2. function name函数名。
3. (parameter types)圆括号内写入函数的参数即输入到函数的变量类型和名称。
4. {internal|external|public|private}函数可见性说明符共有4种。 - public内部和外部均可见。 - private只能从本合约内部访问继承的合约也不能使用。 - external只能从合约外部访问但内部可以通过 this.f() 来调用f是函数名。 - internal: 只能从合约内部访问继承的合约可以用。 **注意 1**合约中定义的函数需要明确指定可见性它们没有默认值。 **注意 2**public|private|internal 也可用于修饰状态变量。public变量会自动生成同名的getter函数用于查询数值。未标明可见性类型的状态变量默认为internal。
5. [pure|view|payable]决定函数权限/功能的关键字。payable可支付的很好理解带着它的函数运行的时候可以给合约转入 ETH。pure 和 view 的介绍见下一节。
6. [returns ()]函数返回的变量类型和名称。
为了帮助大家理解我画了一个马里奥插图。在这幅插图中我将合约中的状态变量存储在链上比作碧琪公主三种不同的角色代表不同的关键字。

- pure中文意思是“纯”这里可以理解为”纯打酱油的”。pure 函数既不能读取也不能写入链上的状态变量。就像小怪一样看不到也摸不到碧琪公主。
- view“看”这里可以理解为“看客”。view函数能读取但也不能写入状态变量。类似马里奥能看到碧琪公主但终究是看客
- 非 pure 或 view 的函数既可以读取也可以写入状态变量。类似马里奥里的 boss可以对碧琪公主为所欲为。
pure 和 view代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract test2{uint256 public number 5;function add() external {number number 1;}
} 如果 add() 函数被标记为 pure比如 function add() external pure就会报错。因为 pure 是不配读取合约里的状态变量的更不配改写。那 pure 函数能做些什么举个例子你可以给函数传递一个参数 _number然后让他返回 _number 1这个操作不会读取或写入状态变量。
// pure: 纯纯牛马 // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract test2{uint256 public number 5;function addPure(uint256 _number) external pure returns(uint256 new_number){new_number _number 1;}
} 如果 add() 函数被标记为 view比如 function add() external view也会报错。因为 view 能读取但不能够改写状态变量。我们可以稍微改写下函数读取但是不改写 number返回一个新的变量。
// view: 看客 // SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract test2{uint256 public number 5;function addView() external view returns(uint256 new_number){new_number number 1;}
}