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

这篇具有很好参考价值的文章主要介绍了【区块链-智能合约工程师】第二篇:Solidity入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

参考文章:一文速览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,点击编译然后再点击部署。部署在测试链上以后,点击我们的变量名就能调用成功。
【区块链-智能合约工程师】第二篇:Solidity入门

数值类型
类型 说明
数值类型 布尔型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()成员,可以移除数组最后一个元素。

结构体:文章来源地址https://www.toymoban.com/news/detail-493015.html

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

到了这里,关于【区块链-智能合约工程师】第二篇:Solidity入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 区块链智能合约编程语言 Solidity

    上文介绍了区块链生态发展,我们知道以太坊的到来可以使开发人员基于区块链开发DApp,本文介绍 Solidity 编程语言的使用,然后基于 Solidity 编写一个简单的智能合约。 Solidity 是以太坊开发人员使用的编程语言,用来编写智能合约,运行在以太坊虚拟机(EVM)上。 有开发经

    2024年02月12日
    浏览(40)
  • 【区块链实战】Solidity 智能合约如何给账户充值

    目录 一、实战场景 二、知识点 智能合约 智能合约函数 智能合约充值 payable 智能合约部署地址 智能合约的运行 合约 this 对象 三、菜鸟实战 四、运行结果 Solidity 智能合约如何给账户充值 1、充值金额 2、充值并查看结果

    2024年02月09日
    浏览(37)
  • 陪伴成长|区块链工程师能力认证项目启动BSV奖励计划

    由可一科技与CSDN联合运营的BSV区块链开发工程师能力认证项目于2022年6月6日发布了首门正式课程《区块链原理初级》,并于6月27日正式启动了区块链工程师能力初级认证。 为鼓励广大区块链爱好者积极学习课程、奖励优秀学员,今天我们正式推出“陪伴成长•BSV奖励计划”

    2024年02月16日
    浏览(45)
  • 区块链智能合约solidity的中的一些关键字

    目  录 pragma mapping msg对象 block对象 contract constructor struct 数据地址 地址类型 address payable revert 以下场景使用 revert() : require 以下场景使用 require() : assert 以下场景使用 assert(): 访问权限 internal public private external function returns return view pure constant event emit modifier pragma   

    2024年01月16日
    浏览(60)
  • 区块链web3智能合约Solidity学习资源整理

    Solidity 是一门面向合约的、为实现智能合约而创建的高级编程语言。这门语言受到了 C++,Python 和 Javascript 语言的影响,设计的目的是能在以太坊虚拟机(EVM)上运行。 Solidity中文官方文档: https://solidity-cn.readthedocs.io/zh/develop/ https://learnblockchain.cn/docs/solidity/index.html 在线rem

    2024年03月19日
    浏览(50)
  • 系统集成项目管理工程师 软考中级 第三章重点汇总笔记(书本参照 第二版)

    第三章 信息系统的生命周期(p133) (1)立项阶段:即概念阶段或需求阶段,这一阶段根据用户业务发展和经营管理的需要,提出建设信息系统的初步构想;然后对企业信息系统的需求进行深入调研和分析,形成《需求规格说明书》并确定立项。 (2)开发阶段:以立项阶段所做的需

    2023年04月22日
    浏览(42)
  • 机器学习工程师在人工智能时代的角色

    在当今的数字时代,人工智能(AI)已成为许多行业不可或缺的一部分。从流程自动化到增强客户体验,人工智能具有改变企业的巨大潜力。这一变革性技术的核心是机器学习,该领域专注于开发算法,使计算机系统能够在无需明确编程的情况下学习并做出预测或决策。 机器

    2024年01月24日
    浏览(39)
  • 《NFT区块链进阶指南二》Etherscan验证Solidity智能合约(Remix插件验证)

    前置参考文档:https://blog.csdn.net/sinat_34104446/article/details/130557703 合约验证是上传合约源代码到etherscan过程,在智能合约项目中,通常都是提供源码验证,增加项目信任度 验证合约后可以直接在etherscan上执行获取和设置方法,方便日常的管理员维护 以下使用remix进行验证并使用

    2024年02月05日
    浏览(55)
  • AIGC文本生成智能应用(ChatGPT)提示工程师技巧

    我是荔园微风,作为一名在IT界整整25年的老兵,今天来看一下AIGC文本生成智能提示工程师技巧。 当你在使用类似于ChatGPT这样的AIGC文本生成智能应用时,有没有想过,你所问的问题中的每一个词语对AIGC文本生成智能应用给你的回答的好与不好都有着很重要的联系。 我们在使

    2024年02月13日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包