你存进合约的 ETH,到底放在哪里?
想象这样一个场景你往银行卡里存了 3 万块钱。打开手机 App账面上清清楚楚写着活期余额 3 万元。但如果你去银行金库翻找绝对找不到一个贴着你名字、放着你那三万现金的小抽屉。你的钱早就和别人的钱混在了一起变成了银行资金池的一部分。你能取钱、能转账靠的从来不是“钞票上写了你的名字”而是银行系统里的那本账某某某存款 3 万元。以太坊上的智能合约底层逻辑其实一模一样。很多人刚学 Solidity 时常常被msg.sender、msg.value、address(this).balance和balances[msg.sender]搞得晕头转向。其实这不怪你语法没学好而是因为很多人在一开始没有分清最核心的一件事链上的钱和合约里的账从来都不是一回事。一、先搞清楚谁持有 ETH在以太坊的世界里所有的 ETH 都只属于一样东西——地址Address。这里主要有两种类型的地址EOA外部账户也就是你在 MetaMask 里用私钥控制的钱包地址。它能主动发起交易也能持有 ETH但它肚子里没有半行代码。合约账户部署了智能合约代码的地址。它也有自己的余额、能存数据、能被调用但它没有私钥不会自己主动发起交易。它就像一台老式自动售货机有钱、有程序但只有当你投币、按键时它才会按照写好的逻辑吐出东西。所以第一层认知很简单ETH 永远属于某个地址。用户钱包里的 ETH 属于用户地址合约里的 ETH 属于合约地址。合约代码本身只是说明书。只有当它被部署到链上、生成了一个具体的合约地址后那个地址才真正具备了装钱的能力。合约代码不能凭空变出钱它必须通过代码逻辑把 ETH 从一个地址转到另一个地址。二、真实的钱与虚拟的账假设有三方Alice用户0xAAA钱包里有 10 ETHBigBank合约0xBBB当前余额 0现在Alice 向 BigBank 转了 3 ETH。交易完成后链上发生了两件事Alice 的钱包余额变成了 7 ETH。BigBank 合约地址的余额变成了 3 ETH。钱确实进到合约地址了。但问题来了合约怎么知道这 3 ETH 到底是谁存的它默认是不知道的除非开发者在合约里写了一本账mapping(address uint256) public balances;当 Alice 存款时合约会顺手记上一笔balances[msg.sender] msg.value;于是链上同时存在了两种截然不同的数据address(this).balance 3 ETH合约实际金库里有多少钱balances[Alice] 3ETH合约账本上写着 Alice 存了多少这就是 Solidity 最容易踩坑的地方金库里的总资金和账本上的个人存款完全是两码事。三、谁在叫我看清msg.sendermsg.sender是新手最容易产生误解的变量。它其实只有一句话的定义msg.sender是当前这次函数调用的直接调用者不一定是最终用户。1. 用户直接调用如果是 Alice 直接调用合约bigBank.deposit{value: 1 ether}();此时在deposit()函数内部msg.sender就是 Alice 的地址。msg.value是 Alice 这次塞进来的 1 ETH。address(this).balance是 BigBank 当前总共的钱。msg.sender.balance是 Alice 钱包里剩余的钱。2. 合约调用合约最容易迷路的地方如果流程变成了Alice → 合约 A → 合约 B那么在合约 B 眼里msg.sender不是 Alice而是合约 A 的地址。这就好比你让秘书去银行代办业务。银行柜员眼里记录的经办人是秘书而不是坐在办公室里的你。虽然业务是你的意愿但“直接和银行交手”的人是秘书。所以编写涉及跨合约调用的代码时千万别盲目信任msg.sender就是最终的用户。四、变量的职责划分把 Solidity 常见的几个全局和状态变量按功能归纳一下其实很清晰变量 / 表达式回答的问题本质是什么msg.sender谁在直接敲门当前调用的直接发起者msg.value这次带了多少钱本次调用附带的 ETH 数量address(this).balance合约金库里总共有多少当前合约地址实际持有的 ETHbalances[addr]账本上记录他有多少额度合约状态变量里记录的映射数据msg.value不是用户的总资产只是这一次交易附带的小费或本金而balances只是合约数据库里的一行数字不能直接当成现金用。五、写一个极简的银行合约把上面的逻辑串起来就是一个标准的存取款合约骨架// SPDX-License-Identifier: MIT pragma solidity ^0.8.20; contract SimpleBank { address public admin; mapping(address uint256) public balances; constructor() { admin msg.sender; } // 存款既要收钱也要记账 function deposit() external payable { require(msg.value 0, Must send ETH); balances[msg.sender] msg.value; } // 取款查账、清零、转账 function withdraw() external { uint256 amount balances[msg.sender]; require(amount 0, No balance); // 防重入先清零账本再把钱转走 balances[msg.sender] 0; (bool success, ) payable(msg.sender).call{value: amount}(); require(success, Transfer failed); } function getContractBalance() external view returns (uint256) { return address(this).balance; } }这里藏着一个极具实战意义的开发习惯先清零账本再转账。如果把顺序反过来先给用户转钱、最后才把balances[msg.sender] 0恶意合约可能会在收到钱的一瞬间疯狂发起回调把钱从合约里掏空也就是大名鼎鼎的重入攻击。先更新状态再进行外部交互Checks-Effects-Interactions 模式是写智能合约的保命法则。六、回到最开始的银行比喻银行 App 里的数字是合约账本balances。银行金库里的现金堆是合约地址余额address(this).balance。柜台前递材料的人是直接调用者msg.sender。搞懂了这几层关系Solidity 里那些让人头疼的转账、记账和权限控制其实也就不过如此了。Tips为了方便查阅更多可以关注我的gz号全网同名第一时间更新。

相关新闻

云服务器docker的安装

云服务器docker的安装

# 安装docker 参考文档:https://help.aliyun.com/document_detail/60742.html?spma2c4g.11174283.6.548.24c14541ssYFIZ第一步:安装必要的一些系统工具yum install -y yum-utils device-mapper-persistent-data lvm2第二步:添加软件源信息yu…

2026/10/18 7:12:00 阅读更多 →
基于GRU神经网络的英文诗歌生成:从毕设选题到答辩全流程实战

基于GRU神经网络的英文诗歌生成:从毕设选题到答辩全流程实战

毕设开题周最折磨人的一件事,不是怕题目难,而是怕题目选了之后根本不知道从哪里下手。我去年在选题时盯上了“基于GRU神经网络的英文诗歌生成系统”,当时纯粹是觉得生成诗歌这个方向好展示——训练完能跑出看得见、读得懂、还能当场演示的Dem…

2026/10/18 7:12:00 阅读更多 →
置信学习如何解决目标检测标签噪声:约束模型下的实操指南

置信学习如何解决目标检测标签噪声:约束模型下的实操指南

以目标检测里的那些烂标签为切入点。做检测项目的人基本都遇到过这种情况:数据标注回来,肉眼看着框没啥问题,训练出来的模型却被某些样本反复教坏。分类不对、框偏了、或者压根标漏了。早期我把这些问题归咎于“数据质量”,后来发…

2026/10/18 7:11:00 阅读更多 →

最新新闻

400G多模光纤:为何8通道50G比4通道100G更早落地

400G多模光纤:为何8通道50G比4通道100G更早落地

简介:IEEE Std 802.3cm-2020 是 IEEE 发布的以太网修订标准,聚焦多模光纤上 400Gb/s 的物理层与管理参数,面向光通信工程师、数据中心网络架构师及 400G 光模块研发人员。标准新增 Clause 150,定义了 400GBASE-SR8 与 400GBASE-SR…

2026/10/18 10:36:45 阅读更多 →
400G多模光纤标准解析:SR8与SR4.2的物理层设计差异与工程实践

400G多模光纤标准解析:SR8与SR4.2的物理层设计差异与工程实践

简介:IEEE Std 802.3cm-2020 是 IEEE 发布的以太网修订标准,聚焦多模光纤上 400Gb/s 的物理层与管理参数,面向光通信工程师、数据中心网络架构师及 400G 光模块研发人员。标准新增 Clause 150,定义了 400GBASE-SR8 与 400GBASE-SR…

2026/10/18 10:36:45 阅读更多 →
Linux Socket 编程实战:从可编译实例到多连接服务

Linux Socket 编程实战:从可编译实例到多连接服务

简介:这份资源面向Linux网络编程初学者与需要夯实Socket基础的开发者,系统梳理了Socket通信的核心原理与常用接口。内容从网络中进程如何唯一标识讲起,说明IP地址、协议与端口三元组的作用,并解释Socket作为特殊文件的设计思想&am…

2026/10/18 10:36:45 阅读更多 →
微信小程序远程在线诊疗系统:基于SSM的完整设计与实现

微信小程序远程在线诊疗系统:基于SSM的完整设计与实现

简介:面向高校毕业设计场景的微信小程序远程在线诊疗系统完整项目,后端采用Java SSM框架与MySQL数据库,前端为微信开发者工具构建的小程序,并辅以Vue相关后台管理界面。系统内设管理员、用户、医生三类角色,覆盖科室信…

2026/10/18 10:36:45 阅读更多 →
勇士传说横版卷轴游戏:C#动作游戏源码解析与毕业设计实战

勇士传说横版卷轴游戏:C#动作游戏源码解析与毕业设计实战

简介:这份资源是基于C#开发的「勇士传说」横版卷轴游戏完整源码,面向计算机相关专业做毕业设计的学生,以及希望入门Unity 2D游戏开发的学习者。项目以经典横版卷轴玩法为核心,涵盖角色动画、碰撞检测、地图设计、敌人AI与用户输入…

2026/10/18 10:36:45 阅读更多 →
零基础参与开源Python项目:从Fork到首个PR的完整实战指南

零基础参与开源Python项目:从Fork到首个PR的完整实战指南

1. 先搞清楚开源贡献这件事,远不止写代码很多刚接触开源Python项目的人,以为“做贡献”就等于“提PR改源码”。我最初也是这样想的,甚至一度觉得,自己没写出过有设计感的代码,就不配去动别人的仓库。直到后来真正参与进…

2026/10/18 10:35:45 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →