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

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.xdnf.cn/news/19237.html

相关文章:

  • 【完整源码+数据集+部署教程】高速公路施工区域物体检测系统源码和数据集:改进yolo11-RepNCSPELAN
  • FOC-双电阻采样-无刷-AC/DC(吹风筒项目)
  • 笔记本电脑频繁出现 vcomp140.dll丢失怎么办?结合移动设备特性,提供适配性强的修复方案
  • 函数的逆与原象
  • flutter-使用url_launcher打开链接/应用/短信/邮件和评分跳转等
  • LoraConfig target modules加入embed_tokens(64)
  • Java项目打包成EXE全攻略
  • Spring Boot 项目文件上传安全与优化:OSS、MinIO、Nginx 分片上传实战
  • 用 C++ 创建单向链表 forward list
  • “我店 + RWA”来袭:重构商业价值,解锁消费投资新密码
  • HarmonyOS权限管理应用
  • 【序列晋升】20 Spring Cloud Function 函数即服务(FaaS)
  • FPGA实现1553B BC控制器IP方案
  • LeetCode259~282题解
  • 吴恩达机器学习作业五:神经网络正向传播
  • 【前端教程】从性别统计类推年龄功能——表单交互与数据处理进阶
  • 【前端教程】从零开始学JavaScript交互:7个经典事件处理案例解析
  • C++Primer笔记——第六章:函数(下)
  • KNN算法(K近邻算法)
  • 互联网大厂AI大模型面试解析:从基础技术到场景应用
  • STL容器的连续性及其访问:vector和deque
  • 零基础上手:Cursor + MCP 爬取 YouTube 视频数据
  • 微信小程序中蓝牙打印机中文编码处理:使用iconv-lite库
  • Pytest 插件:pytest_runtest_protocol
  • 在Excel和WPS表格中隔一行插入多个空白行
  • nvm使用和node使用
  • 神经语言学视角:脑科学与NLP深层分析技术的交叉融合
  • YARN架构解析:深入理解Hadoop资源管理核心
  • Pycharm 登录 Github 失败
  • 从电网监控到油气分析:QtitanDataGrid 在能源领域的应用探索