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

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);
    }
    
    
    
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

长按加速- 解决react - setInterval下无法更新问题

最开始直接setInterval里&#xff0c;useState硬写&#xff0c;发现更新不&#xff0c;固定值 换let&#xff0c;发现dom更新不了 正确做法是用ref 并且pc端可以长按的&#xff0c;只是要用onTouchStart&#xff0c;不要用onMouseDown onTouchStart{handleMouseDown} onTou…

MFC程序创建word,创建表格,写入数据

文章目录 1、MFC程序功能&#xff1a;2、MFC程序实现2.1 创建项目2.2 添加word操作类2.3 添加word资源2.4 编写代码&#xff0c;实现将数据写入到word2.5 运行程序、验证功能3、工程代码下载 1、MFC程序功能&#xff1a; 创建word文档&#xff1b;向文档中写入字符串&#xff…

探索Docker网络配置和管理

目录 1.docker网络类型有几种&#xff1f; 2.自定义网络管理 1.查看网络信息 2.查看网络的详细信息 3.创建四种网络容器 3.none类型 1.验证 4.host类型 1.验证 5. bridge类型 1.验证 2.设备对 6. container类型 1.验证 2.详解 7.科普下docker的网络名称空间 “…

Pixi.js技术探索:开发者必备的视觉开发工具

pixi.js是一个开源的轻量级2D渲染引擎&#xff0c;专注于利用WebGL和HTML5中的Canvas技术来实现高性能的交互式图形和动画。它旨在提供一个简单而强大的工具集&#xff0c;使开发者能够轻松地创建各种类型的视觉效果&#xff0c;包括游戏、数据可视化、广告和其他富媒体应用程序…

JAVA零基础学习1(CMD、JDK、环境变量、变量和键盘键入、IDEA)

JAVA零基础学习1&#xff08;CMD、JDK、环境变量、变量和键盘键入、IDEA&#xff09; CMD常见命令配置环境变量JDK的下载和安装变量变量的声明和初始化声明变量初始化变量 变量的类型变量的作用域变量命名规则示例代码 键盘键入使用 Scanner 类读取输入步骤示例代码 常用方法处…

【服务器】端口映射

文章目录 1.端口映射的概念1.1 端口映射的类型1.2 端口映射的应用场景1.3 示例 2.为什么要进行端口映射呢&#xff1f;3.原理3.1【大白话】原理解释3.2 原理图 4.代码 1.端口映射的概念 端口映射&#xff08;Port Mapping&#xff09;&#xff0c;也称为端口转发&#xff08;P…

第二届大数据、计算智能与应用国际会议(BDCIA2024)

会议日期&#xff1a;2024年11月15-17日 会议地点&#xff1a;中国-湖北省-黄冈市 主办单位&#xff1a;黄冈师范学院 【大会主席】 【主讲嘉宾】 大会邀请到来自美国、英国、加拿大、新加坡、意大利、越南等10余位领域内学术大咖作主题报告&#xff0c;并与参会人员互动交…

【操作系统】文件管理——文件的物理结构(个人笔记)

学习日期&#xff1a;2024.7.15 内容摘要&#xff1a;文件的物理结构&#xff0c;逻辑结构与物理结构 目录 引言 文件分配方式 连续分配 链接分配 隐式链接 显式链接 索引分配 索引块大小不够装入整个索引表怎么办&#xff1f; ①链接方案 ②多层索引 ③混合索引 …

国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 专题二

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客 sqlsugar 官网-CSDN博客 4、进阶功能 5、集成整合 6、脚手架应用 4、进阶功能 4.1、生命周期 Queryable 什么时候操作库 Queryable是一个引用类型 Queryable拷贝机制 {ISugarQueryable<Student> quer…

切换网页visibilitychange,的升级版实现

目录 1 需求场景 2 用到的技术 3 日常检测方法 4 一个有意思的场景 5 升级版实现一 5.1 新建 /utils/browser.js 5.2 项目业务组件中使用 6 升级版实现二 6.1 安装js-tool-big-box工具库 6.2 引入 browserBox 对象 6.3 以控制累加定时器为例 6.4 查看定时器效果 1…

go 切片进行链式操作并支持泛型

背景&#xff1a; 由于团队不是专业级别的go开发人员&#xff0c;主开发还是java&#xff0c;用惯了java的lambda表达式特别是流式操作&#xff0c; 所以在用go语言时&#xff0c;发现切片处理起来比较麻烦&#xff0c;看看能不能支持类似流式操作&#xff0c;我这边就研究了下…

什么是STM32?嵌入式和STM32简单介绍

1、嵌入式和STM32 1.1.什么是嵌入式 除了桌面PC之外&#xff0c;所有的控制类设备都是嵌入式 嵌入式系统的定义&#xff1a;“用于控制、监视或者辅助操作机器和设备的装置”。 嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板&#xff0c;是一种专用的计算机系统。…

启动react 18.2.x项目报node错误

1、项目启动报错&#xff0c;node版本问题 可以考虑把node版本降低一点&#xff0c;我当时node版本是20.xx 后面我把本本降到16.13.1 2、tsconfig.json的飘红问题 这里提示的是这个字段已经不用了&#xff0c;建议删除该字段&#xff0c;所以删除该字段就好&#xff0c;其实…

[经典]Axrue部件库:Android系统部件

部件库预览链接&#xff1a;&#xff08;请与班主任联系获取文档&#xff09; 支持版本: Axrure RP 8 文件大小: 1200KB 模板目录 黑、白两种UI风格 每天 文档内容介绍 免费领取资料 “210630” 领取

JavaScript object 数据更新方法

https://andi.cn/page/621560.html

JS-11G1端子排静态时间继电器 约瑟JOSEF

JS-11G端子排静态时间继电器 系列型号&#xff1a; JS-11G1端子排静态时间继电器&#xff1b;JS-11G2端子排静态时间继电器; JS-11G3端子排静态时间继电器; JS-11G4端子排静态时间继电器; JS-11G5端子排静态时间继电器;JS-11G7端子排静态时间继电器; JS-11G9端子排静态时间…

沙袋装袋机的原理和特点_鼎跃安全

在现代工业和建筑领域&#xff0c;沙子等散状物料的包装是一个必不可少的环节。传统的手工包装方式效率低下且劳动强度大&#xff0c;而沙袋装袋机的出现则极大地提高了包装效率和质量。 一、沙袋装袋机的工作原理 沙子通过输送系统从储料仓输送到装袋机的料斗中。输送系统设计…

SpringBoot中动态注册Bean的方式

测试环境&#xff0c;本文源码 Java&#xff1a;8SpringBoot&#xff1a;2.5.14示例场景&#xff1a;动态注册ProxyServlet&#xff0c;间接实现类似于Nginx的反向代理功能 先理解如何实现动态注册 Bean 。 由于在 SpringBoot 中&#xff0c;先进行 Bean 的定义&#xff0c;…

道路巡检准确率优于90%,千寻驰观是怎么做到的?

在7月初落下帷幕的2024世界人工智能大会上&#xff0c;人形机器人十八罗汉齐聚现场&#xff0c;“百模大战”精彩开演&#xff0c;还有多种大模型在产业端应用和落地&#xff0c;AI浪潮席卷而来。千寻位置携北斗时空智能AI应用千寻驰观产品亮相大会&#xff0c;备受瞩目。 2024…

释放DOE的能量,快速确定最佳工艺设置,节省时间、成本和资源

您是否希望降低成本、提高生产效率&#xff0c;并最大限度地减少行业对环境的影响&#xff1f; 所有行业&#xff0c;尤其是钢铁、铝、水泥和石化等能源密集型行业&#xff0c;都面临着应对这些挑战的持续压力。供应链压力、可持续发展、严格的监管环境、日益增长的消费者预期…