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

唤醒手腕 2025 年最新 solidity 语言区块链智能合约详细教程(更新中)

作者有话说?

博客:《唤醒手腕 2025 年最新 Ethereum 以太坊 Dapp 开发详细教程》(已屏蔽)私信博主查看博客!!!
https://wrist.blog.csdn.net/article/details/152534821?spm=1001.2014.3001.5502

Remix IDE 在线集成开发环境

Remix IDE 是一个功能强大、无需本地环境配置的在线集成开发环境,主要用于以太坊智能合约的开发和测试。它尤其适合 Solidity 语言的初学者和进行快速原型开发。

Remix Desktop

Remix Desktop 是 Remix IDE 的桌面应用程序版本,专为以太坊智能合约开发设计。它基于 Electron 框架构建,支持在 Linux、Windows 和 macOS 系统上运行。

Remix IDE 核心特性

开箱即用:直接在浏览器中运行,无需安装 Solidity 编译器或节点环境。直观的图形界面:将编译、部署、调试等复杂流程简化为点击操作。内置调试器:支持单步调试,可以深入跟踪交易和调用,查看变量状态。多环境支持:可以选择在 JavaScript VM、连接到本地节点或直接连接到如 Sepolia 等公共测试网络进行部署。丰富的插件系统:可以通过安装插件来扩展功能,例如静态代码分析、单元测试等。

进阶功能

单元测试:使用 Remix 的 “Solidity Unit Testing” 插件,可以编写 .sol 格式的测试用例,确保合约逻辑的正确性。静态分析:“Static Analysis” 插件可以检查代码中的常见漏洞和不良实践。安全考量:在部署到主网之前,务必在测试网上充分测试。考虑使用其他专业工具(如 Slither, MythX)进行安全审计。代码验证:部署到公共网络后,最好在 Etherscan 等区块链浏览器上验证你的合约源代码,以增加透明度。

Remix IDE:https://remix.ethereum.org/

在这里插入图片描述

智能合约典型工作流

在这里插入图片描述

SPDX-License-Identifier: MIT

SPDX-License-Identifier: MIT 是一个标准化的声明,用于明确地、机器可读地标识一个软件源代码文件所遵循的开源许可证是 MIT 许可证。它通过一行简短的、机器可读的标识符,取代了冗长的法律文本,使软件的许可证信息更加透明,便于管理和自动化处理。对于开发者而言,如果你希望你的代码能被最广泛地使用,选择 MIT 许可证并使用这个标识符是一个非常推荐的做法。

SPDX 全称是 Software Package Data Exchange。它的目标是标准化软件许可证信息的格式,使软件供应链(尤其是合规性检查)能够自动化。简单说,就是为了让计算机程序也能轻松地“读懂”一个软件包或文件用的是哪种许可证。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SimpleStorage {uint256 storedData;function set(uint256 x) public {storedData = x;}function get() public view returns (uint256) {return storedData;}
}

指定版本:在代码中使用 pragma solidity ^0.8.0; 等语句来指定兼容的编译器版本。

Remix 编写部署合约

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Helloworld {string public name;constructor() {name = "wristwaking";}}

在这里插入图片描述

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Helloworld {string public name;constructor() {name = "wristwaking";}function sayName () public view returns (string memory) {return name;}}

在这里插入图片描述

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract Helloworld {string public name;constructor() {name = "wristwaking";}function sayName () public view returns (string memory) {return name;}function setName ( string memory _name ) public {name = _name;}}

在这里插入图片描述

ETH Gas 机制概述

Gas 是以太坊网络的“燃料”和“生命线”,是理解其运作机制的核心概念。Gas 是在以太坊(及其他 EVM 兼容链)上执行操作时所需的计算工作量的计量单位。它的主要目的不是收费,而是为了保护网络安全资源合理分配

在这里插入图片描述

你可以把它想象成汽车的**燃油**:- 进行一次简单的计算,就像在城市里低速行驶,**耗油较少**。
- 进行一次复杂的智能合约交互,就像在高速公路上猛踩油门,**耗油较多**。

EIP-1559 升级后 Gas 费用具体说明

组成部分描述谁受益?特点
Gas Used完成你的交易或合约调用实际消耗的 Gas 数量-由操作的复杂性决定,网络自动计算。
Gas Limit你愿意为这笔交易支付的最大 Gas 数量-安全机制,防止代码错误耗尽所有资金。
Base Fee每个区块的基础费用,由网络协议根据拥堵程度动态计算被销毁所有交易必须支付;不断波动;旨在调节网络拥堵。
Priority Fee优先费(矿工/验证者小费),用于激励他们优先打包你的交易。矿工/验证者由用户设置;越高则交易越快被处理。
Max Fee你愿意为每单位 Gas 支付的绝对上限-你的总预算:Max Fee ≥ Base Fee + Priority Fee
总费用计算公式:`总费用 = (Base Fee + Priority Fee) * Gas Used`

Gas 作用

1.  **防止资源滥用**:没有 Gas,恶意用户可以通过运行无限循环的计算来瘫痪整个网络。
2.  **为计算付费**:以太坊网络由全球的节点维护,它们提供了计算和存储资源。Gas 费用就是对这种资源的补偿。
3.  **激励矿工/验证者**:矿工和验证者优先处理那些提供了更高 `Priority Fee` 的交易,这形成了一个自由市场。

合理设置 Gas

场景策略
不紧急的交易设置一个较低的 Priority Fee(例如 1-3 Gwei)。交易确认会慢,但便宜。
希望快速确认设置一个较高的 Priority Fee(例如 5-100+ Gwei)。这能激励矿工优先处理。
设置 Gas Limit对于简单的转账,21,000 Gas 是标准值。对于合约交互,相信钱包的自动估算,或稍增加一点作为安全缓冲。
最佳实践使用钱包(如 MetaMask)的自动估算功能。在大多数情况下,这是最安全、最经济的选择。

常见 Gas 相关错误

- **"Out of Gas"**:交易执行时消耗的 Gas 达到了你设置的 `Gas Limit`,但未能完成。交易**失败**,所有状态回滚,但**已消耗的 Gas 费不退**。
- **Gas 设置过低**:`Max Fee` 或 `Priority Fee` 设得太低,导致交易长时间处于**待处理**状态,无法被矿工打包。

Gas 是以太坊网络的动力源泉和安全卫士。 它通过一个精巧的经济模型,确保了网络在面对无限需求时,计算资源能够被公平、高效地分配,同时保护网络免受恶意攻击。理解 Gas 是成为以太坊高级用户和开发者的必经之路。

EVM 以太坊虚拟机

EVM 的全称是 Ethereum Virtual Machine。您可以将其理解为一个全球性的、去中心化的超级计算机,它运行在以太坊网络的成千上万个节点上。

它的核心职责是执行智能合约。通过提供一个隔离的、确定性的运行时环境,EVM 确保了在以太坊上部署的代码在任何地方都能以相同的方式运行,并产生完全相同的结果。

在这里插入图片描述

EVM 运作机制/特性

机制/特性详细说明
状态机EVM 是驱动以太坊这个全球状态机的引擎。它根据输入的交易(例如:A 向 B 转账),计算并产生一个新的、有效的全球状态。
Gas 机制在 EVM 上执行的每一条操作码(如加法、存储数据)都需要消耗一定量的 Gas。这个机制:
防止无限循环和拒绝服务攻击。
为计算资源付费,激励矿工/验证者处理交易。
• 如果 Gas 在执行中途耗尽,所有状态变更将被回滚,但已消耗的 Gas 费不退。
沙盒环境EVM 在一个完全隔离的沙盒中运行合约代码。这意味着代码无法直接访问主机的网络、文件系统或其他进程,极大地增强了安全性。
确定性给定相同的初始状态和相同的交易输入,EVM 的执行结果必须始终一致。这是区块链共识的基础。

EVM 内部架构

组件作用
堆栈EVM 是一个堆栈机。大多数操作(如加法、比较)都是通过从堆栈弹出数据,进行计算,再将结果压回堆栈来完成的。其深度为 1024 个元素。
内存一个易失性的、可无限扩展的临时存储区。用于在合约执行期间存储中间数据,例如传递数组给函数。执行结束后数据被清除。
存储一个持久化的、存储在区块链上的键值对数据库。它是合约状态变量存放的地方,修改它需要消耗大量 Gas。
Calldata一个只读的、存储交易传入数据的区域(例如函数调用参数)。
- **EVM 兼容链**:许多其他区块链(如 Polygon, Avalanche, BSC)都选择了与 EVM 兼容。这意味着在这些链上,开发者可以**使用相同的工具(如 Solidity, MetaMask, Hardhat)**,并且无需修改或只需极少修改即可部署他们的合约。
- **跨链互操作性**:EVM 兼容性极大地简化了资产和应用在不同区块链之间的迁移和互操作。

总而言之,EVM 是以太坊及其他众多区块链的智能合约执行引擎,其强大的生态系统和标准化的开发环境是推动区块链应用蓬勃发展的关键基石。

ABI 应用程序二进制接口

ABI 的全称是 Application Binary Interface,中文翻译为“应用程序二进制接口”。ABI 和 Bytecode 这两个智能合约开发中核心的概念。您可以将它们理解为智能合约的 “使用说明书” 和 “可执行文件”。

特性ABIBytecode
形式一个 JSON 格式 的数组,描述了合约的接口规范。一串 十六进制 数字(以 0x 开头)。
内容包含了所有可交互组件的描述:
函数(名称、输入输出参数、类型)
事件
错误
包含:
部署代码:用于创建合约的初始化代码。
运行时代码:合约逻辑本身,存储在链上并由EVM执行。
主要作用实现互操作性。告诉外部世界如何正确地调用这个合约的函数、以及如何解析它发出的事件。在EVM上执行。是合约本身的机器语言,定义了合约的状态逻辑
使用场景1. 在前端DApp中(如使用 web3.js/ethers.js)。
2. 在另一个合约中与目标合约交互。
3. 在Remix等IDE中加载已部署的合约。
1. 部署合约到区块链网络。
2. 在合约创建交易中作为 data 字段发送。
类比API 文档 / 头文件
就像一份详细的“产品说明书”,告诉你有哪些按钮可以按,按了会有什么效果。
编译后的可执行文件 (.exe)
就像是软件的安装包,里面是计算机能直接运行的机器码。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract SimpleStorage {uint256 storedData;function set(uint256 x) public {storedData = x;}function get() public view returns (uint256) {return storedData;}
}

ABI(简化版)

[{"inputs": [],"name": "get","outputs": [{"internalType": "uint256", "name": "", "type": "uint256"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "uint256", "name": "x", "type": "uint256"}],"name": "set","outputs": [],"stateMutability": "nonpayable","type": "function"}
]**解读**:这个ABI告诉外部,这个合约有两个函数:`get`(无需参数,返回一个`uint256`)和 `set`(需要一个`uint256`参数,没有返回值)。

Bytecode(极简版)

0x608060405234801561000f575f5ffd5b5060...(非常长的一串十六进制数字)**解读**:这串数字毫无人类可读性,但EVM可以理解并执行它。当您部署合约时,就是将这串代码作为交易的数据发送到网络。
1.  **分工明确**:**ABI 用于交互,Bytecode 用于部署和执行。**
2.  **缺一不可**:*   要**部署**合约,您需要 **Bytecode**。*   要**与已部署的合约交互**,您需要它的**地址** 和 **ABI**。
3.  **获取方式**:通常,当您在 Remix、Hardhat 或 Truffle 等开发环境中编译 Solidity 合约时,它们会同时生成 **ABI** 和 **Bytecode** 文件。

Solidity 常见全局变量

变量由以太坊虚拟机或 Solidity 语言本身提供,用于获取区块链信息、进行数学运算、处理地址等。

区块/交易属性

变量/函数类型描述使用场景与注意
block.numberuint当前区块的编号获取当前区块高度,常用于时间锁
block.timestampuint当前区块的时间戳(自UNIX纪元起的秒数)注意:矿工/验证者可以一定程度上操纵此值,不适合用于精确计时
blockhash(uint blockNumber)bytes32返回指定区块号的哈希值(仅最近256个区块,不含当前区块)获取近期区块的哈希,用于随机数生成(不安全)
msg.senderaddress当前调用的发起者地址最常用,用于权限检查(如onlyOwner)
msg.valueuint随当前调用发送的以太币数量,单位为 weipayable 函数中接收付款
tx.originaddress整个交易链的原始发起者慎用!容易导致网络钓鱼攻击,通常应使用 msg.sender
msg.databytes calldata完整的调用数据(calldata)用于低级调用或分析传入数据
gasleft()uint返回当前执行上下文中剩余的 gas用于监控和管理 gas 消耗

地址相关

变量/函数类型描述使用场景与注意
<address>.balanceuint返回指定地址的以太币余额,单位为 wei查询地址的ETH余额
<address>.transfer(uint amount)-向指定地址发送以太币(失败时抛出异常,固定2300 gas)安全的发送ETH方式,推荐使用
<address>.send(uint amount)bool向指定地址发送以太币(失败时返回false,固定2300 gas)较老的发送方式,需检查返回值,不如transfer方便
<address>.call{value: ...}("")(bool, bytes)低级CALL操作,可自定义gas和发送value功能强大,可用于调用其他合约或发送更多gas,但不安全,需谨慎使用
<address>.delegatecall(...)(bool, bytes)低级DELEGATECALL操作,使用目标合约的代码在当前合约上下文中执行用于实现代理模式和库函数

合约相关

变量/函数类型描述使用场景与注意
thisaddress当前合约的地址将合约自身当作一个普通地址传递时使用
selfdestruct(address recipient)-销毁当前合约,并将其剩余余额发送到指定地址合约生命周期结束,回收gas,谨慎使用

数学和加密

变量/函数类型描述使用场景与注意
keccak256(bytes memory) returns (bytes32)bytes32计算 Keccak-256 哈希最常用的哈希函数,用于创建唯一标识、验证数据完整性
sha256(bytes memory) returns (bytes32)bytes32计算 SHA-256 哈希与其他系统交互时需要SHA-256时使用
ripemd160(bytes memory) returns (bytes20)bytes20计算 RIPEMD-160 哈希较少使用,主要用于比特币兼容性
ecrecover(bytes32 hash, uint8 v, bytes32 r, bytes32 s) returns (address)address从椭圆曲线签名中恢复出公钥对应的地址用于验证签名,例如链下签名的消息验证
addmod(uint x, uint y, uint k) returns (uint)uint计算 (x + y) % k,支持任意精度安全的模加运算,避免中间结果溢出
mulmod(uint x, uint y, uint k) returns (uint)uint计算 (x * y) % k,支持任意精度安全的模乘运算,避免中间结果溢出

类型信息

变量/函数类型描述使用场景与注意
type(C).namestring返回合约类型 C 的名称获取合约名称(仅在合约外部可见时)
type(I).interfaceIdbytes4返回接口 I 的 EIP-165 接口标识符用于 EIP-165 标准接口查询与支持

使用示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;contract GlobalVariablesDemo {address public owner;uint public creationTime;constructor() {owner = msg.sender; // 在部署时,msg.sender 是部署者的地址creationTime = block.timestamp; // 记录合约创建时间}modifier onlyOwner() {require(msg.sender == owner, "Not the owner"); // 使用 msg.sender 进行权限检查_;}function getBalance() public view returns (uint) {return address(this).balance; // 获取当前合约的ETH余额}function withdraw() public onlyOwner {payable(owner).transfer(address(this).balance); // 使用 transfer 安全地发送ETH}function getBlockInfo() public view returns (uint number, uint timestamp, bytes32 hash) {number = block.number;timestamp = block.timestamp;hash = blockhash(block.number - 1); // 获取上一个区块的哈希}function doHash(string memory _input) public pure returns (bytes32) {return keccak256(abi.encodePacked(_input)); // 计算字符串的哈希}
}

在 Solidity 中,可见性修饰符用于控制合约中函数和状态变量的访问权限。它们定义了谁可以调用函数或访问变量。正确使用可见性修饰符对于编写安全的智能合约至关重要。

Solidity 可见性修饰符

public - 完全公开

可被以下对象访问:
- 合约内部
- 派生合约
- 外部账户和其他合约
- 通过 EOA 交易
contract Example {uint public publicVar = 100;function publicFunction() public pure returns (string memory) {return "This is public";}
}

private - 完全私有

**仅可被以下对象访问:**
定义它们的合约内部
contract Example {uint private privateVar = 200;function privateFunction() private pure returns (string memory) {return "This is private";}function accessPrivate() public view returns (uint) {return privateVar; // 只能在合约内部访问}
}

internal - 内部访问

**可被以下对象访问:**
- 定义它们的合约内部
- 派生合约
contract Base {uint internal internalVar = 300;function internalFunction() internal pure returns (string memory) {return "This is internal";}
}contract Derived is Base {function getInternal() public view returns (uint) {return internalVar; // 可以在派生合约中访问}
}

external - 外部访问

**仅可被以下对象访问:**
- 其他合约和外部账户
- **不能**在合约内部直接访问(需要使用 `this`)
contract Example {function externalFunction() external pure returns (string memory) {return "This is external";}function callExternal() public returns (string memory) {// return externalFunction(); // 错误:不能直接调用return this.externalFunction(); // 正确:需要通过 this}
}

状态变量可见性

状态变量必须显式指定可见性,有三种选择:
- `public` - 自动生成 getter 函数
- `internal` - 默认值(如果不指定)
- `private`
contract VisibilityExample {uint public publicState;        // 自动生成 getter 函数uint internal internalState;    // 仅合约内部和派生合约uint private privateState;      // 仅合约内部
}

函数可见性

contract FunctionVisibility {// 可以从任何地方调用function publicFunc() public pure returns (string memory) {return "public";}// 只能从合约内部调用function privateFunc() private pure returns (string memory) {return "private";}// 可以从合约内部和派生合约调用function internalFunc() internal pure returns (string memory) {return "internal";}// 只能从外部调用function externalFunc() external pure returns (string memory) {return "external";}
}

实际应用示例

// 银行账户合约示例
contract BankAccount {// 余额是私有的,只能通过特定函数访问address private owner;uint private balance;// 构造函数是内部的constructor() internal {owner = msg.sender;}// 存款函数是公开的function deposit() public payable {balance += msg.value;}// 取款函数是公开的,但有访问控制function withdraw(uint amount) public {require(msg.sender == owner, "Only owner can withdraw");require(amount <= balance, "Insufficient balance");balance -= amount;payable(msg.sender).transfer(amount);}// 获取余额函数是公开的function getBalance() public view returns (uint) {return balance;}// 内部函数,用于计算利息function calculateInterest() internal pure returns (uint) {return 5; // 5% 利息}
}
1. **最小权限原则**:默认使用最严格的可见性
2. **状态变量**:通常设为 `private` 或 `internal`
3. **外部接口**:使用 `public` 或 `external`
4. **内部逻辑**:使用 `internal` 或 `private`
5. **Gas 优化**:`external` 函数比 `public` 函数更省 gas

Solidity 错误处理

Solidity 的错误处理机制主要用于在发生异常时回滚所有状态变更,并向调用者通知错误。这是保证智能合约状态一致性和安全性的核心机制。主要有 3 种方式:requirerevertassert。更复杂场景推荐: try/catch

特性requirerevertassert
用途验证输入和外部条件复杂条件下的错误回滚验证内部不变性和逻辑错误
Gas 处理回滚,消耗 Gas(部分退还)回滚,消耗 Gas(部分退还)回滚,消耗所有 Gas(无退还)
错误信息支持字符串或自定义错误支持字符串或自定义错误仅 Panic 错误码
使用场景“这应该是对的”“如果这样,就报错”“这绝对必须是对的”
1.  **优先使用 `require` 和 `revert`**:用于检查用户输入和业务逻辑条件。
2.  **谨慎使用 `assert`**:仅用于检查那些在正确代码下永远不应发生的内部错误。
3.  **拥抱自定义错误**:在生产环境中,始终使用自定义错误来代替字符串错误信息,以节省 Gas。
4.  **善用 `try/catch`**:当你希望与外部合约交互,并且即使对方调用失败也不希望自己的整个交易失败时使用。
5.  **错误信息清晰**:无论是自定义错误名还是字符串,都应清晰表达错误原因,便于调试和前端集成。

Solidity 作用 / 应用场景

简单来说,Solidity 是一种专门用于编写和实现智能合约的高级编程语言。之于以太坊,就像 JavaScript 之于网页浏览器。智能合约是在区块链(如以太坊)上运行的程序,它定义了在满足特定条件时自动执行的规则和逻辑。Solidity 的语法与 JavaScript、C++ 等语言相似,这使得开发者更容易上手。

Solidity 核心特点:图灵完备,这意味着理论上可以用它来实现任何复杂的逻辑。

Solidity 核心作用

Solidity 主要作用就是创建在以太坊虚拟机(EVM)上运行的、去中心化的、不可篡改的、自动执行的应用程序(DApps)的底层逻辑。

定义数字资产

**创建代币(Token)**: 可以轻松创建符合各种标准的代币,如最著名的 **ERC-20**(同质化代币,类似货币)和 **ERC-721**(非同质化代币,NFT)。
**管理资产所有权**: 通过代码明确记录谁拥有什么资产,以及这些资产如何转移。

编写业务逻辑

**自动执行协议**: 将现实世界中的合同或协议条款(如“如果A在日期X前付款,则B将物品所有权转移给A”)编写成代码。一旦条件满足,代码自动执行,无需中间人。
**构建去中心化组织(DAO)**: 编写一个组织的治理规则,例如如何使用资金、如何投票决定项目等,所有决策由代码和社区投票透明执行。

构建复杂的去中心化应用(DApp)

Solidity 编写的智能合约是 DApp 的“后端”和核心逻辑层。前端(网页或手机App)通过与这些智能合约交互,为用户提供去中心化的服务。

Solidity 主要应用场景

去中心化金融(DeFi)

去中心化金融 是 Solidity 目前最大、最成熟的应用领域。DeFi 旨在用代码重建传统金融系统,无需银行等中心化机构。

**去中心化交易所(DEX)**: 如 Uniswap、SushiSwap。用户可以直接在链上交易代币,智能合约负责处理交易对、提供流动性、计算价格等。
**借贷协议**: 如 Aave、Compound。用户可以将自己的加密货币存入协议以赚取利息,或者通过超额抵押来借出其他资产。
**稳定币**: 如 DAI。通过智能合约和一套复杂的抵押、清算机制,维持其与法币(如美元)的锚定。
**收益农场、保险、衍生品等**: 几乎所有复杂的金融产品都可以通过 Solidity 智能合约来实现。

非同质化代币(NFT)

**NFT 收藏品**: 如 CryptoPunks、Bored Ape Yacht Club。每个 NFT 都是通过 Solidity(通常是 ERC-721 或 ERC-1155 标准)合约创建的唯一数字资产。
**数字艺术和音乐**: 艺术家通过智能合约发行其作品的限量版 NFT。
**游戏资产**: 游戏中的道具、土地、角色等可以写成 NFT,真正由玩家拥有,并可以在不同平台或市场交易。

游戏与元宇宙(GameFi)

**链游**: 游戏的核心规则和经济系统由智能合约控制。玩家可以“边玩边赚”,真正拥有游戏内资产。
**虚拟土地和经济**: 在元宇宙中,土地所有权、虚拟物品的创建和交易都通过 Solidity 合约来管理。

去中心化自治组织(DAO)

**社区治理**: 一个组织的金库(资金)由智能合约管理,任何资金的动用都需要通过成员投票。投票权和提案逻辑都由 Solidity 编写。
**众筹与投资**: 人们可以将资金汇集到一个智能合约中,并共同决定投资哪些项目。

供应链管理

**溯源与追踪**: 将商品从生产到销售的每一个环节记录在区块链上。Solidity 合约可以确保记录的不可篡改性,并在满足特定条件(如到达某个仓库)时自动触发付款或更新状态。

身份与认证

 **去中心化身份(DID)**: 将用户的身份信息、学历证书、职业资格等通过智能合约进行管理和验证,用户自己完全掌控自己的数据。

“银行存款取款”合约

// 声明 Solidity 版本
pragma solidity ^0.8.0;// 定义合约
contract SimpleBank {// 定义一个映射,记录每个地址的余额mapping(address => uint) private balances;// 存款函数: payable 关键字表示该函数可以接收以太币function deposit() public payable {balances[msg.sender] += msg.value; // msg.sender 是调用者地址,msg.value 是发送的金额}// 取款函数function withdraw(uint amount) public {require(balances[msg.sender] >= amount, "Insufficient balance"); // 检查余额balances[msg.sender] -= amount; // 更新余额payable(msg.sender).transfer(amount); // 将以太币发送回用户}// 查询余额函数(view 表示该函数不修改状态,只读取)function getBalance() public view returns (uint) {return balances[msg.sender];}
}
*   用户调用 `deposit` 并附上以太币,他的余额会增加。
*   用户调用 `withdraw`,合约会检查余额是否足够,如果足够,则减少余额并将以太币发送给用户。
*   整个过程没有银行参与,完全由代码自动、可信地执行。
特性描述
核心作用编写在区块链上自动执行智能合约
主要领域DeFi(核心)、NFT、GameFi、DAO、供应链等。
关键优势去信任化、透明、不可篡改、抗审查、自动化
学习价值是进入 Web3 和区块链开发领域的核心技能,需求量大,前景广阔。
http://www.dtcms.com/a/446961.html

相关文章:

  • 网站优化 seo和sem综合型网站建设
  • 国内做网站最大的公司网站开发合同知识产权
  • 网站建设及管理使用情况汇报为什么要买wordpress会员
  • 优秀的网站开发苏州网络推广去苏州聚尚网络
  • 基于jquery做的网站wordpress 文章置顶
  • 网站空间速度免费搭建永久网站步骤
  • SVG 路径:深入解析与使用技巧
  • Spring Security 详解:从基础认证到多表权限实战(初学者指南)
  • 惠州市企业网站seo点击软件小型公司网络搭建
  • 廊坊网站群发关键词seo外包大型公司
  • 前端密码加密方案全解析
  • 厦门市建设局加装电梯公示网站一站式服务平台官网
  • 济南济南网站建设网站权重分散
  • wordpress主题 水墨知乎关键词排名优化
  • 手机wap购物网站模板wordpress站点名称的影响
  • Termux Debian Arm64 源码编译安装坚果云,全平台同步笔记内容(也适用树莓派)
  • UWB | 原理 / 应用 / 算法
  • 厦门中信网站吕梁市住房与城乡建设厅网站
  • 做网站小程序多少钱建筑模拟器2022下载
  • 泉州丰泽建设局网站平面设计课程总结
  • Spring AI alibaba 智能体理论
  • 从零起步学习Redis || 第七章:Redis持久化方案的实现及底层原理解析(RDB快照与AOF日志)
  • python如何拼接图片
  • 云县网站建设找那家咸阳网站推广
  • 网站域名一年大概多少软件开发培训机构去哪个学校
  • VPS如何做镜像网站全网推广网站
  • 老年实训室建设介绍:打造“教-学-练”一体化老年实训建设样板
  • 布吉做棋牌网站建设哪家技术好淘外网站怎么做
  • 吃透链表进阶OJ:从 “怕踩坑” 到 “能讲透”
  • 国内做的比较大的外贸电商网站肇庆做网站设计