目录

    • 地址
      • address 的两种子类型(Solidity 0.5.0+)
      • address分类
      • address 的常用操作和属性
      • 总结
    • 交易
      • 交易的基本结构(由外部发起)
        • Gas
      • 交易生命周期
      • 函数调用与交易
      • 常见交易场景
      • 总结

地址

在 Solidity 中,地址(address) 是一个非常核心且基础的概念。它是智能合约与外部账户(Externally owned account, EOA)之间交互的“身份标识”,类似于银行账户的账号或电子邮件地址。

程序而言

  • address 是 Solidity 中的一个 值类型(value type)
  • 占 20 个字节(160 位),通常以 42 位十六进制表示(0x 开头)
  • 用于表示:
    • 外部账户(Externally Owned Account, EOA)——由私钥控制的钱包地址
    • 合约账户(Contract Account)——部署在链上的智能合约地址

例如

0x5B38Da6a701c568545dCfcB03FcB875f56beddC4

address 的两种子类型(Solidity 0.5.0+)

类型说明
address通用地址类型,可表示 EOA 或合约
address payable可以接收以太币(ETH)的地址,支持 .transfer() 和 .send()

所有 address payable 都是 address,但反之不成立

如下 将address 能转成 address payable:

address payable user = payable(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4);// address → address payable
address addr = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;
address payable payableAddr = payable(addr);

address分类

类型特点能否拥有代码能否发起交易
外部账户(EOA)由私钥控制的钱包(如 MetaMask)❌ 无代码✅ 可发起交易
合约账户部署在链上的智能合约✅ 有代码❌ 不能主动发起交易(只能被调用)

参考理解: https://professional-solidity.readthedocs.io/zh-cn/latest/source/01.hello.html#id5

address 的常用操作和属性

  1. 查询余额
uint balance = address(addr).balance;
  1. 转账(三种方式)
方法是否推荐说明
.transfer(amount)✅ 推荐最安全,只传递 2300 gas,防止重入攻击
.send(amount) ⚠️ 不推荐返回 bool,失败不自动 revert
.call{value: amount}(“”)⚠️ 小心使用传递所有 gas,可能引发重入攻击
// ✅ 推荐:transfer
payable(user).transfer(1 ether);// ❌ 不推荐:send 需要手动处理失败
bool success = payable(user).send(1 ether);
require(success, "Send failed");// 🔥 高级用法:call(可用于调用函数)
(bool success, ) = payable(user).call{value: 1 ether}("");
require(success, "Call failed");
  1. 判断是合约还是 EOA
function isContract(address account) public view returns (bool) {uint32 size;assembly {size := extcodesize(account)}return size > 0;
}

extcodesize > 0 → 是合约
extcodesize == 0 → 是外部账户(钱包)

  1. 地址字面量
address constant OWNER = 0x5B38Da6a701c568545dCfcB03FcB875f56beddC4;

注意:地址字面量是 address 类型,不是 address payable

总结

概念说明
address20 字节的账户标识
address payable可接收 ETH 的地址
.balance查询余额
.transfer()安全转账
msg.sender当前调用者地址
tx.origin原始交易发起者(不推荐使用)

口诀

  • “address 是身份,payable 才能收钱”
  • “.transfer 最安全,.call 要小心”
  • “合约不能主动发交易,只能被调用”

交易

有了地址的概念后,交易的理解则很简单。

交易可以看作一个地址发送到另外一个地址的消息,可能包含一个二进制数据(可以先理解为合约程序,这也是不可篡改的)和以太币。

交易(Transaction) 是由外部账户(EOA,如钱包)发起的一个签名数据包,用于触发区块链上的状态变更,比如:

  • 转账 ETH
  • 部署合约
  • 调用智能合约函数

一旦交易被打包进区块,就不可撤销。

交易的基本结构(由外部发起)

字段说明
from发起者地址(msg.sender)
to接收者地址(如果是合约部署,为空)
value转账金额(单位:wei)
data调用数据(函数选择器 + 参数)
gasLimit最大愿意支付的 gas 数量
gasPrice每单位 gas 的价格(Gwei)
nonce发起账户的交易序号
chainId防重放攻击(如 1=主网,5=Goerli)
Gas

Gas费 是 以太坊 等 区块链网络 中执行交易或智能合约所需的计算资源费用,用于维持网络运行和激励节点参与者。 ‌

Gas费由两部分组成:

  1. GasUsage‌:衡量交易复杂度,代码复杂度越高,消耗的Gas越多。
  2. GasPrice‌:单个Gas的价格,由市场供需动态调节。 ‌

影响因素

  • 网络拥堵‌:当交易量激增时,Gas费会显著上升以加速处理。
  • 矿工策略‌:矿工根据Gas费高低选择优先处理交易。 ‌

交易生命周期

  1. 用户在钱包(如 MetaMask)中发起操作
  2. 钱包生成并签名交易
  3. 交易广播到 P2P 网络
  4. 矿工/验证者打包进区块
  5. 区块上链,交易确认
  6. 智能合约执行,状态变更
  7. 触发事件(Event),前端监听更新

函数调用与交易

类型是否产生交易是否收费示例
交易(Transaction)✅ 是✅ 收 gas修改状态、转账
调用(Call/View)❌ 否❌ 免费view 函数查询余额

常见交易场景

场景Solidity 实现
用户转账ETH payable(to).transfer(amount)
调用合约函数contract.func()
部署新合约new MyContract()
提交投票vote(candidate) + emit Event
NFT铸造 mint(to, tokenId)

总结

概念说明
交易(Transaction)由 EOA 发起,改变链上状态
msg.sender直接调用者(推荐用于权限)
tx.origin原始发起者(不安全,避免使用)
msg.value随交易发送的 ETH
payable能接收 ETH 的函数或地址
Call vs Transaction读操作免费,写操作收费
  1. “交易是区块链的脉搏,每一次调用都是一次心跳”
  2. “msg.sender 是身份,msg.value 是金钱,emit 是通知”

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jwt原理及Java中实现

一、JWT 是什么?解决什么问题? 我们先来一张图看一下这个过程:JWT(JSON Web Token)是一种把“认证信息(Claims) 完整性校验”打包成 自包含 的字符串的规范。 它主要用于无状态认证:…

大数据在UI前端的应用深化研究:用户行为数据的跨平台关联分析

大数据在UI前端的应用深化研究:用户行为数据的跨平台关联分析每天,你在手机 App 里点了一个按钮、在网页上滑了两屏、又在小程序里停留了 3 秒,这些看似零散的动作,其实都在被悄悄记录。过去,这些数据只能各自躺在自己…

C++11基础——— 右值引用和移动语义

1. C11的发展历史 C11是C的第⼆个主要版本,并且是从C98起的最重要更新。它引入了大量更改,标准化了既有实践,并改进了对C程序员可用的抽象。在它最终由ISO在2011年8月12日采纳前,人们曾使用名称“C0x”,因为它曾被期待…

【一】Django框架版本介绍

【一】Django框架版本介绍 【一】Django框架版本 ● Django 是一个高级的Python Web框架,由荷兰人Armin Ronacher创建。 ● 随着版本的迭代和功能的不断优化,Django在处理异步请求方面也有了显著的进步。 【1】Django1.x ● 默认不支持异步 ● Django 1.…

git 大文件上传不了的 问题

你 还是在 cmd 里执行,Select-String 是 PowerShell 的命令,cmd 不认识。 请务必按下面的步骤 切换到 PowerShell 再运行。✅ 1. 打开 PowerShell(不要再用 cmd)最简单: 在资源管理器里进入 D:\linShiWenjian\my-react…

【FIX】go运行报错“missing go.sum entry for module providing package”解决方案

🔧 ​核心解决方案​**运行 go mod tidy**​ ​作用​:自动同步 go.mod和 go.sum文件,添加缺失依赖并移除无用条目。 go mod tidy​适用场景​:90% 的校验和缺失问题可通过此命令解决。 ​注意​:若项目含私有仓库&…

【实操教学】ArcGIS 如何进行定义坐标系

一、坐标系定义的方式创建数据时可直接完成坐标系定义;针对已创建的数据集(涵盖要素类、要素数据集及栅格数据集),则可通过以下这种方式定义:工具箱工具调用:使用 ArcGIS 工具箱中的 “定义投影&#xff08…

如何使用Windows自带的PnPUtil命令来禁用/停用和启用硬件设备

我来详细讲解一下如何使用 Windows 自带的 PnPUtil 命令来禁用(停用) 和启用硬件设备。 PnPUtil (即插即用实用工具) 是一个功能强大的命令行工具,主要用于安装、卸载、枚举和修改驱动程序包。对于硬件的启用和禁用,它通过操作设…

鸿蒙Next媒体展示组件实战:Video与动态布局全解析

今天我们来深入探讨HarmonyOS Next中几种核心媒体展示组件的使用方法,通过实际代码示例展示如何打造丰富的多媒体体验。HarmonyOS Next为开发者提供了一套强大而灵活的媒体展示组件,使开发者能够轻松实现视频播放、动态布局适应、全屏切换等常见多媒体功…

复现RoboDK机器人校准功能(以Staubli TX2‑90L / TX200机械臂为测试对象,实测精度接近原厂)

本算法复现了 RoboDK 的机器人校准功能:在训练集的理论校准后精度与 RoboDK 一致,在测试集的实测精度接近 Staubli 原厂。 参考:RoboDK 机器人校准功能(https://robodk.com.cn/cn/robot-calibration) 特性 支持 SDH 参…

Vue常用指令和生命周期

Vue 是基于 MVVM模型的前端 JavaScript 框架。Vue 核心是数据驱动视图&#xff0c;通过响应式数据实现视图自动更新。<template><div>{{ message }}</div><button click"changeMsg">修改内容</button> </template><script se…

深度学习周报(8.25~8.31)

目录 摘要 Abstract 1 RNN学习意义 2 RNN基础知识 2.1 核心思想 2.2 传播 2.3 优缺点 2.4 变体结构与应用场景 3 RNN结构代码示例 4 总结 摘要 本周主要学习了循环神经网络的学习意义与基础知识&#xff0c;重点了解了RNN循环连接的核心思想、前向传播与反向传播过程…

借助 LAMBDA 公式,实现单元格区域高效转换

新特性介绍 “转换单元格&#xff08;Transform&#xff09;” 功能允许用户将自定义的单参数 LAMBDA 公式应用于选中的单元格区域。用户可选择公式参数的作用域 —— 按单元格、按行、按列或按整个区域。 转换完成后&#xff0c;源单元格区域会被清空&#xff0c;转换后的区…

LeetCode 01背包 494. 目标和

494. 目标和给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 ‘’ 或 ‘-’ &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 ‘’ &#xff0c;在 1 之前…

Dify 1.8.0 全网首发,预告发布

距离Dify 1.7.2过去两周了 Dify 1.8.0 又跟大伙见面了&#xff01; 1.8.0&#xff0c;属于主版本号不变、但第二位数字更新的“阶段性大更”&#xff0c;意味着功能上的显著优化和体验上的重要升级。 根据官方的Github日志&#xff0c;这一版本将继续聚焦三大核心方向&#x…

基于LangChain框架搭建AI问答系统(附源码)

AI问答系统1. 背景知识2. 问答系统流程3. 知识问答系统相关组件3.1 文档加载器3.2 文档切割器3.3 嵌入模型包装器3.4 向量存储库3.5 模型包装器3.6 链组件4. 问答系统演示4.1 问答程序4.2 演示大模型回答效果5.问答系统代码1. 背景知识 在人工智能技术飞速发展的今天&#xff…

【Python】QT(PySide2、PyQt5):Qt Designer,VS Code使用designer,可能的报错

Qt designer&#xff1a;可直接在designer界面&#xff0c;使用拖拽的方式设计需要的界面&#xff0c;可设定部分属性。安装Pyside2后&#xff0c;designer默认在python安装目录的Lib/sit_packages/PySide2文件夹中。designer使用&#xff1a;① 双击打开designer.exe&#xff…

前端常见安全问题 + 防御方法 + 面试回答

目录 XSS&#xff08;跨站脚本攻击&#xff09;CSRF&#xff08;跨站请求伪造&#xff09;SQL 注入文件上传漏洞其他前端常见安全问题面试常见问答 1. XSS&#xff08;跨站脚本攻击&#xff09; 定义 XSS&#xff08;Cross-Site Scripting&#xff09;是一种 通过注入恶意脚…

jxWebUI--下拉选择框

下拉选择框提供了预先定义好的选项&#xff0c;用户只能在这些选项中选择输入。 combobox 定义格式 combobox 控件名 属性列表 ;属性 bind 类型&#xff1a;string 缺省值&#xff1a; 输入控件所绑定的变量名。当给输入控件bind了一个变量名后【bindbind_var_name】&#xff0…

大模型时代:用Redis构建百亿级向量数据库方

大模型时代&#xff1a;用Redis构建百亿级向量数据库方案第一章&#xff1a;大模型时代的向量数据库挑战1.1 大模型时代的特征与需求1.2 向量数据库的核心价值1.3 百亿级向量的技术挑战第二章&#xff1a;Redis作为向量数据库的优势2.1 Redis的核心优势2.2 Redis向量搜索模块&a…