Solidity 从入门到实战(一)

2023-10-31

solidity 从入门到实战(一)

注意:本专栏主要来自于https://www.bilibili.com/video/BV1St411a7Pk?p=11&spm_id_from=pageDriver的学习笔记

编写第一个案例

//声明版本号
pragma solidity ^0.4.16;
//合约 有点类似于java中的class
contract HelloWorld{
    //合约属性变量
    string myName = "HelloWorld";
    //合约中方法 注意语法顺序 其中此处view 代表方法只读 不会消耗gas
    function getName() public view returns(string){
        return myName;
    }
    //可以修改属性变量的值 消耗gas
    function changeName(string _newName) public{
        myName = _newName;
    }
    // pure:不能读取也不能改变状态变量
    function pureName(string _name) public pure returns(string){
        return _name;
    }
    
}

用constant、view、pure修饰function分别表示:

  • constant:只能读取不可改变状态变量(就是contract中定义的变量)
  • view:只能读取不可改变状态变量,和constant一样
  • pure:不能读取也不能改变状态变量

想要详细了解他们的区别,请点击: https://www.jianshu.com/p/5f1bc0d39d79

solidity 语法介绍

注意:由于以下内容都是一些基本的语言特性,相信有编程基础的同学都可以看懂,因此,关于它的语法代码可以运行一下,看看效果,这里就不做过多的解释。

真假与或非

pragma solidity ^0.4.16;

contract BoolTest{
    
    bool a;
    
    int c = 100;
    int d = 200;
    
    function getBoolDefault() returns(bool){
        return a;
    }
    
    function getBoolean() returns(bool){
        return !a;
    }
    
    function judge() returns(bool){
        return c==d;
    }
    
    function logicAnd() returns(bool){
        return c==d && true;
    }
    
    function logicOr() returns(bool){
        return c==d || true;
    }
    
    function logicNot() returns(bool){
        return c!=d && true;
    }
    
}

整型与算术运算

在solidity中,基本的整型有int(有符号整型,有正有负)uint(无符号整型,无负数)。并且他们以8位为区间,int支持int8,int16,int24int256,uint同理。int默认为int256,uint默认为uint256

基本算术运算
pragma solidity ^0.4.16;

contract Math{
    //加
    function add(uint a,uint b) public returns(uint){
        return a+b;
    }
	//减
    function minus(uint a,uint b) public returns(uint){
        return a-b;
    }
    //乘
    function multiply(uint a,uint b) public returns(uint){
        return a*b;
    }
    //除
    function divide(uint a,uint b) public returns(uint){
        return a/b;
    }
    //取余
    function mod(uint a,uint b) public returns(uint){
        return a%b;
    }
    //幂运算
    function square(uint a,uint b) public returns(uint){
        return a**b;
    }
}
位运算

solidity支持的位运算有以下几种位与&位或|位非~位异或^左移>>,右移<<

pragma solidity ^0.4.16;

contract Math{
    
    uint8 a = 3;
    uint8 b = 4;
    function bitwiseAnd() public returns(uint8){
        return a&b;
    }

    function bitwiseOr() public returns(uint8){
        return a|b;
    }
    
    function tilde() public returns(uint8){
        return ~a;
    }
    
    function caret() public returns(uint8){
        return a^b;
    }
    
    function leftShift() public returns(uint8){
        return a<<1;
    }
    
    function rightShift() public returns(uint8){
        return a>>1;
    }
}
复合运算

++和-- 只需要记住谁在前,结果输出谁(加号在前,结果加一;数字在前,结果输出数字本身);而变量本身等于运算后的值

pragma solidity ^0.4.16;

contract Math{
    //输出a
    function add2(uint a) public returns(uint){
        return a++;
    }
    //输出a+1
    function add3(uint a) public returns(uint){
        return ++a;
    }
    //输出a
    function minus2(uint a) public returns(uint){
        return a--;
    }
    //输出a-1
    function minus3(uint a) public returns(uint){
        return --a;
    }
}
整型溢出及异常处理

我们先看一下以下代码

pragma solidity ^0.4.16;

contract Math{
    
    function flow() view public returns(uint8){
        uint8 mm  = 255;
        mm++;
        return mm;
    }
    
    function flow2() view public returns(uint256){
        uint8 mm  = 255;
        mm++;
        return mm;
    }
    
     function flow3() view public returns(uint){
        uint mm  = 255;
        mm++;
        return mm;
    }
}

通过运行,我们会发现flow=0,flow2=0, flow3=256,出现这个原因就是因为那就是进位溢出导致。
我们再来看看下面这段代码

pragma solidity ^0.4.16;

contract Math{
    
    function flowMinus() view returns(uint8){
        uint8 nn = 0;
        nn--;
        return nn;
    }
    
    function flowMinus3() view returns(uint8){
        uint8 nn = 0;
        return nn--;
    }
}

上述的复合减运算答案分别是2550,你猜对了吗?

要避免的异常

例如:除数不能为0

pragma solidity ^0.4.16;

contract Math{
    
    function errorTest() view returns(int){
        int a = 2;
        int b = 3;
        return a/b;
    }
    
    function errorTest2() view returns(int){
        int a = 2;
        int b = 0;
        return a/b;
    }
    
}

数组

固定长度字节数组

关键字有:bytes1,bytes2mbytes3,…,bytes32(以步长1递增)。byte代表bytes1。

pragma solidity ^0.4.16;

contract ByteArray{
    
    bytes1 public num1 = 0x7a;
    
    bytes2 public num2 = 0x7a68;
    
    bytes12 public num3 = 0x7a68656e676a69616e78756e;
}

固定长度字节数组对于数值来说,有点等同于我们的uint。一个字节等于8位。即bytes1 有点等同于uint8,至少在位数上是相等的。
**
注意:上面的例子,我们同时引入了一个public修饰合约成员变量的范例,在solidity中,直接用public声明成员变量,编译部署后,会为我们生成一个默认的get方法,让我们可以直接调用这个成员属性。

**

动态长度字节数组
pragma solidity ^0.4.16;

contract DynamicByteArray{
   
    bytes public name = new bytes(2);
    
    function initName(){
        name[0] = 0x7a;
        name[1] = 0x68;
    }
    
    function getLength() view returns(uint){
        return name.length;
    }
    
    function changeName(){
        name[0] = 0x88;
    }
    
    function changeLength(){
        name.length = 5;
    }
}

依次执行getLength,initNamename,changNamename,changeLength,getLength看看结果
此外,我们的动态数组,还提供了一个push方法,可以在我们自己数组的末尾继续添加我们的字节元素。

function pushTest(){
    name.push(0x99);
}
字符串

在上节我们学习了动态字节数组,而我们的字符串,可不可以按照动态字节的数组去获取他的长度和其中的元素呢?

pragma solidity ^0.4.16;

contract DynamicString{
    
    string name = "tongxuejava";
    
    function getLength() returns(uint){
        // return name.length; 不能够直接的获取string的长度
        return bytes(name).length;//通过bytes强转的转换
    }
    
    function getPartName() returns(bytes1){
        return bytes(name)[0];
    }
    
    function changeName() {
       // return name[0];不能够直接通过下标的方式获取string里面的内容
          
         bytes(name)[0] = 'T';
    }
}

通过实验,我们发现要想获取字符串中的元素,得通过bytes()进行强制转换。

固定长度字节数组转化
pragma solidity ^0.4.16;

contract DynamicString{
    
    bytes12 name =  0x7a68656e676a69616e78756e;
    
    function changeBytes1() view returns(bytes1){
        return bytes1(name);
    }
    
    function changeByte2() view returns(bytes2){
        return bytes2(name);
    }
    
    function changeByte3() view returns(bytes16){
        return bytes16(name);
    }
}

在这里插入图片描述

通过运行,我们可以发现规律:转小从头截取,转大末尾补零

固定长度字节数组转动态字节数组
pragma solidity ^0.4.16;

contract DynamicString{
    
    bytes12 name =  0x7a68656e676a69616e78756e;
    
   function fixBytesToDynamicBytes() view returns(bytes){
       //return bytes(name); 直接转换为动态字节数组是不行的
       bytes memory newName = new bytes(name.length);//使用一个for循环来挨个字节进行转换
       for(uint i= 0;i < name.length;i++){ //注意uint 无符号整型
           newName[i] = name[i];
       }
       return newName;
   }
}
动态长度字节数组转为string

(bytes===>string)

pragma solidity ^0.4.16;

contract Bytes2String{
    
    bytes name =  new bytes(2);
    
    function init(){
        name[0] = 0x7a;
        name[1] = 0x68;
    }
    
    function bytesToString() view returns(string){
        return string(name);
    }
}
固定长度字节数组转string

我们上面都知道了动态长度数组可以强制转换为string,那么固定长度数组可不可以强制转为string呢?

pragma solidity ^0.4.16;

contract Bytes32ToString{
    
    bytes2 name =  0x7a68;
    
    function bytes32ChangeString() returns(string){
        return string(name);    
    }
 
}

通过编写以上合约,会发现编译出错,那么我们该如何转换呢?
从上面的学习中,我们知道。固定长度字节数组可以转为动态字节数组,而动态字节数组可以转为string。所以,这就是我们转换的思路。

pragma solidity ^0.4.16;

contract Bytes32ToString{
    
    function byts32ToString(bytes32 inputName)  view returns(string){
        bytes memory newName = new bytes(inputName.length);
        for(uint i = 0;i<newName.length;i++){
            newName[i] = inputName[i];
        }
        return string(newName);
    }
 
}

接下来,我们将以上内容做一个总结:

  • 动态长度字节数组
    • bytes的初始化–new bytes
    • 获取bytes的长度和内容
    • 修改长度和内容
  • string
    • 不能够直接获取长度和内容
    • 需要转换为bytes获取长度和内容
    • 特殊字符的长度的内容和获取
    • 中文字符占用3个字节
  • 固定长度字节数组之间转换
    • 转小从头截取,转大末尾补零
  • 固定长度转可变长度数组
    • 利用new bytes(),然后循环转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Solidity 从入门到实战(一) 的相关文章

  • 用`visibilitychange`事件实现吸睛的十八禁

    18禁 我知道你们都是看这图进来的 但是这个图跟下面的内容没有必然联系 前不久在网上找资料的时候突然发现某个页面的 title 是啥 18 禁 电影 在线观看 突然就心头一紧 是哪个页面咋还自动弹广告页 还是新标签页面打开的 当时我的表情就
  • ddos攻击的简单应急处理办法

    ddos攻击是一种非常常见的黑客攻击服务器手法 根据wiki的说法 拒绝服务攻击 英语 denial of service attack 简称DoS攻击 亦称洪水攻击 是一种网络攻击手法 其目的在于使目标电脑的网络或系统资源耗尽 使服务暂时

随机推荐

  • Tomcat下发布Web项目

    为了可以通过浏览器访问到自己tomcat下的web项目 我们需要先了解以下内容 Web开发概述 1 1WEB通信 WEB采用B S通信模式 通过超文本传送协议 HTTP Hypertext transport protocol 进行通信 通
  • 虚拟服务器是什么?

    虚拟服务器是设置在一个真实服务器群组中的高可扩展性 可用性服务器 服务器群组的体系结构对于终端用户是透明的 连接服务器群组的用户就像一个整体的虚拟服务器 请看下图 真实的服务器和负载均衡器通过高速局域网或地域上分散的广域网相连接 负载均衡器
  • 抖音短视频服务器维护中什么意思,抖音短视频运营的几大误区,新手一定要注意!...

    原标题 抖音短视频运营的几大误区 新手一定要注意 在当下互联网短视频创作热潮中 很多小伙伴都投入了创作抖音视频的道路中 运营创作抖音短视频的道路艰难且长 很多小伙伴也不同程度的进入了各种运营误区中 今天来给大家分享几个比较常见的运营误区 争
  • 2、网络请求的跨域问题(重点)

    跨域信息错误提示 1 在需要网络请求的组件 import axios from axios export default name HelloWorld mounted 网络地址 除去基本地址剩余部分 axios get api Finge
  • 在VS中使用C++编程函数体太长如何快速找到函数体

    关于代码段比较长 嵌套的程序比较多 一时半会找不到函数体 1 Ctrl 组合键可以找到具体的程序的 位置 2 将有关代码段进行折叠 则有关C 代码折叠的方法 1 大纲折叠 具体设置过程为 菜单栏 工具 gt 选项 gt 文本编辑器 gt C
  • Java(对象数组、方法的重载、参数传递、递归、packa、import、封装、构造器、实例变量赋值、javabean、类图)

    对象数组 方法的重载 两同一不同 同一个类 相同的方法名 参数列表不同 参数个数不同 或 参数类型不同 可变参数 2的特例 可变个形参的方法与同一个类中的方法名相同 且与可变个数形参的类型相同额数组不构成重载 sql语句中的可变参数 参数传
  • SpringCloud @FeignClient 注入Spring容器原理

    前言 本文分析 FeignClient注解如何别扫描并注入到spring容器中 重点分析 EnableFeignClients工作原理 由于通过源码分析涉及内容比较多建议根据文章中流程debug调试进行学习 文章涉及 容器刷新模板方法 Co
  • p1m2(二分)

    题目 2018百度之星 http acm hdu edu cn showproblem php pid 6383 二分 操作次数满足有序性 用二分 代码 include
  • typeid详解

    在揭开typeid神秘面纱之前 我们先来了解一下RTTI Run Time Type Identification 运行时类型识别 它使程序能够获取由基指针或引用所指向的对象的实际派生类型 即允许 用指向基类的指针或引用来操作对象 的程序能
  • 经纬恒润再次入选教育部产学研合作协同育人企业

    近日 教育部高等教育司组织的产学合作协同育人项目组公布了2023年度产学合作协同育人项目指南通过企业名单 经纬恒润再次入选 此次共获批37个项目 其中有25个师资培训项目 12个实践条件建设和实践基地建设项目 产学合作协同育人项目由教育部高
  • es--基础--02--安装与启动

    es 基础 02 安装与启动 1 简单安装与启动 1 1 下载安装包 cd usr local java elasticsearch wget https artifacts elastic co downloads elasticsear
  • 《剑指offer第二版》面试题14:剪绳子

    感谢大佬 参考的是他的笔记才懂了这题 他写的真的很好 感谢感谢 题目 给你一根长度为 n 的绳子 请把绳子剪成整数长度的 m 段 m n都是整数 n gt 1并且m gt 1 每段绳子的长度记为 k 0 k 1 k m 1 请问 k 0 k
  • 卡内基梅隆大学(CMU)的Eric Xing(邢波)教授为什么能读完一般学校的分子生物学PhD后到伯克利去CS PhD?

    Eric Xing当年为什么能在读了一个50名左右的学校Rutgers的分子生物学phd之后 去加州大学伯克利分校UCB读计算机科学博士 感觉像这种转行的一般都是第一个phd已经是名校名导才能转得好 我也看过Eric在Rutgers发的论文
  • gcc在Linux下如何运行一个C/C++程序

    安装gcc sudo apt get install gcc 之后输入密码即可 绝对路径的方式进入usr目录 cd home home 是普通用户的主目录 在创建用户时 每个用户要有一个默认登录和保存自己数据的位置 就是用户的主目录 所有普
  • 数据的平滑处理函数——log1p和exmp1

    参考 https blog csdn net qq 36523839 article details 82422865 https docs scipy org doc numpy 1 13 0 reference generated nu
  • 索引的原理分析:用B+树来做索引

    文章目录 前言 为什么索引要存放到硬盘上 如何评价索引的数据结构设计好坏 二叉树的局限性 什么是 B 树 什么是 B 树 前言 索引其实就是一种数据结构 那么 索引的数据结构究竟是怎样的 对索引底层的数据结构有了更深入的了解后 就会更了解索
  • SpringBoot+Vue 的家政服务管理平台(附源码,数据库)

    文章目录 1 背景 2 主要技术 3 可行性分析 4 系统设计 5系统的详细设计与实现 5 1前台模块设计 5 2后台功能模块 源码下载地址 1 背景 本系统主要是设计出家政服务管理平台 基于B S构架 后台数据库采用了Mysql 可以使数
  • 做爬虫会有前途吗?

    阅读文本大概需要 5 分钟 这几年随着人工智能领域的大火 Python 这门语言逐渐出现在主流视野中 Python 语法易懂 编写简洁 并且还拥有非常丰富的库 很多人工智能项目首选的语言就是用 Python 可以说是人工智能把 Python
  • 2021年氯化工艺实操考试视频及氯化工艺考试试题

    题库来源 安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通 氯化工艺实操考试视频是安全生产模拟考试一点通生成的 氯化工艺证模拟考试题库是根据氯化工艺最新版教材汇编出氯化工艺仿真模拟考试 2021年氯化工艺实操考试视频及氯化工艺考试
  • Solidity 从入门到实战(一)

    solidity 从入门到实战 一 注意 本专栏主要来自于https www bilibili com video BV1St411a7Pk p 11 spm id from pageDriver的学习笔记 编写第一个案例 声明版本号 pr