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;
    }

    // 允许合约接收 ETH
    receive() 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; 👉 存储 地址 -> 用户信息


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/962206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python算法和数据结构刷题[1]:数组、矩阵、字符串

一画图二伪代码三写代码 LeetCode必刷100题:一份来自面试官的算法地图(题解持续更新中)-CSDN博客 算法通关手册(LeetCode) | 算法通关手册(LeetCode) (itcharge.cn) 面试经典 150 题 - 学习计…

EWM 变更库存类型

目录 1 简介 2 配置 3 业务操作 1 简介 一般情况下 EWM 标准收货流程是 ROD(Ready on Dock) --> AFS(Avaiable for Sale),对应 AG 001 --> AG 002,对应库存类型 F1 --> F2。 因业务需要反向进行的时候,AFS --> ROD,AG 002 --> AG 001,库存类型 F2…

B站吴恩达机器学习笔记

机器学习视频地址: 4.5 线性回归中的梯度下降_哔哩哔哩_bilibili 损失函数学习地址: 损失函数选择 选凸函数的话,会收敛到全局最小值。证明凸函数用Hessian矩阵。凸函数定义:两点连线比线上所有点都大。 batch理解&#xff1…

SpringBoot 数据访问(MyBatis)

SpringBoot 数据访问(MyBatis) 向 SQL 语句传参 #{} 形式 #{}:如果传过来的值是字符串类型。那两边会自动加上 单引号。当传递给 #{} 的参数值是非字符串类型(如整数、浮点数、布尔值等),MyBatis 不会为这些值添加引…

【游戏设计原理】93 - 节奏

与“序-破-急”类似的节奏概念广泛存在于全球不同文化和创意领域中。以下是一些常见的节奏框架和理论,它们与“序-破-急”在本质上有相似之处,但体现出不同的风格和应用: 1. 三幕式结构(Three-Act Structure) 来源&a…

蓝桥云客 三羊献瑞

三羊献瑞 题目描述 本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。 观察下面的加法算式: 祥 瑞 生 辉 三 羊 献 瑞 -------------------三 羊 生 瑞 气其中,相同的汉字代表相同的数字,…

OpenCV:二值化与自适应阈值

目录 简述 1. 什么是二值化 2. 二值化接口 2.1 参数说明​​​​​ 2.2 示例代码 2.3 运行结果 3. 自适应阈值 3.1 参数说明 3.2 示例代码 3.3 运行结果 4. 总结 4.1 二值化 4.2 自适应阈值 相关阅读 OpenCV:图像的腐蚀与膨胀-CSDN博客 简述 图像二值…

【memgpt】letta 课程6: 多agent编排

Lab 6: Multi-Agent Orchestration 多代理协作 letta 是作为一个服务存在的,app通过restful api 通信 多智能体之间如何协调与沟通? 相互发送消息共享内存块,让代理同步到不同的服务的内存块

Java---猜数字游戏

本篇文章所实现的是Java经典的猜数字游戏 , 运用简单代码来实现基本功能 目录 一.题目要求 二.游戏准备 三.代码实现 一.题目要求 随机生成一个1-100之间的整数(可以自己设置区间),提示用户猜测,猜大提示"猜大了",…

STM32标准库移植RT-Thread nano

STM32标准库移植RT-Thread Nano 哔哩哔哩教程链接:STM32F1标准库移植RT_Thread Nano 移植前的准备 stm32标准库的裸机代码(最好带有点灯和串口)RT-Thread Nano Pack自己的开发板 移植前的说明 本人是在读学生,正在学习阶段&a…

使用Navicat Premium管理数据库时,如何关闭事务默认自动提交功能?

使用Navicat Premium管理数据库时,最糟心的事情莫过于事务默认自动提交,也就是你写完语句运行时,它自动执行commit提交至数据库,此时你就无法进行回滚操作。 建议您尝试取消勾选“选项”中的“自动开始事务”,点击“工…

AutoDL 云服务器:xfce4 远程桌面 终端乱码 + 谷歌浏览器

/usr/bin/google-chrome-stable --no-sandbox --proxy-server"127.0.0.1:7890" 打开新的PowerShell ssh -p 54521 rootconnect.yza1.seetacloud.com /opt/TurboVNC/bin/vncserver -kill :1 rm -rf /tmp/.X1* USERroot /opt/TurboVNC/bin/vncserver :1 -desktop …

《STL基础之vector、list、deque》

【vector、list、deque导读】vector、list、deque这三种序列式的容器,算是比较的基础容器,也是大家在日常开发中常用到的容器,因为底层用到的数据结构比较简单,笔者就将他们三者放到一起做下对比分析,介绍下基本用法&a…

JavaScript网页设计案例(任务管理器)

任务管理器 功能描述:用户可以添加任务、删除任务,并且任务列表在页面刷新后不会丢失,还能进行任务过滤与搜索。代码实现思路 HTML 结构:创建输入框用于输入任务、按钮用于添加任务,以及无序列表用于展示任务列表。CSS…

模型I/O功能之模型包装器

文章目录 模型包装器分类LLM模型包装器、聊天模型包装器 截至2023年7月,LangChain支持的大语言模型已经超过了50种,这其中包括了来自OpenAI、Meta、Google等顶尖科技公司的大语言模型,以及各类优秀的开源大语言模型。对于这些大语言模型&…

机器人抓取与操作经典规划算法(深蓝)——2

1 经典规划算法 位姿估计:(1)相机系位姿 (2)机器人系位姿 抓取位姿:(1)抓取位姿计算 (2)抓取评估和优化 路径规划:(1)笛卡…

开发环境搭建-4:WSL 配置 docker 运行环境

在 WSL 环境中构建:WSL2 (2.3.26.0) Oracle Linux 8.7 官方镜像 基本概念说明 容器技术 利用 Linux 系统的 文件系统(UnionFS)、命名空间(namespace)、权限管理(cgroup),虚拟出一…

【2024年华为OD机试】(B卷,100分)- 热点网站统计(Java JS PythonC/C++)

一、问题描述 题目描述 企业路由器的统计页面需要动态统计公司访问最多的网页URL的Top N。设计一个算法,能够高效动态统计Top N的页面。 输入描述 每一行都是一个URL或一个数字: 如果是URL,代表一段时间内的网页访问。如果是数字N&#…

Git图形化工具【lazygit】

简要介绍一下偶然发现的Git图形化工具——「lazygit」 概述 Lazygit 是一个用 Go 语言编写的 Git 命令行界面(TUI)工具,它让 Git 操作变得更加直观和高效。 Github地址:https://github.com/jesseduffield/lazygit 主要特点 主要…

单细胞-第五节 多样本数据分析,打分R包AUCell

文件在单细胞\5_GC_py\1_single_cell\3.AUCell.Rmd 1.基因 rm(list = ls()) load("g.Rdata")2.AUCell https://www.ncbi.nlm.nih.gov/pmc/articles/PMC9897923 IF: NA NA NA用这个文章里的方法,将单细胞亚群的marker基因与ros相关基因取交集,用作AUCell的基因集…