版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处! https://blog.csdn.net/wy_97/article/details/85321771
Hint:此系列学习笔记为准备毕设期间学习记录所书,有任何疑问,欢迎一起讨论
学习资料及工具推荐
- Solidity IDE Remix(在线浏览器编辑器)
关于此在线ide的使用介绍,可以参考这里 - B站的视频 基于以太坊的智能合约开发教程【Solidity】
- B站的视频 从零构建以太坊(Ethereum)智能合约到项目实战
~其他更好的学习资料之后边学边贴
第一个helloworld程序
pragma solidity ^0.4.0;
/*
The HelloWorld contract save name ,change name and test pure's function
*/
contract HelloWorld {
string name = "Sp4rks";
/*
定义了函数 GetString,用于取出 name的值。
pubulic表示公开访问,
view表示只进行访问不修改,节约 gas
returns为语法规范
*/
function GetString() public view returns(string){
return name;
}
// 定义了函数 ChangeName,用于修改 name的值。
function ChangeName (string newname) public {
name = newname;
}
/*
定义了函数 pureTest,用于测试 pure的用法。
view修饰的函数 ,只能读取 storage变量的值,不能写入。
pure修饰的函数 ,不能对 storage变量进行读写。
*/
function pureTest(string newname) pure public returns(string) {
return newname;
}
}
在线工具remix编译一下
再部署到区块链上(模拟)
验证功能直接略了~
数据类型及运算
pragma solidity ^0.4.0;
contract DataOperation {
bool p = true;
/*
定义 outputA函数,输出 a,!a
因为同时输出两个值,所以其相应的 returns和 return都有所变化
! 表示非,也就是与原本布尔值相反
*/
function outputA () public view returns(bool,bool){
return (p,!p);
}
// &&,||,==,!=对布尔型的运算与其他语言一致
/*
int分为 int8、int16、int24 ......,8位一步,直到 int256
如果后面的数字省略,则默认为 int256
int8后面的 8是什么意思呢?
即用 8位二进制来存储(其中左边第 1位用来表示 + - 符号),代表可存储的数字范围,如:
11111111 ~ 01111111,左边第 1位用来表示符号,1表示负,0表示正,
换算成十进制则为 -(1+ 2 + 4 + 8 + 16 + 32+ 64) ~ (1+ 2 + 4 + 8 + 16 + 32+ 64)
即可存储 -127 ~ 127 之间 255 个数字。
也可以理解成存储范围为2的多少次方。
uint 表示无符号数,第一位不用来存储 +,-号
即可存储 0 ~ 255 之间 255 个数字
*/
uint num1 = 1;
//定义 calculate1函数进行加减乘除取余操作,和其他语言一致
function calculate1 (int a,int b) public pure returns(int,int,int,int,int){
return (a+b,a-b,a*b,a/b,a%b);
}
//定义 calculate2函数进行 a^b操作,和其他语言有一些区别
// 值得注意的是:如果使用 int类型的 a,b,会报错,因为 int^int不一定为int
function calculate2 (uint a,uint b) public pure returns(uint){
return a**b;
}
// 位运算 &,|,~,^,>>,<<与其他语言一致
function BitOperation1 (uint8 a,uint8 b) public pure returns(uint8){
return a&b;
}
function BitOperation2 (uint8 a,uint8 b) public pure returns(uint8){
return a|b;
}
function BitOperation3 (uint8 a) public pure returns(uint8){
return ~a;
}
function BitOperation4 (uint8 a,uint8 b) public pure returns(uint8){
return a^b;
}
function BitOperation5 (uint8 a,uint8 b) public pure returns(uint8){
return a>>b;
}
function BitOperation6 (uint8 a,uint8 b) public pure returns(uint8){
return a<<b;
}
}
学数据类型的时候其实大部分和其他语言是一致的,唯一一个感觉特别明显的差异在solidity
语言会尽可能需要代码占用空间越小越好,比如能用int8
绝对不用int
,其主要原因是区块链部署上去是需要消耗gas
,也就是以太币,内容越大,写操作越多,耗费越大,这也就是为什么函数如果只是读,用view
,不进行写操作使用pure
进行限制的原因
另一个一般在别的语言中我可能不太可能会遇到的问题是,因为需要使数据类型尽可能小,比如使用int8
时,一定要注意数据计算过程中是否会越界溢出!