欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 高考 > Web-3.0(Solidity)基础教程

Web-3.0(Solidity)基础教程

2025/9/18 14:46:27 来源:https://blog.csdn.net/hongsegeming/article/details/145400829  浏览:    关键词:Web-3.0(Solidity)基础教程

Solidity 是 以太坊智能合约编程语言,用于编写 去中心化应用(DApp)。如果你想开发 Web3.0 应用,Solidity 是必学的。

Remix - Ethereum IDE(在线编写 Solidity)

特性Remix IDEHardhat
适用场景适合 初学者小项目测试适合 专业开发大项目
使用方式在线工具(浏览器)本地开发(命令行)
环境无需安装,直接在线使用需要 Node.js + NPM
调试工具内置调试器(Debugger)Hardhat Network(本地测试链)
测试方式手动测试,运行合约函数自动化测试(Mocha / Chai)
本地节点无本地测试链自带本地以太坊节点
部署方式点击 Deploy 按钮,适合测试支持自动部署脚本(更灵活)
适合的开发者初学者、简单测试开发者、团队项目

Solidity 语法基础


📌 1. Solidity 代码结构

// SPDX-License-Identifier: MIT  // 许可证声明(推荐加上)
pragma solidity ^0.8.0;  // 指定 Solidity 版本contract MyContract {  // 定义一个智能合约uint public myNumber = 10;  // 公开变量(自动生成 getter)
}

pragma solidity ^0.8.0; 👉 指定 Solidity 版本(避免兼容性问题)
contract MyContract {} 👉 定义一个智能合约
public 👉 允许外部访问变量(自动生成 getter 方法)

📌 2. 数据类型

类型说明示例
uint无符号整数(正数)uint256 number = 100;
int有符号整数(正负数)int256 number = -50;
bool布尔值(true/false)bool isActive = true;
string字符串string name = "Web3";
address以太坊地址address owner = msg.sender;
mapping映射(键值对)

mapping(address => uint) public balances;

contract DataTypes {uint public myUint = 100;  // 只能存正整数int public myInt = -50;    // 允许负数bool public isActive = true;  // 布尔类型string public myString = "Hello, Web3!";  // 字符串address public myAddress = msg.sender;  // 以太坊地址
}

📌 3. 变量(状态变量 & 局部变量)

contract Variables {uint public stateVar = 10;  // 状态变量(存储在区块链上)function myFunction() public pure {uint localVar = 20;  // 局部变量(只在函数内部有效)}
}

状态变量 👉 stateVar 存储在区块链上(有 Gas 费)
局部变量 👉 localVar 只在函数内部(不消耗 Gas)

📌 4. 函数

contract MyContract {uint public myNumber;// 写入函数(修改状态变量,需要 Gas)function setNumber(uint _num) public {myNumber = _num;}// 读取函数(view 关键字,不消耗 Gas)function getNumber() public view returns (uint) {return myNumber;}
}

public 👉 允许外部访问
view 👉 只读取数据,不修改状态(不消耗 Gas)
returns (uint) 👉 指定返回值类型

📌 5. 修饰符(modifier

contract MyContract {address public owner;constructor() {owner = msg.sender;  // 记录合约创建者}modifier onlyOwner() {require(msg.sender == owner, "Not the owner");_;  // 继续执行原函数}function setOwner(address _newOwner) public onlyOwner {owner = _newOwner;  // 只有合约创建者可以修改}
}

modifier onlyOwner() 👉 仅限管理员调用
require(msg.sender == owner, "Not the owner") 👉 检查调用者身份
_; 👉 继续执行原函数

📌 6. 交易 & 以太币(payable

contract PaymentContract {address public owner;constructor() {owner = msg.sender;}// 允许合约接收 ETHreceive() external payable {}// 提取合约余额function withdraw() public {require(msg.sender == owner, "Not the owner");payable(owner).transfer(address(this).balance);}// 查询合约余额function getBalance() public view returns (uint) {return address(this).balance;}
}

receive() external payable {} 👉 允许合约接收 ETH
payable(owner).transfer(address(this).balance); 👉 提取 ETH

📌 7. 事件(Event)

contract EventExample {event MessageUpdated(address indexed sender, string oldMessage, string newMessage);string public message = "Hello, Web3!";function updateMessage(string memory _newMessage) public {string memory oldMessage = message;message = _newMessage;emit MessageUpdated(msg.sender, oldMessage, _newMessage);}
}

event MessageUpdated() 👉 定义事件
emit MessageUpdated(msg.sender, oldMessage, _newMessage); 👉 触发事件

📌 8. mapping(键值对存储)

contract MappingExample {mapping(address => uint) public balances;function setBalance(uint _amount) public {balances[msg.sender] = _amount;}function getBalance(address _addr) public view returns (uint) {return balances[_addr];}
}

mapping(address => uint) 👉 存储 地址 -> 余额
balances[msg.sender] = _amount; 👉 设置余额

📌 9. struct(自定义数据类型)

contract StructExample {struct User {string name;uint age;}mapping(address => User) public users;function setUser(string memory _name, uint _age) public {users[msg.sender] = User(_name, _age);}function getUser(address _addr) public view returns (string memory, uint) {User memory user = users[_addr];return (user.name, user.age);}
}

struct User 👉 自定义用户数据结构
mapping(address => User) public users; 👉 存储 地址 -> 用户信息


版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词