1.Solidity基础

友情提示:每一句话都非常重要,每一个点都是细节。再者本教程适合有一定编程基础的小伙伴快速入门
基本语法,整数溢出以及异常处理,字节数组,动态字节数组,字符串,字符串与字节数组的相互转换,帮助大家快速入门Solidity

这里直接给一段代码

pragma solidity ^0.4.16;contract Helloworld {string Myname = "张三";function getName() public view returns(string) {return  Myname;}function setName(string newname) public {Myname = newname;}function pureTest(string _name) public pure returns (string) {return _name;}
}

这里使用的编辑器是remix网页编辑器:点击进入remix编辑器

下面我们对这段代码进行分析

在java中,已经有很多的小我们大致了解,所以我们学习solidity只需要学习它与其他语言不同的地方

  1. 第一行的prama,是solidity的编译控制指令,那我们这行代码的意思是,源文件不允许被0.4.16以下,以及大于等于0.5.0版本的编译器所编译,简单来说,允许的范围就是左闭右开

    0.4.16<=编译器版本<0.5.0

    在此区间的编译器版本是可以编译的。

  2. contract关键字,相当于java中的class,定义一个合约

  3. view关键字,这个是Solidity特有的关键字,因为solidity最终是用在合约上,所以会有相关的功能,而view就是这些功能的其中一个,view只能用来修饰方法,而被修饰的方法不能修改状态变量,也就是在java中的类的属性,在这里这个状态变量就是Myname,在这里我们可以看到getName()方法并没有修改Myname的值

  4. 运行这个代码,我们先调用getName函数,结果如下这张图片显示运行结果,运行成功

    这张图片显示油费消耗,记住这个数字

  5. 运行setName()方法,这个方法需要传入一个参数,我们在这里传入"李四",点击运行,之后再运行getName()重新获取值,结果如下


    但是我们发现油费改变了,这说明了什么?

  6. 当我们继续点击getName()运行多次的时候,油费依旧不变,而当我们再次运行setName()方法的时候油费又会改变。

  7. 这说明了被view修饰的方法不会消耗油费,因为它不需要改变状态变量,所以view关键字还有节约油费的作用

  8. pure关键字,被这个关键字修饰的方法不允许访问状态变量,所以也不需要花费油费。

  9. bool,&& ,||,用法与java中完全一致,在这里不过多解释。

  10. uint关键字,代表非负整型,默认是uint256,256是指256个比特位,

8bit=1byte

  1. solidity中也支持方法重载
  2. 位运算符:由于solidity是用来部署合约,所以对内存要求很高,为了节约内存,位运算符显得相当重要

&:按位与,同时为1,得到1,有一个及以上为0,就是0
|:按位或,同时为0,得到0,有一个及以上为1,就是1
~:取反,0变成1,1变成0(只需要一串数字就可以)
^:按位异或,相同为0,不相同为1
<<:左移
.>>:右移

将上面的符号全部测试一遍,这里不给出结果,有兴趣的可以自己去运行一下


pragma solidity ^0.4.16;contract BoolTest {uint8 a = 4;uint8 b = 2;function plus() public view returns(uint8){return a + b;}function minus() public view returns(uint8){return a - b;}function multiply() public view returns(uint8){return a * b;}function divide() public view returns(uint8){return a / b;}function power() public view returns(uint8){return a ** b;}function test1() public view returns(uint8){return a&b;}function test2() public view returns(uint8){return a|b;}function test3() public view returns(uint8){return ~b;}function test4() public view returns(uint8){return a^b;}function test5() public view returns(uint8){return a<<1;}function test6() public view returns(uint8){return a>>1;}}

2.整数溢出以及异常处理

  1. 接下来我们要介绍非常危险的整数溢出问题,附上代码。
 function flow() public pure returns(uint8){uint8 mm = 255;return mm;}

我们知道。8个比特位的数据范围是0~255,所以这个方法会返回一个mm的值,是255,运行结果没问题。
接下来我们修改一下代码,修改后的代码在下方

function flow() public pure returns(uint8){uint8 mm = 255;mm++;return mm;}

代码修改后,mm理应变成256,但是256已结超过了8个比特位的取值范围,所以会出现错误。运行结果:

可以看到,mm的值输出直接变成了0,为什么会有这种结果呢?

1 1 1 1 , 1 1 1 1

上面是我们的8个比特位,这个是255的二进制表示,当这个数加1的时候,最后一位加1,学过二进制的朋友都知道,依次从后往前满2进1,最后的结果是:

1, 0 0 0 0, 0 0 0 0

由于我们只能读取8个比特位,所以读取之后的值就是

0 0 0 0, 0 0 0 0

这个值就是0,所以m后8位读取变成了0。

为了验证我们的结论,我们再次修改代码:

 function flow() public pure returns(uint8){uint8 mm = 255;mm++;mm++;return mm;}

运行结果:

可以看到,当我们让mm在之前的基础上再加1之后,变成了

0 0 0 0, 0 0 0 1

所以mm的结果就是1,可以验证我们刚刚的结论是正确的。

  1. 我们再写一个函数,附上代码:
function erroTest() public pure returns(int){int a1 = 1;int a2 = 0;return a1/a2;}

注意观察上面的函数,很明显我们看到上面的函数发生了错误,因为0不能做除数,那我们编译这个代码是能通过的,但是当我们调用这个函数的时候就会看到以下字段

这就是发生了一个异常。

注意:solidity目前不支持小数类型

3.字节数组

我们还是先给一段代码

pragma solidity ^0.4.0;contract BytesArray {bytes1 public num1 = 0x7a;// 只有一个字节的数  二进制表示:0111 1010bytes2 public num2 = 0x7a68;// 有两个字节的数 二进制表示:0111 1010 0110 1000function getLength() public returns(uint256) {return num1.length;// length属性不可修改}function getLength2() public returns(uint256) {return num2.length;// length属性不可修改}}
  1. 字节数组虽然在存储上与int一致,但是不能直接进行加减乘除操作。但是可以进行数的比较(>,>=,==,<=,<),也可以进行位运算(&, |, ~, ^, <<, >>)。
  2. 当属性添加public后,会被默认生成一个获取该属性的get方法。
  3. 加上以下代码,验证上述说法,f分别求&, |, ~, ^, <<, >>位运算后的值,并返回。
 function and() public returns(bytes2 n1,bytes2 n2,bytes2 n3, bytes2 n4, bytes2 n5,bytes2 n6){return (num1&num2,num1|num2,~num1,num1^num2,num1<<1,num1>>1);}

得到结果:

结果正确。

4.动态字节数组

上代码:

 pragma solidity ^0.4.0;contract BytesArray {bytes public name = new bytes(2);function initName() public {name[0] = 0x7a;name[1] = 0x68;}function getLength() public returns(uint256){return name.length;}function changeLength() public {name.length = 5;}}
  1. 运行initName之后,再查看name属性的值:

    结果没问题

  2. 运行getLength()方法查看bytes数组的长度:


长度是2,结果正确

  1. 运行changeLength()方法修改bytes数组的长度:


    长度变成了5

总结:动态字节数组能够修改数组的长度。

  1. name.push(0x99)向name动态字节数组中添加一个0x99的元素。

4.string类型

  1. string操作与java基本一致,string余额bytes之间可以强制转换,这一特性可以用来访问string中特定位置的值。
    代码测试
pragma solidity ^0.4.0;contract StringTest {string public name = "zhangsan";function getLength() public returns(uint256){return bytes(name).length;}function changeName() public {bytes(name)[0] = 'L';}function getCName() public returns(bytes1){return bytes(name)[0];}
}
  1. 获取name:
  2. 获取长度为8个字节:
  3. 调用getCName()获取第一个字母:

    6.调用changeName修改第一个字母之后再获取name:

Solidity学习(一)相关推荐

  1. Solidity学习记录——第二章

    Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...

  2. Solidity学习记录——第四章

    Solidity学习记录 第一章 创建生产僵尸的工厂 第二章 设置僵尸的攻击功能 第三章 编写DAPP所需的基础理论 第四章 完善僵尸功能 第五章 ERC721 标准和加密资产 文章目录 Solidi ...

  3. solidity学习笔记第1天

    Solidity 学习笔记第1天 1. 什么是Solidity? 编写智能合约首选Solidity 语言,Solidity 是一门为实现智能合约而创建的高级编程语言.这门语言受到了 C++,Pytho ...

  4. 不同步节点在线使用Remix开发以太坊Dapp及solidity学习入门 ( 一 ):智能合约HelloWorld

    有问题可以点击–>加群互相学习 本人本来想自己写公链,结果发现任重道远: 遂,开始写Dapp,顺便写的时候搞个教程吧... 通过系列教程学习将会: 1.基本使用solidity 语言开发智能合约 ...

  5. Solidity学习笔记

    学习视频来源: 基于以太坊的智能合约开发教程[Solidity] 读取数据不需要消耗燃料费Gas,修改数据需要消耗燃料费. pragma solidity ^0.4.0;contract Hellow ...

  6. 以太坊环境以及Solidity学习笔记

    一.以太坊环境搭建 以太坊 私有链搭建 Geth+Mist钱包 以太坊 链私有链环境搭建(windows) S1:下载安装Geth.Mist客户端 S2:初始化创世纪节点 定义一个配置文件genesi ...

  7. 《智能合约Solidity学习笔记 - 僵尸军团》Part1- 搭建僵尸工厂

    pragma solidity ^0.4.19; //指定版本号/**关卡1 : 创建 根据输入的姓名 创建随机僵尸学习网址: https://cryptozombies.io/zh **/// 创建 ...

  8. 《solidity学习笔记》chapter 3-solidity其他知识

    Ownable contracts OpenZeppelin Solidity库里的合约之一,可以通过继承使用. /*** @title Ownable* @dev The Ownable contr ...

  9. solidity学习一(数据类型、增删改查合约)

    abi-to-sol在线转换 https://gnidan.github.io/abi-to-sol/ 发布合约 https://ropsten.etherscan.io/verifyContract ...

最新文章

  1. 正则表达式限制输入整数或小数
  2. 轻量级RGB-D显著目标检测的中层融合
  3. 学习 Spring (十七) Spring 对 AspectJ 的支持 (完结)
  4. 跟着开涛学SpringMVC 第一章源代码下载
  5. hdu 4495(hash+二分+dp)
  6. 加载spring上下文的多种方式总结
  7. 16进制字符串转化为10进制数
  8. Python命令行参数
  9. 【每天get 一点新知识】Python print 打印结果(字符串类型)前面添加 说明
  10. Jquery封装幻灯片效果
  11. 找不到ad用户和计算机,清理可能废弃的AD用户和计算机账户
  12. U盘只读文件系统修复详解
  13. 创始人之间应该如何量化分配股权?
  14. 成功,侥幸,以小博大?永远离不开的墨菲定律
  15. “Adb connection Error:远程主机强迫关闭了一个现有的连接。”的解决方法
  16. 为什么网上都说 AirPods 3 音质不如AirPods Pro?
  17. 计算机应用课程的体会,计算机课程心得体会
  18. 常用逻辑门电路及其运算表达式
  19. 跨平台之uni-app
  20. 华为5G基站日常维护操作手册(无线)

热门文章

  1. Monkey自动化测试
  2. 微信v3支付【php】
  3. python打开csv忽略错误_在python中读取错误的格式csv
  4. 计算机更改用户密码,教你怎么修改电脑开机密码
  5. Java之初步识别网络编程:IP、端口号、TCP/UDP、Socket、URL等
  6. Tensor基础操作总结
  7. 选择器:id与name
  8. android陀螺仪判断手机旋转方向,unity 陀螺仪判断手机方向
  9. 共振峰估计2MATLAB
  10. 算法(一) 算法初步