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,在下面的函数中无法识别变量auint _b; // 整型属于值类型,赋值的本质是拷贝数据// 函数(无返回值,传入i,赋值给_a、_b)function setAll(uint i) public{_a = _b = i;}//solidity命名规范下划线_afunction 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~255int8 _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);}}
数组的遍历数组的更新,对动态数组的添加操作
相关文章:
solidity基础语法(以太坊solidity合约)
solidity基础语法(以太坊solidity合约) 1-值类型和取值范围2-引用类型3-引用类型高阶4-固定数组和动态数组 1-值类型和取值范围 https://learnblockchain.cn/docs/solidity/introduction-to-smart-contracts.html#subcurrency https://learnblockchain…...
【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2
【机器学习实战】电力需求预测挑战赛 Datawhale AI 夏令营 task2 一、赛题背景二、赛题任务三、评审规则四、具体实践4.1 实现的思路4.2 理论介绍GBDTLightGBM 4.3 代码的实现与运行4.3.1 导入模块4.3.2 探索性数据分析(EDA)4.3.3 特征工程4.3.4 模型训练…...
【设计模式】【创建型模式】【02工厂模式】
系列文章 可跳转到下面链接查看下表所有内容https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501文章浏览阅读2次。系列文章大全https://blog.csdn.net/handsomethefirst/article/details/138226266?spm1001.2014.3001.5501 目录 系…...
FPGA设计中的流水线 -分割大的计算电路可以更快的处理数据。
FPGA(现场可编程门阵列)设计中的流水线优化是一种提高设计性能的技术,它通过将设计分解为多个阶段或步骤来实现。每个阶段可以并行执行,从而提高整体的吞吐量和效率。以下是流水线优化的一些关键概念和作用: 意思&…...
GNU/Linux - U-BOOT的GPIO command
在嵌入式Linux开发中,先运行的是u-boot,然后再加载Linux内核。 启动时如果设置了u-boot等待时间,在等待时间内,按任意键就会进入u-boot命令行环境。 在u-boot命令行环境下,可以使用gpio命令来操作GPIO。 Synopsis gpi…...
35.UART(通用异步收发传输器)-RS232(2)
(1)RS232接收模块visio框图: (2)接收模块Verilog代码编写: /* 常见波特率: 4800、9600、14400、115200 在系统时钟为50MHz时,对应计数为: (1/4800) * 10^9 /20 -1 10416 …...
OpenLayers学习笔记-点位聚合
需求 用户点击行政区划等操作后,从后台获取区域内的点位数据,在地图上聚合显示。用户手动取消聚合,点位直接渲染在地图上。 实现过程 使用后台返回的点位数据,通过new ol.source.Vector({features})创建矢量数据源。使用new ol.source.Cluster({source})创建聚合标注数据…...
flutter实现语言的国际化
目录 前言 一、GetX实现国际化(推荐) 1.安装Getx 2.创建国际化的文件 3.使用国际化字符串 4.配置GetMaterialApp 5.更改语言 6.系统语言 编辑 7.原生工程配置 1.iOS工程配 1.打开iOS工程,在Project的info里面添加语言 2.创建String File文件 2.andr…...
服务端正常启动了,但是客户端请求不到
服务端正常启动了,但是客户端请求不到有哪些原因?如何排查? 如果客户端请求的接口没有响应,排查的方式: 检查接口IP地址是否正确,ping一下接口地址。 检查被测接口端口号是否正确,可以在本机Telnet接口的IP和端口号…...
鸿蒙开发 -本地数据库操作
// 1导入模块 import relationalStore from @ohos.data.relationalStore;export class AthUserDbManager{//2.获取RdbStore实例,要注意的是,此处的getContext(this)用于获取应用上下文:getcreatDbtable(dbname:string){//配置数据库信息:const STORE_CONFIG :relationalStor…...
主机安全-进程、命令攻击与检测
目录 概述反弹shell原理nc/dev/xxx反弹shell下载不落地反弹Shell各种语言反弹shell linux提权sudosuid提权mysql提权 Dnslog参考 概述 本文更新通过在主机(不含容器)上直接执行命令或启动进程来攻击的场景。检测方面以字节跳动的开源HIDS elkeid举例。每…...
FPGA FIR fdatool filter designer MATLAB
位数问题 fdatool 先确定输入信号的位宽,比如17位在fdatool中,选set quantization parameters 选input/output 设置input word length 为17bit(not confirmed) fir compiler implementation 注意: 当设置输入位宽为16位时,ip核…...
水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集)
水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 目录 水表数字识别2:Pytorch DBNet实现水表数字检测(含训练代码和数据集) 1.前言 2. 水表数字识别的方法 3. 水表数字识别数据集 4. 水表数字分割模型训练 (1&#x…...
Windows 点云生成二维栅格图 [附C++完整代码实现]
点云压缩-2D栅格图 一、点云压缩(二维栅格图)二、算法流程三、代码实现四、结果可视化一、点云压缩(二维栅格图) 点云压缩:点云是海量点的集合,其数据量通常非常庞大。直接存储这些未经压缩的点云数据会消耗大量的存储空间,特别是在处理大规模的点云数据时,这个问题变得…...
SpringBoot结合ip2region实现博客评论显示IP属地
你好呀,我是小邹。 在现代的Web应用中,特别是博客和论坛类网站,为用户提供地理定位服务(如显示用户所在地理位置)可以极大地增强用户体验。本文将详细探讨如何使用Java和相关技术栈来实现在博客评论中显示用户的地址信…...
设计模式使用场景实现示例及优缺点(行为型模式——策略模式)
在遥远的王国里,有三个重要的角色:国王策略模式、他的皇家顾问算法家族,以及年轻的骑士接口。国王策略模式统治着整个王国,他的职责是确保每一个编程问题都能找到最合适的解决方案。 有一天,王国遇到了一场危机。编程王…...
ReactRouter v6升级的步骤
React Router v6 引入了一个 Routes 组件,它有点像 Switch ,但功能要强大得多。与 Switch 相比, Routes 的主要优势在于: <Routes> 中的所有 <Route> 和 <Link> 都是相对的。这导致在 <Route path> 和 &…...
【JVM实战篇】内存调优:内存问题诊断+案例实战
文章目录 诊断内存快照在内存溢出时生成内存快照MAT分析内存快照MAT内存泄漏检测的原理支配树介绍如何在不内存溢出情况下生成堆内存快照?MAT查看支配树MAT如何根据支配树发现内存泄漏 运行程序的内存快照导出和分析快照**大文件的处理** 案例实战案例1:…...
专业条码二维码扫描设备和手机二维码扫描软件的区别?
条码二维码技术已广泛应用于我们的日常生活中,从超市结账到公交出行,再到各类活动的入场验证,条码二维码的便捷性不言而喻,而在条码二维码的扫描识别读取过程中,专业扫描读取设备和手机二维码扫描软件成为了两大主要工…...
基于嵌入式Linux的高性能车载娱乐系统设计与实现 —— 融合Qt、FFmpeg和CAN总线技术
随着汽车智能化的发展,车载娱乐系统已成为现代汽车的标配。本文介绍了一个基于Linux的车载娱乐系统的设计与实现过程。该系统集成了音视频娱乐、导航、车辆信息显示等功能,旨在提供安全、便捷、丰富的驾驶体验。 1. 项目概述 随着汽车智能化的发展&…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...
给网站添加live2d看板娘
给网站添加live2d看板娘 参考文献: stevenjoezhang/live2d-widget: 把萌萌哒的看板娘抱回家 (ノ≧∇≦)ノ | Live2D widget for web platformEikanya/Live2d-model: Live2d model collectionzenghongtu/live2d-model-assets 前言 网站环境如下,文章也主…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
DAY 45 超大力王爱学Python
来自超大力王的友情提示:在用tensordoard的时候一定一定要用绝对位置,例如:tensorboard --logdir"D:\代码\archive (1)\runs\cifar10_mlp_experiment_2" 不然读取不了数据 知识点回顾: tensorboard的发展历史和原理tens…...
李沐--动手学深度学习--GRU
1.GRU从零开始实现 #9.1.2GRU从零开始实现 import torch from torch import nn from d2l import torch as d2l#首先读取 8.5节中使用的时间机器数据集 batch_size,num_steps 32,35 train_iter,vocab d2l.load_data_time_machine(batch_size,num_steps) #初始化模型参数 def …...
背包问题双雄:01 背包与完全背包详解(Java 实现)
一、背包问题概述 背包问题是动态规划领域的经典问题,其核心在于如何在有限容量的背包中选择物品,使得总价值最大化。根据物品选择规则的不同,主要分为两类: 01 背包:每件物品最多选 1 次(选或不选&#…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
