Advanced Solidity初学者教程

这篇具有很好参考价值的文章主要介绍了Advanced Solidity初学者教程。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

Advanced Solidity

引言:

1. 数学和算术

2. 时间和时间单位

3. 结构体

4. 修饰器

5. 枚举

6. 继承

7. 抽象合约

8. 接口

9. 库

10. 存储位置


Advanced Solidity

Advanced Solidity(高级Solidity)是一种区块链编程语言Solidity的深入应用,通常用于构建智能合约和去中心化应用(DApps)。它涉及复杂的编程概念和技巧,旨在提高合约的安全性、效率和功能性。Advanced Solidity可以包括诸如优化gas消耗、实现高级的数据结构、使用库和接口、处理支付和资金流、实现权限控制和安全模式等方面的内容。

引言:

hello,欢迎来到我的 Solidity 高级特性系列!Solidity 是一种智能合约编程语言,专门用于在以太坊及其他以太坊虚拟机(EVM)兼容的区块链平台上编写智能合约。虽然初学者可以使用 Solidity 来编写简单的合约,但深入了解其高级特性可以使您的合约更加健壮、灵活且易于维护。在本系列中,我将通过我的学习与你深入探讨 Solidity 的各种高级特性,包括数学和算术、时间和时间单位、结构体、修饰器、枚举、继承、抽象合约、接口、库以及存储位置等。无论你是新手还是有经验的开发者,我相信这些内容都将为你提供一些帮助,帮助您编写更强大、更安全的智能合约。

1. 数学和算术

智能合约中经常涉及数学和算术运算。Solidity 语言提供了基本的算术运算符,如加(+)、减(-)、乘(*)、除(/)和余数(%)。此外,还有一系列的数学函数,如 `addMod` 和 `mulMod`,用于在模运算中进行加法和乘法运算,这在处理加密货币时非常有用。

如果你理解了,那让我们一起来看看下面这个合约吧:下面这个合约提供了四个基本的数学运算函数:加法、减法、乘法和除法。这些函数都是纯函数(`pure`),意味着它们不修改合约的状态,也不触发交易。除法函数中包含了一个`require`语句,用于防止除以零的操作。如果感兴趣不妨试着编译部署一下。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract MathOperations {

    function add(uint256 a, uint256 b) public pure returns (uint256) {

        return a + b;

    }

    function subtract(uint256 a, uint256 b) public pure returns (uint256) {

        return a - b;

    }

    function multiply(uint256 a, uint256 b) public pure returns (uint256) {

        return a * b;

    }

    function divide(uint256 a, uint256 b) public pure returns (uint256) {

        require(b != 0, "Division by zero");

        return a / b;

    }

}

2. 时间和时间单位

在智能合约中,时间是一个重要的概念。Solidity 提供了多种时间相关的函数,如 `block.timestamp`,它返回当前区块的时间戳。此外,还有 `now` 函数,它返回当前时间(秒数)。

还是老样子,让我们一起试着编译部署这个合约:

`TimeContract`合约使用`block.timestamp`来获取当前区块的时间戳,并设置了一个24小时后的截止时间。`hasTimedOut`函数用于检查当前时间是否已经超过了截止时间。

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract TimeContract {

    uint256 public deadline;

    constructor() {

        deadline = block.timestamp + 24 hours; // 设置一个24小时后的截止时间

    }

    function hasTimedOut() public view returns (bool) {

        return block.timestamp >= deadline;

    }

}

3. 结构体

结构体在 Solidity 中用于定义自定义的数据类型。它们允许你将相关的数据组合在一起,使得合约的代码更加清晰和有组织。

这次我把解释写在下面了,你可以先试着理解一下。

pragma solidity ^0.8.0;

contract UserContract {

    struct UserInfo {

        string name;

        uint256 age;

        address wallet;

    }

    UserInfo public user;

    function setUserInfo(string memory _name, uint256 _age, address _wallet) public {

        user = UserInfo(_name, _age, _wallet);

    }

}

UserContract`合约定义了一个`UserInfo`结构体,用于存储用户的名称、年龄和钱包地址。`setUserInfo`函数允许外部设置这些信息。

4. 修饰器

修饰器是一种特殊的函数,它可以在其他函数之前或之后执行。修饰器可以用于多种目的,如验证函数调用者的身份、记录事件或检查合约的状态。

pragma solidity ^0.8.0;

contract ModifierContract {

    address public owner;

    constructor() {

        owner = msg.sender;

    }

    modifier onlyOwner {

        require(msg.sender == owner, "Only the owner can call this function");

        _;

    }

    function changeOwner(address newOwner) public onlyOwner {

        owner = newOwner;

    }

}



`ModifierContract`合约展示了如何使用修饰器`onlyOwner`来限制只有合约所有者才能调用某些函数。


到这里为止,剩下的合约我不会在进行解释,是的,我要偷懒了,不好意思,如果你问我为什么?

Advanced Solidity初学者教程,区块链

5. 枚举

枚举是一种数据类型,它允许你定义一组命名的整数常量。在智能合约中,枚举通常用于表示状态、选项或类型。

pragma solidity ^0.8.0;

contract StatefulContract {

    enum ContractState { Active, Inactive, Terminated }

    constructor() {

        state = ContractState.Active;

    }

    function setState(ContractState _state) public {

        state = _state;

    }

    ContractState public state;

}

6. 继承

继承是 Solidity 中的一种机制,允许一个合约从另一个合约继承状态变量和函数。这使得代码重用和模块化变得更加容易。

pragma solidity ^0.8.0;

contract BaseContract {

    function baseFunction() public {

        // 基础功能

    }

}

contract DerivedContract is BaseContract {

    function derivedFunction() public {

        // 派生功能

        baseFunction(); // 调用基类函数

    }

}

7. 抽象合约

抽象合约不能被直接实例化,它们通常用于定义接口或规范。抽象合约可以包含纯虚函数(没有实现的函数),这些函数必须在派生合约中实现。

pragma solidity ^0.8.0;

abstract contract AbstractContract {

    function abstractFunction() public virtual;

}

contract ConcreteContract is AbstractContract {

    function abstractFunction() public override {

        // 具体实现

    }

}

8. 接口

接口定义了一组函数,但不包含它们的实现。它们用于指定其他合约应遵循的协议。

pragma solidity ^0.8.0;

interface IERC20 {

    function totalSupply() external view returns (uint256);

    function balanceOf(address account) external view returns (uint256);

    function transfer(address recipient, uint256 amount) external;

    // 其他 ERC20 标准函数

}

contract MyToken is ERC20 {

    // 实现 ERC20 接口的函数

}

9. 库

库是一组可重用的函数,它们可以被其他合约导入和使用。与合约不同,库不能接收交易或拥有状态变量。关键字——library,在solidity中,库也是一种合约,没有存储,不存储以太币没payable,也没有fallbace函数,库可以部署,但不能够直接访问其中的函数

library SafeMath {

    function add(uint256 a, uint256 b) internal pure returns (uint256) {

        return a + b;

    }

    function sub(uint256 a, uint256 b) internal pure returns (uint256) {

        require(b <= a, "SafeMath: subtraction overflow");

        return a - b;

    }

}

contract MyContract {

    using SafeMath for uint256;

    function calculateSomething(uint256 a, uint256 b) public view returns (uint256) {

        return a.mul(b).add(1); // 使用 SafeMath 库进行安全的乘法和加法

    }

}

10. 存储位置

在 Solidity 中,了解数据的存储位置对于优化智能合约的 gas 成本至关重要。状态变量可以存储在存储(storage)、内存(memory)或调用数据(calldata)中。内存和调用数据是临时的,而存储则与合约的生命周期相同。

pragma solidity ^0.8.0;

contract StorageExample {

    uint256 public storedValue; // 存储在 storage

    constructor(uint256 initialValue) {

        storedValue = initialValue;

    }

    function returnMemoryValue() public pure returns (uint256) {

        return 42; // 返回存储在 memory 中的值

    }

    function returnCalldataValue() public view returns (uint256) {

        uint256 calldataValue = 42; // 存储在 calldata 中

        return calldataValue;

    }

}

是的,又被我水了一个博客!下期再见,byebye。文章来源地址https://www.toymoban.com/news/detail-860539.html

到了这里,关于Advanced Solidity初学者教程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • K8s 初学者入门教程

    Kubernetes 简称为 K8s 最近想要通过 K8s 部署一些前端应用。但苦于之前没有接触过集群相关的概念,操作时,对 Deployment、Pod、Service 和 Ingress 等概念不是很理解,导致对部署的流程不太清晰(例如,在创建 Deployment 时,不清楚要填哪些选项,那些选项有什么作用和区别, Pod,

    2024年02月07日
    浏览(172)
  • Linux configure命令精通:一个完整的初学者教程

    Linux中的configure命令用于配置和准备软件包以进行编译和安装。它是一个常见的脚本,由软件开发者提供,用于检查系统的环境和依赖关系,并相应地生成Makefile,从而可以在特定的Linux系统上编译和安装软件包。 开源软件中一般都有一个名为\\\"configure\\\"的脚本文件,需要运行这

    2024年02月03日
    浏览(56)
  • Python GUI初学者教程,轻松构建用户界面

    Python GUI入门教程:轻松构建用户界面。 微信搜索关注《Python学研大本营》,加入读者群,分享更多精彩 Python以其简单性和多功能性成为最受欢迎的编程语言之一。从网络开发到数据科学,Python被广泛应用于各个领域。 本文将探索Python内置的用于创建图形用户界面(GUI)的库

    2024年01月15日
    浏览(63)
  • TCGA下载和表达矩阵整理:最适合初学者的教程

    本文首发于公众号: 医学和生信笔记 “ 医学和生信笔记 ,专注R语言在临床医学中的使用,R语言数据分析和可视化。主要分享R语言做医学统计学、meta分析、网络药理学、临床预测模型、机器学习、生物信息学等。 这篇推文适合初学者看,大佬酌情阅读! 从打开网址开始教

    2023年04月08日
    浏览(105)
  • 2023 年 7 个适合初学者的 Vue.js 教程

    这个精心挑选的列表将帮助 Vue 初学者找到七个很棒的资源来开始学习 Vue。 我相信你来这里是为了寻找一些资源来开始学习 Vue.js 框架的奇妙旅程,无论是作为第一个工具还是你熟悉的其他框架的附加工具。不管怎样,你很幸运,因为这就是我们将在这篇文章中介绍的内容。

    2024年02月12日
    浏览(60)
  • 【MySQL】MySQL事务保姆级教程(适合MySQL初学者学习)

    🧑‍💻作者名称:DaenCode 🎤作者简介:啥技术都喜欢捣鼓捣鼓,喜欢分享技术、经验、生活。 😎人生感悟:尝尽人生百味,方知世间冷暖。 📖所属专栏:重温MySQL 无论是在校招、社招,亦或者大学计算机专业、软件工程等相关面试或者考试中,MySQL事务的相关知识都是必

    2024年02月16日
    浏览(82)
  • SEO 分步教程:初学者掌握的 8 个简单基础知识

    如果您刚刚开始使用搜索引擎优化 (SEO),那么分步 SEO 教程是有序的。在这一点上,你可能已经听说过一些基本术语,如研究和页面优化。但是,您如何应用迄今为止收集的所有知识呢? 如果您刚刚开始使用搜索引擎优化 (SEO),那么分步 SEO 教程是有序的。在这一

    2024年01月17日
    浏览(64)
  • 雷达初学者必读 | 毫米波雷达信号处理入门教程

    本文编辑:调皮哥的小助理 本文来源:X. Li, X. Wang, Q. Yang and S. Fu, “Signal Processing for TDM MIMO FMCW Millimeter-Wave Radar Sensors,” inIEEE Access, vol. 9, pp. 167959-167971, 2021, doi: 10.1109/ACCESS.2021.3137387.(有删改) 本教程系统地介绍了用于TDM-MIMO FMCW 毫米波 (mmWave) 汽车雷达的基于离散傅里叶变

    2023年04月26日
    浏览(103)
  • Ubuntu20.04安装CUDA&&cudnn(初学者详细图文教程)

    注:本机系统为 Ubuntu20.04 1. 安装显卡驱动 打开‘软件和更新,点击附加驱动安装显卡驱动。 2. gcc安装 若系统为Ubuntu22.04,则需要安装。 在终端输入一下指令,查看有没有gcc。 3. gcc安装 本机ubuntu20.04 gcc自带版本为9.4.0 安装gcc-7,command: 安装完gcc-7,系统中就存在两个版本的

    2023年04月12日
    浏览(52)
  • 免费的modelsim安装教程(Intel modelsim altera 的初学者)

    intel官方软件的地址(https://www.intel.com/content/www/us/en/software/programmable/quartus-prime/model-sim.html)需要注册。 进入下载页面,没有单独的modelsim的下载项,需要先进入quartus pro的下载页面中: 进入之后,选择individual Files,将关于modelsim有关的三个文件均下载下来,放在同一个文件

    2024年02月07日
    浏览(41)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包