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. 项目概述 随着汽车智能化的发展&…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...
laravel8+vue3.0+element-plus搭建方法
创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...
A2A JS SDK 完整教程:快速入门指南
目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库ÿ…...

iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要
根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分: 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

数据结构:递归的种类(Types of Recursion)
目录 尾递归(Tail Recursion) 什么是 Loop(循环)? 复杂度分析 头递归(Head Recursion) 树形递归(Tree Recursion) 线性递归(Linear Recursion)…...

云安全与网络安全:核心区别与协同作用解析
在数字化转型的浪潮中,云安全与网络安全作为信息安全的两大支柱,常被混淆但本质不同。本文将从概念、责任分工、技术手段、威胁类型等维度深入解析两者的差异,并探讨它们的协同作用。 一、核心区别 定义与范围 网络安全:聚焦于保…...