当前位置: 首页 > news >正文

solidity地址、智能合约、交易概念

目录

    • 地址
      • 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.dtcms.com/a/357527.html

相关文章:

  • Pointer--Learing MOOC-C语言第九周指针
  • 鸿蒙地址选择库(ArkTs UI)
  • Idea2025.2 MybatisX插件失效问题
  • Suno-API - OpenI
  • 【计算机网络】前端基础知识Cookie、localStorage、sessionStorage 以及 Token
  • 04.《VLAN基础与配置实践指南》
  • 掌握 Linux 文件权限:chown 命令深度解析与实践
  • css绘制三角形
  • 软件开发准则
  • 隧道搭建技术
  • 零成本解锁 Cursor Pro:虚拟卡白嫖1个月+14天试用全攻略
  • 鬼泣:索定系统
  • 基于能量方法的纳维-斯托克斯方程高阶范数有界性理论推导-陈墨仙
  • Java接口和抽象类的区别,并举例说明
  • Coze智能体小练习-根据主题生成小红书宣传图片
  • (十一)ps识别: epoch 训练日志解析
  • 国务院提出“人工智能+”行动,容智智能体引领产业变革发展
  • Java 学习笔记(基础篇11)
  • SyncBack 安全备份: 加密文件名及文件内容, 防止黑客及未授权的访问
  • 三维动画渲染农场哪家便宜?
  • Redis开发06:使用stackexchange.redis库结合WebAPI对redis进行增删改查
  • vue在函数内部调用onMounted
  • 论文阅读:arixv 2025 WideSearch: Benchmarking Agentic Broad Info-Seeking
  • Linux之Shell编程(二)
  • 零售行业全渠道应如何与零售后端系统集成?
  • JavaScript 知识篇(1):解构赋值
  • 【前端教程】二维数组排序实战:按需封装才是最优解——拒绝冗余,精简代码
  • 基于SpringBoot和百度人脸识别API开发的保安门禁系统
  • MinIO社区版“背刺“之后:RustFS用Apache 2.0协议重构开源信任
  • 导入自定义模块的过程中出现ModuleNotFoundError错误