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

相关文章

pandas中位数填充空值的实现示例

《pandas中位数填充空值的实现示例》中位数填充是一种简单而有效的方法,用于填充数据集中缺失的值,本文就来介绍一下pandas中位数填充空值的实现,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是中位数填充?为什么选择中位数填充?示例数据结果分析完整代码总结在数据分析和机器学习过程中,处理缺失数

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python使用getopt处理命令行参数示例解析(最佳实践)

《Python使用getopt处理命令行参数示例解析(最佳实践)》getopt模块是Python标准库中一个简单但强大的命令行参数处理工具,它特别适合那些需要快速实现基本命令行参数解析的场景,或者需要... 目录为什么需要处理命令行参数?getopt模块基础实际应用示例与其他参数处理方式的比较常见问http

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl