你是否也曾幻想过,像写博客一样,轻松创建一个去中心化的应用(Dapp)?是否对以太坊的智能合约感到好奇,却又不知从何下手?我们就将结合大家熟悉的写作平台——简书,来一步步拆解,如何用以太坊技术栈,构建一个真正属于自己的DApp,本文将带你从概念走向实践,即使你是零基础小白,也能跟上步伐!
在传统互联网,我们的数据存储在中心化服务器上,平台拥有绝对控制权,而以太坊DApp,则构建在区块链之上,其核心逻辑和数据存储由智能合约(Smart Contract)管理,运行在去中心化的网络上,具有透明、不可篡改、用户自主掌控私钥等特点。
想象一个“简书”式的DApp,它会有什么不同?
听起来是不是很酷?我们就动手实现一个简化版的“简书”DApp。


为了不让大家陷入过于复杂的细节,我们设定一个最小可行产品(MVP)的目标:
一个完整的以太坊DApp通常由三部分组成:
这是整个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会将打赏费转给作者。智能合约写好了,现在需要一个网页来调用它。
<head>中引入Web3.js库,用于与以太坊节点通信。web3.eth.requestAccounts()请求用户授权连接他们的MetaMask钱包。contract.methods.registerAuthor().send({from: userAccount}) 来注册。contract.methods.publishArticle("我的标题", "我的内容").send({...}) 来发布。contract.methods.getArticle(0).call() 来读取文章。(注:前端代码实现细节较多,此处为思路概述,完整代码可以另起一篇详细讲解。)
恭喜你!你已经成功搭建了一个基于以太坊的、去中心化的“简书”雏形,这虽然只是一个简单的Demo,但它展示了DApp最核心的要素:去中心化的数据存储、基于智能合约的业务逻辑以及用户自主的钱包交互。
你可以为它添加更多功能:
publishArticle函数中加入价格参数。免责声明:本文为转载,非本网原创内容,不代表本网观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
如有疑问请发送邮件至:bangqikeconnect@gmail.com