智能合约:Solidity(基于以太坊或兼容链,如 Polygon、BSC)(仅供学习区块链知识,不可进行违法开发应用)

开发工具:Hardhat 或 Truffle(编译、部署合约),OpenZeppelin(安全合约模板)

代码实现

1. MUSD 代币合约

基于 ERC-20 标准,使用 OpenZeppelin 模板。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/ERC20.sol";contract MUSD is ERC20 {constructor() ERC20("Mall USD", "MUSD") {_mint(msg.sender, 1000000 * 10**18); // 初始发行 100万 MUSD}// 商城合约可以调用此函数铸造更多 MUSD 作为奖励function mint(address to, uint256 amount) public {_mint(to, amount);}
}
2. NFT 商品合约

基于 ERC-721,每个商品是一个独特的 NFT。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";contract ProductNFT is ERC721 {using Counters for Counters.Counter;Counters.Counter private _tokenIds;mapping(uint256 => string) private _tokenURIs;constructor() ERC721("ProductNFT", "PNFT") {}function mintNFT(address to, string memory tokenURI) public returns (uint256) {_tokenIds.increment();uint256 newItemId = _tokenIds.current();_mint(to, newItemId);_setTokenURI(newItemId, tokenURI);return newItemId;}function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal {_tokenURIs[tokenId] = _tokenURI;}function tokenURI(uint256 tokenId) public view override returns (string memory) {return _tokenURIs[tokenId];}
}
3. 商城合约

核心逻辑,处理上架和购买。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "./ProductNFT.sol";
import "./MUSD.sol";contract Mall {ProductNFT public productNFT;IERC20 public usdc; // USDC 合约地址MUSD public musd;struct Item {uint256 tokenId;address seller;uint256 price; // 以 USDC 为单位bool isSold;}mapping(uint256 => Item) public items;uint256 public itemCount;event ItemListed(uint256 tokenId, address seller, uint256 price);event ItemSold(uint256 tokenId, address buyer, uint256 price);constructor(address _productNFT, address _usdc, address _musd) {productNFT = ProductNFT(_productNFT);usdc = IERC20(_usdc);musd = MUSD(_musd);}// 商家上架商品function listItem(string memory tokenURI, uint256 price) external {uint256 tokenId = productNFT.mintNFT(address(this), tokenURI);itemCount++;items[tokenId] = Item(tokenId, msg.sender, price, false);emit ItemListed(tokenId, msg.sender, price);}// 用户用 USDC 购买商品function buyItem(uint256 tokenId) external {Item storage item = items[tokenId];require(!item.isSold, "Item already sold");require(usdc.transferFrom(msg.sender, item.seller, item.price), "USDC transfer failed");item.isSold = true;productNFT.transferFrom(address(this), msg.sender, tokenId);// 奖励买家 1 MUSDmusd.mint(msg.sender, 1 * 10**18);emit ItemSold(tokenId, msg.sender, item.price);}
}
4. 前端实现(React + Ethers.js)

以下是简化的前端代码,假设已配置好 MetaMask 和合约地址。

import { ethers } from "ethers";
import React, { useState } from "react";
import MallABI from "./abis/Mall.json"; // 商城合约 ABI
import USDCABI from "./abis/USDC.json"; // USDC ABIconst MallDApp = () => {const [provider, setProvider] = useState(null);const [account, setAccount] = useState(null);const mallAddress = "0xYourMallContractAddress";const usdcAddress = "0xYourUSDCContractAddress"; // 测试网 USDC 地址// 连接钱包const connectWallet = async () => {const provider = new ethers.BrowserProvider(window.ethereum);const accounts = await provider.send("eth_requestAccounts", []);setProvider(provider);setAccount(accounts[0]);};// 商家上架商品const listItem = async () => {const signer = await provider.getSigner();const mallContract = new ethers.Contract(mallAddress, MallABI, signer);const tokenURI = "ipfs://your-ipfs-hash"; // 商品元数据const price = ethers.parseUnits("10", 6); // 假设 10 USDC,6 位小数await mallContract.listItem(tokenURI, price);};// 用户购买商品const buyItem = async (tokenId) => {const signer = await provider.getSigner();const mallContract = new ethers.Contract(mallAddress, MallABI, signer);const usdcContract = new ethers.Contract(usdcAddress, USDCABI, signer);// 授权 USDCconst price = items[tokenId].price; // 从状态或合约获取价格await usdcContract.approve(mallAddress, price);await mallContract.buyItem(tokenId);};return (<div><button onClick={connectWallet}>连接钱包</button><button onClick={listItem}>上架商品</button><button onClick={() => buyItem(1)}>购买商品 (ID: 1)</button></div>);
};export default MallDApp;

部署与测试

  1. 编译与部署
    • 用 Hardhat 编译合约:npx hardhat compile。
    • 部署到测试网:编辑 hardhat.config.js,添加网络配置,然后运行 npx hardhat run scripts/deploy.js --network sepolia。
  2. 测试流程
    • 用 MetaMask 连接测试网,获取测试 USDC(可用 faucet)。
    • 商家调用 listItem,检查 NFT 是否铸造。
    • 用户授权 USDC 并调用 buyItem,验证 NFT 和 USDC 转移。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

工作记录 2017-01-11

工作记录 2017-01-11 序号 工作 相关人员 1 协助BPO进行Billing的工作。 修改邮件上的问题。 更新RD服务器。 郝 更新的问题 1、修改了Patient Insurance的文件上传。 1.1 文件存储改为MedI“EHRWfs”Account“patientInfo”MRN 1.2 “Upload Files” to “Upload/Vie…

基于javaweb的SpringBoot个人健康管理系统小程序微信小程序设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

b站视频下载工具软件怎么下载

自行配置FFMPEG环境 请优先选择批量下载&#xff0c;会自处理视频和音频文件。 如果要下载更高质量请登陆。 没有配置FFMPEG下载后会有报错提示&#xff0c;视频音频文件无法合并生成mp4文件 更新批量下载标题&#xff0c;只取视频原标题&#xff0c;B站反爬机制登陆后下载多了…

简单的模拟法

1. 鸡兔同笼问题&#xff0c;鸡有2只脚 &#xff0c;兔有4只脚&#xff0c;已知脚数求最多有几只动物 #include <stdio.h>void feet(int x){if(x%2 0){if(x%4 0) printf("max%d,min%d",x/2,x/4);else printf("max%d,min%d",x/2,(x-2)/41);}else …

【python爬虫】酷狗音乐爬取练习

注意&#xff1a;本次爬取的音乐仅有1分钟试听&#xff0c;仅作学习爬虫的原理&#xff0c;完整音乐需要自行下载客户端。 一、 初步分析 登陆酷狗音乐后随机选取一首歌&#xff0c;在请求里发现一段mp3文件&#xff0c;复制网址&#xff0c;确实是我们需要的url。 复制音频的…

概率论的基本知识

逆概率还不懂&#xff0c;改天再想想。 联合概率 联合概率&#xff08;Joint Probability&#xff09; 是概率论中的一个重要概念&#xff0c;用于描述多个随机变量同时取某些值的概率。联合概率可以帮助我们理解多个变量之间的关系。

Ceph(1):分布式存储技术简介

1 分布式存储技术简介 1.1 分布式存储系统的特性 &#xff08;1&#xff09;可扩展 分布式存储系统可以扩展到几百台甚至几千台的集群规模&#xff0c;而且随着集群规模的增长&#xff0c;系统整体性能表现为线性增长。分布式存储的水平扩展有以下几个特性&#xff1a; 节点…

Pytest自动化测试框架pytest-xdist分布式测试插件

平常我们功能测试用例非常多时&#xff0c;比如有1千条用例&#xff0c;假设每个用例执行需要1分钟&#xff0c;如果单个测试人员执行需要1000分钟才能跑完&#xff1b; 当项目非常紧急时&#xff0c;会需要协调多个测试资源来把任务分成两部分&#xff0c;于是执行时间缩短一…

在openEuler-22.03-LTS上利用Ansible轻松部署MySQL 5.7

一、需求 使用ansible自动化部署mysql二进制部署mysql部署mysql并创建JDBC用户 二、环境信息 本文涉及的代码&#xff0c;配置文件地址&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;1g6y 软件名称版本备注Ansible2.9.27All modules — Ansible Doc…

使用GitHub Actions实现Git推送自动部署到服务器

将网站一键部署到服务器的方案很多&#xff0c;比如纯Shell脚本结合SSH、Jenkins等工具。本文将介绍如何利用GitHub Actions这一免费且轻量的CI/CD工具&#xff0c;实现代码推送后自动部署到云服务器。 之前一直在使用github的工作流&#xff0c;确实是一个比较好用的工具。 我…

网络安全 与 加密算法

计算机中的网络安全 在本篇中介绍了以下几个方面: 机密性 密码学 对称加密算法(DES, 3DES, AES) 公开秘钥算法 RSA大素数的获取 完整性 散列函数(MD5, SHA-1, 并没有提及算法实现) 报文鉴别(MAC) 数字签名 端点鉴别 应用 SSL(TCP网络安全) 运行时安全 防火墙的基本知…

DeepSeek-prompt指令-当DeepSeek答非所问,应该如何准确的表达我们的诉求?

当DeepSeek答非所问&#xff0c;应该如何准确的表达我们的诉求&#xff1f;不同使用场景如何向DeepSeek发问&#xff1f;是否有指令公式&#xff1f; 目录 1、 扮演专家型指令2、 知识蒸馏型指令3、 颗粒度调节型指令4、 时间轴推演型指令5、 极端测试型6、 逆向思维型指令7、…

定制开发开源 AI 智能名片 S2B2C 商城小程序源码在小程序直播营销中的应用与价值

摘要&#xff1a; 本文主要探讨了定制开发开源 AI 智能名片 S2B2C 商城小程序源码在小程序直播营销中的应用与价值。首先详细阐述了小程序直播的基本概念、特点、发展历程及营销意义&#xff0c;包括其便捷性、广泛的受众连接能力以及对企业推广的重要作用。接着深入剖析了定制…

蓝桥杯---链表题目1

文章目录 1.题目概述2.思路分析3.代码解析 1.题目概述 这个题目模拟的就是两个数字的求和&#xff1a;在这个过程中我们的每一个数字都是按照相反的这个顺序给出来的&#xff0c;例如254&#xff0c;在这个链表上面进行表示的时候就是452&#xff0c;这个是顺序的问题&#xf…

基于javaweb的SpringBoot杂物商城系统设计与实现(源码+文档+部署讲解)

技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、小程序、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;免费功能设计、开题报告、任务书、中期检查PPT、系统功能实现、代码编写、论文编写和辅导、论…

python编写的一个打砖块小游戏

游戏介绍 打砖块是一款经典的街机游戏&#xff0c;玩家控制底部的挡板&#xff0c;使球反弹以击碎上方的砖块。当球击中砖块时&#xff0c;砖块消失&#xff0c;球反弹&#xff1b;若球碰到挡板&#xff0c;则改变方向继续运动&#xff1b;若球掉出屏幕底部&#xff0c;玩家失…

Xxl-Job学习笔记

目录 概述 核心架构 核心特点 应用场景 什么是任务调度 快速入门 获取源码 初始化调度数据库 基本配置 数据源datasource 邮箱email&#xff08;可选&#xff09; 会话令牌access token 启动调度中心 启动执行器 依赖 yaml基本配置 XxlJobConfig类配置 定义执…

【Java--数据结构】优先级队列( PriorityQueue)

一. 优先级队列 1.1 优先级队列的概念 优先级队列是一种特殊的队列&#xff0c;它在入队时会根据元素的优先级进行排序&#xff0c;优先级最高的元素排在队列的前面&#xff0c;出队时会优先出队优先级最高的元素。 1.2 优先级队列的区别 &#xff08;1&#xff09;与普通…

【网络编程】HTTP网络编程

13.1 HTTP 简介 HTTP(Hyper Text Transfer Protocol,超文本传输协议)是用于从万维网(WWW:World Wide Web) 服务器(简称Web 服务器)传输超文本到本地浏览器的传送协议&#xff0c;基于TCP/IP 通信协 议来传递数据 (HTML 文件、图片文件、查询结果等)。 13.2 HTTP 的工作原理 …

前端(vue)学习笔记(CLASS 3):生命周期工程化开发入门

1、生命周期 Vue生命周期&#xff1a;一个Vue实例从创建到销毁的整个过程 生命周期四个阶段&#xff1a;创建、挂载、更新、销毁 1、创建阶段&#xff1a;响应式数据 2、挂载阶段&#xff1a;渲染模板 3、更新阶段&#xff1a;数据修改、更新视图&#xff08;执行多次&…