/ 币圈行情

从零开始,用Solidity在简书打造你的第一个以太坊DApp(保姆级教程)

发布时间:2026-02-07 12:51:41

你是否也曾幻想过,像写博客一样,轻松创建一个去中心化的应用(Dapp)?是否对以太坊的智能合约感到好奇,却又不知从何下手?我们就将结合大家熟悉的写作平台——简书,来一步步拆解,如何用以太坊技术栈,构建一个真正属于自己的DApp,本文将带你从概念走向实践,即使你是零基础小白,也能跟上步伐!

什么是DApp?为什么是“简书”式的DApp?

在传统互联网,我们的数据存储在中心化服务器上,平台拥有绝对控制权,而以太坊DApp,则构建在区块链之上,其核心逻辑和数据存储由智能合约(Smart Contract)管理,运行在去中心化的网络上,具有透明、不可篡改、用户自主掌控私钥等特点。

想象一个“简书”式的DApp,它会有什么不同?

  1. 真正的所有权:你发布的每一篇文章,都作为交易记录在以太坊上,任何人都无法单方面删除或修改。
  2. 无需信任平台:你不需要信任“简书”这个品牌,只需要信任公开、透明的智能合约代码,代码即法律。
  3. 通证激励:读者可以为你“点赞”,但这里的“赞”可以是一种加密货币,直接打赏到你的钱包,实现价值流转。

听起来是不是很酷?我们就动手实现一个简化版的“简书”DApp。

我们的“简书”DApp核心功能

为了不让大家陷入过于复杂的细节,我们设定一个最小可行产品(MVP)的目标:

  • 用户注册:用户通过以太坊钱包地址(如MetaMask)进行注册。
  • 发布文章:注册用户可以发布标题和内容。
  • 阅读文章:任何人都可以查看已发布的文章列表和内容。
  • 点赞打赏:读者可以为喜欢的文章进行点赞,并支付少量加密货币作为打赏。

技术栈一览:以太坊DApp的“全家桶”

一个完整的以太坊DApp通常由三部分组成:

  1. 智能合约(后端):运行在以太坊区块链上,定义了DApp的业务逻辑,我们将使用Solidity语言编写,并部署在以太坊测试网上。
  2. 前端界面(前端):用户与DApp交互的界面,我们可以用HTML, CSS, JavaScript来构建,为了方便,会使用一些Web3.js库来与区块链通信。
  3. 区块链网络:提供运行环境,我们使用以太坊测试网(如Ropsten或Goerli),这样我们可以免费测试,而不用花费真实的以太币。

实战第一步:编写智能合约(Solidity)

这是整个DApp的灵魂,我们使用Remix IDE(一个在线的Solidity开发环境)来编写合约。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract SimpleJianshu {
    // 定义文章结构体
    struct Article {
        uint id;
        address author;
        string title;
        string content;
        uint likes;
    }
    // 存储所有文章
    Article[] public articles;
    // 记录作者是否已注册
    mapping(address => bool) public registeredAuthors;
    // 事件,方便前端监听
    event ArticlePublished(uint id, address author, string title);
    event ArticleLiked(uint id, address liker);
    // 注册作者
    function registerAuthor() public {
        require(!registeredAuthors[msg.sender], "You are already registered.");
        registeredAuthors[msg.sender] = true;
    }
    // 发布文章
    function publishArticle(string memory _title, string memory _content) public {
        require(registeredAuthors[msg.sender], "You must be registered to publish.");
        uint id = articles.length;
        articles.push(Article(id, msg.sender, _title, _content, 0));
        emit ArticlePublished(id, msg.sender, _title);
    }
    // 获取文章数量
    function getArticlesCount() public view returns (uint) {
        return articles.length;
    }
    // 获取单篇文章详情
    function getArticle(uint _id) public view returns (address, string memory, string memory, uint) {
        Article storage article = articles[_id];
        return (article.author, article.title, article.content, article.likes);
    }
    // 点赞文章(需要支付1 wei的以太币作为打赏)
    function likeArticle(uint _id) public payable {
        require(msg.value == 1 wei, "Please send exactly 1 wei to like.");
        require(_id < articles.length, "Article does not exist.");
        articles[_id].likes  = 1;
        emit ArticleLiked(_id, msg.sender);
    }
}

代码解读

  • Article结构体:存储了文章的ID、作者地址、标题、内容和点赞数。
  • mapping(address => bool):用于快速判断一个钱包地址是否已经注册。
  • publishArticle:只有已注册的作者才能调用,将新文章添加到数组中。
  • likeArticle:任何人都可以调用,但必须支付1 wei(以太币的最小单位)的 gas 费,同时文章点赞数加一,这里我们简单地将打赏费包含在交易费中,更复杂的DApp会将打赏费转给作者。

实战第二步:构建前端界面

智能合约写好了,现在需要一个网页来调用它。

  1. 创建HTML文件:搭建一个简单的页面,包含注册、发布文章、文章列表等表单和区域。
  2. 引入Web3.js:在<head>中引入Web3.js库,用于与以太坊节点通信。
  3. 连接钱包:使用web3.eth.requestAccounts()请求用户授权连接他们的MetaMask钱包。
  4. 调用合约:连接成功后,将我们编译好的合约地址和ABI(应用程序二进制接口)传入,创建合约实例,然后就可以调用合约的函数了,
    • contract.methods.registerAuthor().send({from: userAccount}) 来注册。
    • contract.methods.publishArticle("我的标题", "我的内容").send({...}) 来发布。
    • contract.methods.getArticle(0).call() 来读取文章。

注:前端代码实现细节较多,此处为思路概述,完整代码可以另起一篇详细讲解。

部署与测试

  1. 编译合约:在Remix中点击“Compile”按钮,确保没有错误。
  2. 部署合约:切换到“Deploy”选项卡,选择“Remix VM (Shanghai)”——这是一个本地的模拟以太坊网络,非常适合快速测试,点击“Deploy”,你的第一个DApp后端就诞生了!
  3. 与前端交互:将部署好的合约地址复制到你的前端代码中,打开网页,连接MetaMask,你就可以开始体验这个“简书”DApp了!

总结与展望

恭喜你!你已经成功搭建了一个基于以太坊的、去中心化的“简书”雏形,这虽然只是一个简单的Demo,但它展示了DApp最核心的要素:去中心化的数据存储、基于智能合约的业务逻辑以及用户自主的钱包交互

你可以为它添加更多功能:

  • 评论系统:再创建一个评论合约。
  • 付费阅读:在publishArticle函数中加入价格参数。
  • 前端美化:使用React或Vue等现代框架,打造更优雅的用户界面。
  • 真实网络部署:将合约部署到以太坊主网,并使用Infura等节点服务。

免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。

如有疑问请发送邮件至:bangqikeconnect@gmail.com