【区块链-智能合约工程师】第二篇:Solidity入门

news2025/5/19 16:23:20

文章目录

    • Solidity极简入门
        • HelloWorld
        • 数值类型
        • 三种函数类型
        • 函数输出
        • 变量作用域
        • 引用类型

参考文章:一文速览2022十大智能合约开发工具

资料地址:WTF学院

Solidity极简入门

HelloWorld

remix:在线智能合约开发IDE(Integrated Development Environment,集成开发环境),可以在浏览器中快速部署测试智能合约。

合约HelloWorld:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;
contract HelloWeb3{
    string public hi = "Hello World!";
}
事项说明
代码所用的软件许可(license)不写许可的话编译时会警告(warning)
声明源文件所用的solidity版本将不允许小于 0.8.4 版本或大于等于 0.9.0 版本的编译器编译
Solidity语句分隔符; 结尾

在合约目录新建 HelloWorld.sol,点击编译然后再点击部署。部署在测试链上以后,点击我们的变量名就能调用成功。
在这里插入图片描述

数值类型

类型说明
数值类型布尔型bool
整数型包括整数int、正整数uint、大正整数uint256
地址类型address和payable其中payable的地址拥有balance和transfer()两个成员
定长字节数组byte, bytes8, bytes32,其中数字是长度
枚举enum类似python的集合类型,enum ActionSet { Buy, Hold, Sell }
-可以显式的和uint相互转换,并会检查转换的正整数是否在枚举的长度内

三种函数类型

[pure|view|payable]:决定函数权限/功能的关键字。payable(可支付的)很好理解,带着它的函数,运行的时候可以给合约转入ETH。

合约的状态变量存储在链上,gas fee 很贵,如果不改变链上状态,就不用付gas。包含pure跟view关键字的函数是不改写链上状态的,因此用户直接调用他们是不需要付gas的(合约中非pure/view函数调用它们则会改写链上状态,需要付gas)。

在以太坊中,以下语句被视为修改链上状态:

  1. 写入状态变量。
  2. 释放事件。
  3. 创建其他合同。
  4. 使用selfdestruct.
  5. 通过调用发送以太币。
  6. 调用任何未标记view或pure的函数。
  7. 使用低级调用(low-level calls)。
  8. 使用包含某些操作码的内联汇编。

小结:

  • pure 类型的函数不能读取也不能写入存储在链上的状态变量,只能传入形参进行处理。

  • view 类型的函数能读取但也不能写入状态变量,可以调用合约变量返回给一个新的变量。

函数输出

函数输出包括:返回多种变量、命名式返回、以及利用解构式赋值读取全部和部分返回值。

Solidity有两个关键字与函数输出相关:return和returns,区别在于:

  • returns加在函数名后面,用于声明返回的变量类型及变量名;
  • return用于函数主体中,返回指定的变量。

命名式返回:通过在 returns 标明返回变量的名称,solidity 会自动初始化并返回这些变量,无需 return 语句。

解构式赋值:solidity使用解构式赋值的规则,支持读取函数的全部或部分返回值。

变量作用域

引用类型(Reference Type):包括数组(array),结构体(struct)和映射(mapping),这类变量占空间大,赋值时候直接传递地址(类似指针)。由于这类变量比较复杂,占用存储空间大,我们在使用时必须要声明数据存储的位置。

solidity数据存储位置有三类:storage,memory和calldata。不同存储位置的gas成本不同。

storage类型的数据存在链上,类似计算机的硬盘,消耗gas多;memory和calldata类型的临时存在内存里,消耗gas少。大致用法:

  • storage:合约里的状态变量默认都是storage,存储在链上。
  • memory:函数里的参数和临时变量一般用memory,存储在内存中,不上链。
  • calldata:和memory类似,存储在内存中,不上链。与memory的不同点在于calldata变量不能修改(immutable),一般用于函数的参数。

赋值规则:只有两种同类型变量的赋值是创建地址引用

  • storage(合约的状态变量)赋值给本地storage(函数里的)时候,会创建引用,改变新变量会影响原变量。
  • storage赋值给memory,会创建独立的复本,修改其中一个不会影响另一个;反之亦然。
  • memory赋值给memory,会创建引用,改变新变量会影响原变量。
  • 其他情况,变量赋值给storage,会创建独立的复本,修改其中一个不会影响另一个

变量的作用域:按作用域划分有三种,分别是状态变量(state variable),局部变量(local variable)和全局变量(global variable)

  • 状态变量是数据存储在链上的变量,所有合约内函数都可以访问 ,gas消耗高。状态变量在合约内、函数外声明
  • 局部变量是仅在函数执行过程中有效的变量,函数退出后,变量无效。局部变量的数据存储在内存里,不上链,gas低
  • 全局变量是指 solidity 的预留关键字

引用类型

数组 Array 分为固定长度数组和可变长度数组两种:

  • 固定长度数组:在声明时指定数组的长度。用T[k]的格式声明
  • 可变长度数组(动态数组):在声明时不指定数组的长度。用T[]的格式声明

创建数组有一些固定规则:

  • 对于memory修饰的动态数组,可以用new操作符来创建,但是必须声明长度,并且声明后长度不能改变,例如 new uint[](5)
  • 数组字面常数(Array Literals)是写作表达式形式的数组,用方括号包着来初始化array的一种方式

数组成员:

length: 数组有一个包含元素数量的length成员,memory数组的长度在创建后是固定的。
push(): 动态数组和bytes拥有push()成员,可以在数组最后添加一个0元素。
push(x): 动态数组和bytes拥有push(x)成员,可以在数组最后添加一个x元素。
pop(): 动态数组和bytes拥有pop()成员,可以移除数组最后一个元素。

结构体:

// 结构体
    struct Student{
        uint256 id;
        uint256 score; 
    }

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

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

相关文章

DBCO-PEG-Aminooxy, Aminooxy-PEG-DBCO,氨甲基聚乙二醇环辛炔

DBCO-PEG-Aminooxy , Aminooxy-PEG-DBCO,二苯并环辛炔-聚乙二醇-氨甲基,氨甲基聚乙二醇环辛炔 Product specifications: 1.CAS No:N/A 2.Molecular weightMV:1000,2000,34000&#x…

小侃设计模式(十八)-发布订阅模式

1.概述 发布订阅模式又叫观察者模式(Observer Pattern),它是指对象之间一对多的依赖关系,每当那个特定对象改变状态时,所有依赖于它的对象都会得到通知并被自动更新,它是行为型模式的一种。观察者模式内部…

被吹爆的JVM笔记,一招教会什么是JVM调优,资深架构师强推!

面试经常被问 JVM 如何调优?这个问题该怎么回答?没有实际调优经验怎么办? 一般面试时问JVM调优,主要是因为,这个技术并不是懂了Java就能自然懂的,需要明白一些底层原理,有一些深度。所以比较适合…

传奇客户端文件介绍注解教程,GM必备知识

传奇客户端文件介绍注解教程,GM必备知识 很多朋友架设微端,或者说修改传奇版本素材方面的内容的时候对于客户端很懵逼! 尤其是新手朋友他并不知道传奇客户端里面哪个文件是对应什么内容的! 今天我们将这些发出来分享给支持奇速的朋…

高压放大器在IDE压电元件及其在仿生翼中的应用

实验名称:IDE压电元件及其在仿生翼中应用研究 研究方向:仿生学 测试目的: 优化IDE压电元件结构和组分出发,目的是为了获得大驱动位移、综合性能良好的IDE驱动件。着重研究IDE压电元件的力学和电学性能、驱动特性和在仿生翼上的集成…

LVGL学习笔记(一)--- 环境搭建

LVGL全程LittleVGL,是一个轻量化的,开源的,用于嵌入式GUI设计的图形库。并且配合LVGL模拟器,可以在电脑对界面进行编辑显示,测试通过后再移植进嵌入式设备中,可以高效地进行开发。 一.嵌入式设备的移植 L…

企业请体育冠军明星代言,为何要在年前邀请

行业形势好,要把握住消费升级的机会;行业调整时,要抓住结构性增长的机会。实力背书、冠军代言、让品牌成为品类创新,中小型这几个概念与品牌自身的卖点,每一个放在光中小型企业的品牌上都能独当一面,当一款…

C/C++ 内存分布---变量所在哪个内存区域以及变量所占空间大小是多少?

C/C内存区域划分: 变量所在哪个内存区域以及变量所占空间大小是多少? int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const …

基于JavaFX+Mysql实现(PC)足球联赛评分系统【100010048】

一、引言 1. 编写目的 本文档是概要设计文档的组成部分,编写数据库设计文档的目的是:明确数据库的表名、字段名等数据信息,用来指导后期数据库脚本的开发。本文档的读者对象是需求人员、系统设计人员、开发人员、测试人员。 2. ### 术语表 …

GPT3动口,RT-1动手,智能机器人开卷; 代码开源!

机器学习 (ML) 研究的多个子领域(例如计算机视觉和自然语言处理)的最新重大进展是通过一种共享的通用方法实现的,该方法利用大型、多样化的数据集和能够有效吸收所有数据的表达模型。尽管已经有各种尝试将这种方法应于机器人技术,…

绘制雪夜圣诞树并封装为小程序

绘制雪夜圣诞树并封装为小程序 使用turtle绘制一颗雪夜圣诞树,然后封装成exe小程序送给你的朋友吧! PS:只能在windows运行。 转载注明本文链接和作者 先看效果图: 绘制雪夜圣诞树 由于代码有三百多行,我放在下面的两…

Web前端105天-day45-DOM

DOM01 目录 前言 一、DOM 二、DOM树 三、class 总结 前言 DOM01学习开始 一、DOM DOM: Document Object Model 文档 : HTML代码 -- 超文本标记语言对象 : 网页真正显示的是 HTML 转换出来的 对象类型 -- document模型 : 固定的规则 -- 代表把 HTML代码 转 JS对象网页真…

Jmeter(十七):利用jmeter插件收集性能测试结果汇总报告和聚合报告,利用PerfMon插件收集监控服务器资源指标

利用jmeter插件收集性能测试结果 汇总报告(Summary Report ) 用来收集性能测试过程中的请求以及事务各项指标。通过监听器--汇总报告 可以添加该元件。界面如下图所示 汇总报告界面介绍: 所有数据写入一个文件:保存测试结果到本地…

全产业链落实循环减碳实践 宝马在华持续推进绿色转型

作为率先推出“循环减碳”理念的汽车企业,宝马集团将循环经济理念贯彻到产品生命周期的各个阶段,并以“再思考、再精减、再利用、再回收”为指导原则,在产业链上下游不断壮大“循环减碳朋友圈”。“可持续发展是宝马集团的战略支点之一”&…

【爬虫】JS调试解决反爬问题系列1

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

AlibabaP8,耗时182天肝出来1015页分布式全栈手册

前言 到底什么是分布式?这个话题一直以来就在各大平台论坛上被热议。一千个读者里面就有一千个哈姆雷特。官方这边给出的结论是:分布式就是将相同或相关的程序运行在多台计算机上,从而实现特定目标的一种计算方式。而从分布式技术的起源来看…

这可能是2022最全的Java面试八股文!共计1658页,Java技术手册的天花板

前两天有个小伙伴在后台留言,最近的面试越来越难了,尤其是技术面,考察得越来越细,越来越底层,庆幸的是最终顺利找到了工作。 一般技术面试官都会通过自己的方式去考察程序员的技术功底与基础理论知识 比如果这样的问题…

mitmproxy 抓包神器-1.环境准备与抓取浏览器请求

前言 常见的抓包工具有fiddler 和 charles, 这些工具都是需要安装本地客户端,python 版的抓包工具可以用 mitmproxy。 mitmproxy 相比Charles、fiddler的优点在于,它可以命令行方式或脚本的方式进行mock 简介 mitmproxy(man-in-the-middle…

阿里云效产品【流水线Flow】企业项目代码一件发布各个云服务器

文章目录前言一、准备项目代码1.默认的项目2.浏览器访问二、使用步骤1.进入工作台2.创建流水线3.代码源4.代码扫描5.单元测试6.代码构建7.主机部署8.部署脚本三、运行测试1.运行流水线2.测试报告3.访问项目总结前言 「流水线」,又名「Flow」,是一款企业…

二、Qt定时器与文本编辑器制作《QT 入门到实战》

学习目标 了解 qt 的 pixmap了解 qt 的 label 如何显示图片了解定时器的开启了解定时器的关闭了解文件如何进行读取了解 QFileDialog 的使用了解了一个文本编辑器的基本编写巩固了 connect 的使用 一、制作一个图片浏览器 1.1 Pixmap 在 Qt 中使用 Label 可以显示文本&…