solidity基础语法(以太坊solidity合约)

news2024/9/22 13:39:37

solidity基础语法(以太坊solidity合约)

  • 1-值类型和取值范围
  • 2-引用类型
  • 3-引用类型高阶
  • 4-固定数组和动态数组

1-值类型和取值范围

https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#subcurrency

https://learnblockchain.cn/docs/solidity/types.html

在这里插入图片描述

定长数组是值类型,不定长数组是引用类型

String也是引用类型

字符串、不定长数组及结构体都是引用类型

在这里插入图片描述
在这里插入图片描述

当部署出现问题等等,但代码无错时,尝试离开网站,再次进入重新编译部署
在这里插入图片描述

注意solidity版本

值类型修改_a不会影响到_b,只是值的复制

而引用类型则是会影响的

在这里插入图片描述
在这里插入图片描述

Demo1和demo2的合约区分类型unit

pragma solidity >=0.4.0 <0.7.0; // 声明solidity的版本

// 创建一个智能合约(合约名第一个字母一般大写)
contract Demo01{
    uint _a;    //solidity命名规范下划线_a,若直接a,在下面的函数中无法识别变量a
    uint _b;  // 整型属于值类型,赋值的本质是拷贝数据
    
    // 函数(无返回值,传入i,赋值给_a、_b)
    function setAll(uint i) public{
        _a = _b = i;
    }
    
    //solidity命名规范下划线_a
    function setA(uint a) public{
        _a = a;
    }
    
    // view: 代表当前函数不会修改账本的数据,只读函数,不会修改账本数据,不写也行会有警告
    // int uint 大小默认是256
    //returns (uint,uint) 具有返回值
    function getAB() public view returns (uint,uint){
        return (_a,_b);
    }
    
}

contract Demo02{
    uint8 _a;  // 0~255
    int8 _b;  // 整型属于值类型,赋值的本质是拷贝数据  -128 ~127
    
    // 函数
    function setAll(uint8 a,int8 b) public{
        _a = a;
        _b = b;
    }
    
    function setA(uint8 a) public{
        _a = a;
    }
    // view: 代表当前函数不会修改账本的数据
    // int uint 大小默认是256,可以接受unit8的类型(当输入值300则超出unit界限255,int8 128范围)
    function getAB() public view returns (uint,int){
        return (_a,_b);
    }
    
}

编译成功

值类型修改_a不会影响到_b,只是值的复制

而引用类型则是会影响的

// int uint 大小默认是256

在solidity中unit256,8等等类型

非常多的细微类型,java中硬件便宜,智能合约写的成本很高,所以严格限制写的操作

数据类型大小非常严格

设计使用等非常严格

2-引用类型

https://learnblockchain.cn/docs/solidity/types.html#reference-types

在这里插入图片描述

值类型是不断复制

告诉程序,引用类型是存到内存中作为临时变量还是存在状态中作为永久的变量

之前的合约,参数默认存储memery局部变量

内存memary临时的

存储storyge永久的

现在引用,不同的引用类型数据位置相互赋值

多了数据存储位置的概念在solidity

下方重要

pragma solidity >=0.6.1 <0.7.0;
// 1: solidity: 数据类型:值类型,引用类型 (数组、结构体,映射、字符串(bytes数组)

// 2: 值传递是副本,而引用类型既可传递指针,也可传递副本(传递规则受数据位置影响)

// 3: 三种位置,先掌握内存与存储变量

        // 1: 内存,局部变量 --> 函数调用完毕后消失

        // 2: 状态,全局变量  ---> 随着合约部署到区块链中(以太坊分布式账本) 

        // 3: 调用数据 (暂时理解成内存变量 略)
        
// 4: 默认的函数参数,包括返回的参数,他们默认是memory。默认的局部变量是storage。而状态变量肯定是storage(不用指定)

// 5: 不同数据位置的引用类型赋值会创建副本,而相同数据位置引用类型仅仅赋值指针

// 注意:在版本0.5.0之前,数据位置可以省略,在0.5.0之后需要指定
contract RefType{
    
    function modifyName(string memory name) pure public returns(string memory){
        // 声明临时string类型的变量
        // string memory name1 = name;
        // // string是可变量的,但是可以先强转为字符数组
        // bytes(name1)[0] = 'J';
        string memory name1 = name;
        bytes(name)[0] = 'J';
        return name1;
        
    }
}

在这里插入图片描述

修改name1返回name1,值变了

修改name返回name1则和上面的结果一样

相同的引用类型是指针复制

即传入的string memory name和赋值string memory name1 = name;都是相同的引用类型,是指针赋值

在这里插入图片描述

引用类型必须指定数据存储位置,数据存储位置还会影响引用类型之间的赋值

3-引用类型高阶

如果是引用类型,并且它的数据位置是memary,则其传递的是指针,没有产生相应的副本

pragma solidity >=0.6.1 <0.7.0;

//

contract RefType{
    // 状态变量 storage (不能修改为内存变量)(此类变量会随着合约的部署存储到分布式账本,后面的众筹的钱就要存到状态变量中
    //否则内存变量一旦执行完毕就会消失)
    string public _name = "solidity";   //加入的public为访问修饰符,若不加,编译部署后,在左下测无此变量。Public任何的属性和函数都可以访问
    
    function f() public{
        
        modifyName(_name);
    }
    
    
    // public 函数参数和返回数据类型必须为memory
// internal 受保护的函数,仅仅自身合约或者子合约(支持继承)才能被调用
//pure代表不能对当前变量读写所以去掉,下方在进行读写
//下方传入状态变量
//函数中赋值也为状态变量,数据存储位置相同传递的是指针,即更改某个只会影响到另一个值

    function modifyName(string storage name) internal{
        // storage name --> storage name1 传递的是指针
        //  string storage name1 = name; 
        // storage name --> memory name1 传递的是数据的副本  
        string memory name1 = name; 
        bytes(name1)[0] = 'S';
    }
}


    string public _name = "solidity";   //加入的public为访问修饰符,若不加,编译部署后,在左下测无此变量

// 1: solidity: 数据类型:值类型,引用类型 (数组、结构体,映射、字符串(bytes数组)


有些合约需要存储到分布式账本,所以在solidity中不但有数据类型还有数据类型所存的位置,存储位置针对引用类型和值类型无关

// 2: 值传递是副本,而引用类型既可传递指针,也可传递副本(传递规则受数据位置影响)

// 3: 三种位置,先掌握内存与存储变量

        // 1: 内存,局部变量 --> 函数调用完毕后消失

        // 2: 状态,全局变量  ---> 随着合约部署到区块链中(以太坊分布式账本) 

        // 3: 调用数据 (暂时理解成内存变量 略)
        
// 4: 默认的函数参数,包括返回的参数,他们默认是memory。默认的局部变量是storage。而状态变量肯定是storage(不用指定)

// 5: 不同数据位置的引用类型赋值会创建副本,而相同数据位置引用类型仅仅赋值指针

状态变量默认是storyge存储类型的

4-固定数组和动态数组

pragma solidity >=0.6.0 <0.7.0;

// 数组是数据类型, 但更具体的说,它是依赖其它数据类型的数据结构(数组指的是相同类型的数值组)

// Solidity中的数组可以是固定数组或者动态数组

contract ArrDemo{
    
    // 固定数组:声明时预定了大小的数组,而且后期不能修改
    uint[5] age;
// 动态数组: 声明时没有预定大小的数组,可以新增元素
//后期商品的众筹,但是平台有多少个商品,初始是不知道的,商品是个复杂结构体
    uint[] age2 =  [uint(10),20,30,40];
    
//构造函数
    constructor()public{
        age = [uint(10),20,30,40];//初始化了4个元素,最后第五个元素未初始化默认零
    }
    
    // 通过for + length循环来进行迭代
    function sum() public view returns(uint){
        uint total = 0;
        for(uint i =0;i<age.length;i++){
            total += age[i];
        }
        // 固定数组Length不能修改
        // age.length = 10;
        return total;
    }
    // 固定数组可以通过index对数组的值进行操作, 但是不能新增
    function setValue(uint index,uint value)public{
        age[index] = value;
        // 静态数组没有push函数
        // age.push(value);
    }
    
    
    function sum2() public view returns(uint,uint){
        uint total = 0;
        for(uint i =0;i<age2.length;i++){
            total += age2[i];
        }
        // 固定数组Length不能修改
        // age.length = 10;
        return (total,age2.length);	//返回多个值需要括号
    }
    
    // 动态数组支持新增操作(length大小是可以扩充的)
    function addValue(uint val) public{
        age2.push(val);
    }
    
    
    
}

数组的遍历数组的更新,对动态数组的添加操作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1930279.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

R语言包AMORE安装报错问题以及RStudio与Rtools环境配置

在使用R语言进行AMORE安装时会遇到报错&#xff0c;这时候需要采用解决办法&#xff1a; AMORE包安装&#xff0c;需要离线官网下载安装包&#xff1a; Index of /src/contrib/Archive/AMORE (r-project.org)https://cran.r-project.org/src/contrib/Archive/AMORE/ 一、出现…

MySQL第九次作业

1、安装redis&#xff0c;启动客户端、验证。 首先选择版本 进去之后是这样&#xff0c;一个是压缩包&#xff0c;一个是安装包 点击下载好的安装包&#xff0c;开始安装 选择“添加Redis目录到环境变量PATH中”&#xff0c;这样方便系统自动识别Redis执行文件在哪里。 其他一…

新版本 idea 创建不了 spring boot 2 【没有jkd8选项】

创建新项目 将地址换成如下 https://start.aliyun.com/

厂家置换电费如何达到最大化收益

新能源行业知识体系-------主目录-----持续更新https://blog.csdn.net/grd_java/article/details/140004020 文章目录 一、电能电费二、同时刻不同厂家置换&#xff0c;不会影响最终电能电费结果三、风险防范补偿和回收机制四、我们的数据如何考虑补偿和回收五、如何利用补偿和…

元宇宙深入解析

元宇宙&#xff08;Metaverse&#xff09;是一个新兴的概念&#xff0c;它激发了技术专家、艺术家和商业领袖的无限想象。它代表着数字互动的新前沿&#xff0c;提供了一个平行的数字宇宙&#xff0c;用户可以在其中实时互动&#xff0c;超越物理世界的限制。 元宇宙是什么&am…

计算机毕业设计django+hadoop+scrapy租房可视化 租房推荐系统 租房大屏可视化 租房爬虫 spark 58同城租房爬虫 房源推荐系统

python scrapy bootstrap jquery css javascript html 租房信息数据展示 租房地址数量分布 租房类型统计 租房价格统计分析 租房面积分析 房屋朝向分析 房屋户型平均价格统计分析 房屋楼层统计分析 房屋楼层与价格统计分析 房屋地址与价格统计分析 房屋相关信息词云展示 租房…

计算机网络——网络层(路由选择协议、路由器工作原理、IP多播、虚拟专用网和网络地址转换)

目录 路由选择协议 因特网的路由选择协议特点 路由信息协议RIP RIP衡量目的网络距离 RIP选择路由器的方式 RIP具有以下三个重要特点 RIP的基本工作流程 RIP的距离向量算法 ​编辑 ​编辑 RIP存在的问题——“坏消息传播得慢” RIP的封装 开放最短路径优先协议OSPF…

关于window配置gitlab和gitee平台共存

今天使用gitlab拉取代码突然提示 gitgitlab.xxx.com: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password). 以为是ssh公钥没有配置好&#xff0c;遂又进行了一番配置&#xff0c;实际上并不是这个问题造成的&#xff0c;但还是想记录一下步骤&#xff0c;以…

【内网穿透】打洞笔记

文章目录 前言原理阐述公网sshfrp转发服务 实现前提第一步&#xff1a;第二步第三步第四步 补充第五步&#xff08;希望隧道一直开着&#xff09;sftp传数据&#xff08;嫌云服务器上的网太慢&#xff09; 前言 租了一个云服务器&#xff0c;想用vscode的ssh远程连接&#xff…

迅为3A5000_7A2000ATX标准DIY国产龙芯电脑

性能强 采用全国产龙芯3A5000处理器&#xff0c;基于龙芯自主指令系统 (LoongArch)的LA464微结构&#xff0c;并进一步提升频率&#xff0c;降低功耗&#xff0c;优化性能。 桥片 采用龙芯 7A2000&#xff0c;支持PCIE 3.0、USB 3.0和 SATA 3.0.显示接口2 路、HDMI 和1路 VGA&a…

蓝桥杯14小白月赛题解

直接输出pi/ti,for遍历 #include <iostream> using namespace std; #define int long long int a,b,c ; double t1.00; signed main() {cin>>a;int an0;for(int i1;i<a;i){cin>>b>>c;if(t>c*1.00/b){tc*1.00/b;ani;} }cout<<an<<e…

基于JAVA+SpringBoot+Vue+uniapp的微信小程序点餐平台

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 点餐小程序主要为小个…

LabVIEW设备检修信息管理系统

开发了基于LabVIEW设计平台开发的设备检修信息管理系统。该系统应用于各种设备的检修基地&#xff0c;通过与基地管理信息系统的连接和数据交换&#xff0c;实现了本地检修工位数据的远程自动化管理&#xff0c;提高了设备的检修效率和安全性。 项目背景 现代设备运维过程中信…

AV1技术学习:Affine Motion Compensation

一、Affine Model Parameter 除了传统的平移运动补偿&#xff0c;AV1 还支持仿射变换模型&#xff0c;将当前像素点 (x, y) 通过以下方式投影到参考帧中的预测像素点 (x, y). 参数 (h13, h23) 对应于平移模型中使用的常规运动向量。 参数 h11 和 h22 控制垂直和水平轴上的比例…

“SelectDB 实时数据仓库解决方案”入围工信部“信息技术应用创新典型解决方案”

7 月 11 日&#xff0c;由工业和信息化部网络安全产业发展中心&#xff08;工业和信息化部信息中心&#xff09;主办的 2024 信息技术应用创新发展大会暨解决方案应用推广大会在天津落下帷幕&#xff0c;会上集中发布了一系列技术水平先进、应用效果突出、产业带动性强的信息技…

MySQL(5)表的查询

目录 1.表的查询 1.表的查询: 1.1创建表: 语法: create table 表名( 字段 类型 约束, 字段 类型 约束, ... 字段 类型 约束 ); 1.2 单行数据全行插入: &#x1f330; 表的字段都插入数据: insert into student values(100, 1000, 唐三藏, null); 1.3 多行数据 指定列插入:…

【Java--数据结构】二叉树

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 树结构 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合 注意&#xff1a;树形结构中&#xff0c;子…

Java爬虫安全策略:防止TikTok音频抓取过程中的请求被拦截

摘要 在当今互联网时代&#xff0c;数据采集已成为获取信息的重要手段。然而&#xff0c;随着反爬虫技术的不断进步&#xff0c;爬虫开发者面临着越来越多的挑战。本文将探讨Java爬虫在抓取TikTok音频时的安全策略&#xff0c;包括如何防止请求被拦截&#xff0c;以及如何提高…

HTTPS请求头缺少HttpOnly和Secure属性解决方案

问题描述&#xff1a; 建立Filter拦截器类 package com.ruoyi.framework.security.filter;import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.framework.…

YOLOv8目标跟踪deepsort

原文:YOLOv8目标跟踪deepsort - 知乎 (zhihu.com) 一、YOLOV8 tracking 参考文章: Ctrl CV:YoloV5 + DeepSort1 赞同 0 评论文章 二、行人重识别(ReID) ——Market-1501 数据集 2.1、数据集简介 Market-1501 数据集在清华大学校园中采集,夏天拍摄,在 2015 年构建并…