solidity一些内置的常用函数和关键字(含智能合约简单代码示例)

本文主要是介绍solidity一些内置的常用函数和关键字(含智能合约简单代码示例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

solidity一些内置的常用函数和关键字:

1. msg.sender

  • 描述: msg.sender 是全局变量,代表当前调用者的地址,即谁发起了当前的合约调用。

  • **功能:**用于识别调用者的身份,通常用于权限控制。

  • 示例:

    contract MyContract {address public owner;constructor() {owner = msg.sender; // 将合约部署者设置为合约拥有者}function isOwner() public view returns (bool) {return msg.sender == owner;}
    }
    
  • 详细说明: msg.sender 在合约调用链中非常重要,用于识别调用者的身份,通常用于权限控制。

2. msg.value

  • 描述: msg.value 是全局变量,表示在合约调用中发送的以太币数量(单位为wei)。

  • 示例:

    contract MyContract {function deposit() public payable { // 支付函数require(msg.value > 0, "Must send some ether");}
    }
    
  • 详细说明: 当调用函数时,可以通过 msg.value 获取发送的以太币数量,常用于支付功能或资金转账。

3. block.timestamp

  • 描述: block.timestamp 是当前区块的时间戳,以UNIX时间表示(即自1970年1月1日以来的秒数)。

  • 示例:

    contract MyContract {uint public creationTime;  // 区块创建时间constructor() {creationTime = block.timestamp;  // 用时间戳赋值}function timeSinceCreation() public view returns (uint) {  // 计算当前区块的时间戳与区块创建时间的间隔return block.timestamp - creationTime;}
    }
    
  • 详细说明: block.timestamp 常用于合约中的时间相关操作,例如检查某个操作是否超时。

4. address.balance

  • 描述: address.balance 是一个地址类型的变量,用于获取指定地址的以太币余额(单位为wei)。

  • 示例:

    contract MyContract {// 参数为地址类型变量‘_addr’,函数返回该地址账户的以太坊余额function checkBalance(address _addr) public view returns (uint) {return _addr.balance;  }
    }
    
  • 详细说明: 通过 address.balance 可以轻松检查任何地址的以太币余额,常用于付款前的余额检查。

5. require()

  • 描述: require 用于在合约中执行条件检查,如果条件不满足,将抛出异常并回滚交易

  • 示例:

    contract MyContract {uint public data;function setData(uint _data) public {require(_data > 0, "Data must be greater than zero");// "Data must be greater than zero"为异常信息data = _data;}
    }
    
  • 详细说明: require 函数在保证合约安全性和正确性方面起着重要作用,通常用于检查输入条件或权限。

6. assert()

  • 描述: assertrequire 类似,用于条件检查,但通常用于内部错误检测。如果 assert 失败,会消耗掉所有剩余的gas

  • 示例:

    contract MyContract {uint public data;function setData(uint _data) public {data = _data;assert(data == _data); // 检查数据是否正确设置}
    }
    
  • 详细说明: assert 通常用于检测不可预见的错误或不变量,失败时会导致合约中的bug暴露

7. revert()

  • 描述: revert 用于手动触发异常并回滚交易,常用于当满足特定条件时取消操作

  • 示例:

    contract MyContract {uint public data;function setData(uint _data) public {if (_data == 0) {revert("Data cannot be zero"); // 回滚交易,并附加自定义错误消息}data = _data;}
    }
    
  • 详细说明: revert 提供了一种灵活的方法来处理异常,允许附加自定义错误消息。

8. withdraw()

  • 描述:withdraw() 函数通常用于从合约中提取以太币。
  • 使用场景: 常用于合约的资金管理,比如当用户存款到合约后,可以通过 withdraw() 函数提取这些资金。
关键点
  1. 权限控制: 通常,withdraw() 函数会限制只有合约的拥有者或某些授权用户才能调用,以避免未经授权的提取

  2. 错误处理: 确保函数在提取过程中进行适当的错误处理,防止出现问题,如余额不足或调用者无权提取资金。

    示例代码

contract MyContract {address public owner;// 合约的构造函数constructor() {owner = msg.sender; // 设置合约部署者为拥有者}// 修饰符,确保只有拥有者可以调用modifier onlyOwner() {require(msg.sender == owner, "Not the contract owner");_;}// 函数允许合约接收以太币receive() external payable {}// 提取合约中的所有以太币function withdraw() public onlyOwner { // onlyOwner ==> 只有合约拥有者才能调用 withdraw() 函数uint balance = address(this).balance; // 获取合约余额require(balance > 0, "No funds available");// 将合约余额发送到拥有者地址payable(owner).transfer(balance);}
}
详细说明
  1. receive() 函数

    • 这是一个接收以太币的特殊函数,允许合约接收传入的以太币。
  2. withdraw() 函数

    • 权限控制: 使用 onlyOwner 修饰符,确保只有合约拥有者才能调用 withdraw() 函数。
    • 余额检查: 使用 require(balance > 0, "No funds available") 确保合约中有足够的余额进行提取。
    • 资金转移: 使用 payable(owner).transfer(balance) 将合约余额发送到拥有者地址。
注意事项
  • 重入攻击: transfer 方法会限制 gas 的使用,通常足以防止重入攻击,但对于更复杂的场景,可以考虑使用 call 函数并实施防护措施。
  • 余额不足: 确保在转账之前检查余额是否充足。
  • 权限管理: 明确设置权限,防止非授权用户调用提取函数。

9. address.transfer()

  • 描述: transfer 是地址类型的函数,用于将一定数量的以太币转移到指定地址,若转账失败则会抛出异常。

  • 示例:

    contract MyContract {address payable public owner;// 构造函数constructor() {owner = payable(msg.sender); // 设置合约的拥有者}// 提取函数,提取账户的以太币function withdraw(uint _amount) public {require(msg.sender == owner, "Not the contract owner");owner.transfer(_amount);}// 接收以太币的函数receive() external payable {}
    }
    
    **payable **关键字

    用于地址

    当一个地址被声明为 payable 时,它表示这个地址可以接收以太币。通常,在需要向某个地址发送以太币时,必须将该地址声明为 payable,否则编译器会报错。

    用于函数

    当一个函数被声明为 payable 时,它表示这个函数在被调用时,可以接收以太币。这通常用于合约中的支付功能,例如存款函数或众筹合约中的投资函数。

  • 详细说明: transfer 是一个安全的以太币转账方法,能够防止由于接收者合约中的代码问题导致的转账失败或攻击。

10. address.call()

  • 描述: call 是一种低级别的函数调用方式,允许调用者发送以太币并调用目标地址的函数。它不会自动抛出异常,因此需要手动检查调用结果。

  • 基本形式:

    (bool success, bytes memory data) = _to.call{value: msg.value}(callData);
    
    • {value: msg.value}: 传递以太币的方式,msg.value 是调用该函数时发送的以太币数量
    • callData: 是调用目标合约时传递的函数签名和参数数据。通常是用来指定调用哪个函数以及传递给该函数的参数。在不需要调用特定函数时,可以传递一个空字符串 "",这意味着没有特定的函数调用。
    • bytes memory data:是合约调用之后的返回值。
  • 示例:

    contract MyContract {function sendEther(address payable _to) public payable {  // 转账给地址"_to"(bool success, ) = _to.call{value: msg.value}("");  // 不关心调用返回值,不调用合约函数require(success, "Transfer failed.");	// 手动异常检查}
    }
    
  • 详细说明: call 函数比 transfer 更灵活,可以传递以太币并同时调用目标合约的函数,但由于不会自动抛出异常,因此需要额外的错误处理逻辑。

11. constructor()

  • 描述: 构造函数(constructor)是智能合约的初始化函数,在合约部署时执行一次。用于设置初始状态或赋值给状态变量。

  • 示例:

    contract MyContract {address public owner;// 构造函数constructor() {owner = msg.sender; // 设置合约的拥有者}
    }
    
  • 详细说明: 在部署合约时,这个函数会自动执行,用于初始化一些基本参数,比如合约的所有者(通常是部署者的地址)。

12. fallback()

  • 描述: fallback()函数是一个可选的匿名函数,当合约接收到以太币但没有匹配到任何其他函数时,或者直接调用一个不存在的函数时,它会被触发。

  • 示例:

    contract MyContract {// 接收以太币的回退函数fallback() external payable {// 执行一些操作}
    }
    
  • 详细说明: 它通常用于记录发送失败的交易或触发某些默认行为。该函数必须标记为 payable,以允许它接收以太币。

13. receive()

  • 描述: 这是一个特殊函数,当合约接收到纯以太币转账且没有附带数据时调用。

  • 示例:

    contract MyContract {// 接收纯以太币的函数receive() external payable {// 处理收到的以太币}
    }
    
  • 详细说明: receive 函数与 fallback 类似,但专门用于处理没有数据的以太币转账。如果未定义此函数,且合约没有定义 fallback 函数,则会拒绝所有纯以太币转账。

14. modifier()

  • 描述: 修饰符(Modifier)用于更改函数的行为,通常用于访问控制或输入校验。它可以在函数执行前后添加逻辑。

  • 示例:

    contract MyContract {address public owner;constructor() {owner = msg.sender;}// 修饰符,限制只有合约拥有者可以调用modifier onlyOwner() {require(msg.sender == owner, "Not the contract owner");_;}// 使用修饰符的函数function changeOwner(address newOwner) public onlyOwner {owner = newOwner;}
    }
    
  • 详细说明: 修饰符是一种代码复用的方式。通过在函数定义中添加修饰符,开发者可以在函数执行之前或之后插入额外的逻辑,如权限检查。

这篇关于solidity一些内置的常用函数和关键字(含智能合约简单代码示例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1110600

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

Java中StopWatch的使用示例详解

《Java中StopWatch的使用示例详解》stopWatch是org.springframework.util包下的一个工具类,使用它可直观的输出代码执行耗时,以及执行时间百分比,这篇文章主要介绍... 目录stopWatch 是org.springframework.util 包下的一个工具类,使用它

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

springboot security快速使用示例详解

《springbootsecurity快速使用示例详解》:本文主要介绍springbootsecurity快速使用示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝... 目录创www.chinasem.cn建spring boot项目生成脚手架配置依赖接口示例代码项目结构启用s