Web3 初学者的第一个实战项目:留言上链 DApp

目录

[📌 项目简介:留言上链 DApp(MessageBoard DApp)](#📌 项目简介:留言上链 DApp(MessageBoard DApp))

[🧠 技术栈](#🧠 技术栈)

[🔶 1. Solidity 智能合约代码(MessageBoard.sol)](#🔶 1. Solidity 智能合约代码(MessageBoard.sol))

[🔷 2. 前端代码(index.html + script.js)](#🔷 2. 前端代码(index.html + script.js))

[📄 index.html](#📄 index.html)

[📜 script.js](#📜 script.js)

[💅 style.css](#💅 style.css)

[🧪 测试建议](#🧪 测试建议)


📌 项目简介:留言上链 DApp(MessageBoard DApp)

  • 用户可以输入留言,点击按钮后信息将上链保存。

  • 展示所有用户的留言。

  • 使用以太坊测试网部署合约。


🧠 技术栈

  • Solidity(智能合约)

  • Ethers.js(前端与链交互)

  • HTML/CSS/JS(简单前端)

  • Remix + Metamask + 测试网(部署)

🔶 1. Solidity 智能合约代码(MessageBoard.sol)

bash 复制代码
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;

contract MessageBoard {
    struct Message {
        address sender;
        string content;
        uint256 timestamp;
    }

    Message[] public messages;

    event NewMessage(address indexed sender, string content, uint256 timestamp);

    function postMessage(string calldata _content) public {
        messages.push(Message(msg.sender, _content, block.timestamp));
        emit NewMessage(msg.sender, _content, block.timestamp);
    }

    function getMessages() public view returns (Message[] memory) {
        return messages;
    }

    function getMessageCount() public view returns (uint256) {
        return messages.length;
    }
}

部署提示:使用 Remix IDE,连接 Metamask 钱包选择测试网(如 Sepolia),部署后复制合约地址。

🔷 2. 前端代码(index.html + script.js)

📄 index.html
html 复制代码
<!DOCTYPE html>
<html lang="zh">
<head>
  <meta charset="UTF-8" />
  <title>留言上链 DApp</title>
  <script src="https://cdn.jsdelivr.net/npm/ethers/dist/ethers.min.js"></script>
  <link rel="stylesheet" href="style.css" />
</head>
<body>
  <h1>留言上链 DApp</h1>
  <textarea id="messageInput" placeholder="请输入留言内容"></textarea><br />
  <button onclick="postMessage()">发送留言</button>
  <button onclick="loadMessages()">刷新留言</button>
  <div id="messageList"></div>

  <script src="script.js"></script>
</body>
</html>
📜 script.js
javascript 复制代码
const contractAddress = "你的合约地址";
const contractABI = [
  // 仅保留必要的 ABI 函数
  "function postMessage(string _content)",
  "function getMessages() view returns (tuple(address sender, string content, uint256 timestamp)[])"
];

let provider, signer, contract;

async function init() {
  if (typeof window.ethereum !== 'undefined') {
    provider = new ethers.providers.Web3Provider(window.ethereum);
    await provider.send("eth_requestAccounts", []);
    signer = provider.getSigner();
    contract = new ethers.Contract(contractAddress, contractABI, signer);
    loadMessages();
  } else {
    alert("请安装 Metamask 插件");
  }
}

async function postMessage() {
  const message = document.getElementById("messageInput").value;
  if (!message) return alert("请输入内容");
  const tx = await contract.postMessage(message);
  await tx.wait();
  alert("留言已上链!");
  loadMessages();
}

async function loadMessages() {
  const messages = await contract.getMessages();
  const list = document.getElementById("messageList");
  list.innerHTML = "";
  messages.forEach((msg) => {
    const div = document.createElement("div");
    const time = new Date(msg.timestamp * 1000).toLocaleString();
    div.innerText = `🗨️ ${msg.content}\n👤 ${msg.sender}\n🕒 ${time}`;
    div.style.margin = "12px";
    list.appendChild(div);
  });
}

window.onload = init;
💅 style.css
javascript 复制代码
body {
  font-family: sans-serif;
  max-width: 600px;
  margin: 0 auto;
  padding: 20px;
}
textarea {
  width: 100%;
  height: 80px;
  margin-bottom: 10px;
}
button {
  margin-right: 10px;
}

🧪 测试建议

  1. 用 Remix 部署合约到 Sepolia 测试网。

  2. 在前端代码中替换 contractAddress

  3. 用浏览器打开 index.html 文件(确保开启 Metamask)。

  4. 输入留言并发送,刷新查看链上内容。

相关推荐
TechubNews4 小时前
Base 发布首个独立 OP Stack 框架的网络升级 Azul,将是 L2 自主迭代的开端?
大数据·网络·人工智能·区块链·能源
zimoyin9 小时前
Web Components 介绍与推荐三款框架
web3·html5
xiaohuoji12910 小时前
震荡行情下的自动化交易:从架构视角看高抛低吸工具选型
架构·自动化·区块链
blockcoach14 小时前
刘教链|比特币的马奇诺防线:从减半失灵到幂律大考
区块链
Yyyyy123jsjs14 小时前
找到了美股数据中Tick级别每笔成交的稳定来源
区块链
好家伙VCC14 小时前
**发散创新:基于Solidity的通证经济模型设计与智能合约实现**在区块链技术日益成熟的今天,**通证经济(Token Econo
java·python·区块链·智能合约
TechubNews1 天前
The Rollup 对话 Dragonfly 合伙人 Rob Hadick:危机周末后,DeFi 的未来将走向何方?
区块链
AILabNotes1 天前
019、未来展望:IPFS、暗网与去中心化互联网的融合趋势
去中心化·区块链
木西1 天前
企业级 AI 智能账户:基于 ERC-4337 的权限分级与动态风控实践
web3·智能合约·solidity
Wenzar_2 天前
**元宇宙经济中的智能合约与数字资产:基于Solidity的NFT交易平台开发实践**随着元宇宙概念持续升
java·python·区块链·智能合约