基于以太坊智能合约的去中心化匿名论坛系统的设计与实现

2023-07-10 09:29曾一洪阙培斯高飞
电脑知识与技术 2023年14期
关键词:智能合约去中心化

曾一洪 阙培斯 高飞 

关键词:论坛系统;去中心化;以太坊;智能合约

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2023)14-0012-03

0 引言

以太坊智能合约是一种运行在以太坊区块链上的程序,它可以定义和执行合约的规则,可被区块链上的交易所触发,在满足触发条件的情况下这段代码可以从区块链上读取数据或者向区块链上写入数据[1],无须信任协议或中介机构。以太坊智能合约的特点是透明、安全和不可篡改,因为它们的代码和数据都存储在去中心化的网络上,由所有节点共同验证和执行。区块链匿名性是指区块链上的交易参与者可以隐藏或保护他们的真实身份,只使用加密的地址或伪名进行交易。匿名性是数字货币的重要属性之一,旨在保护用户的身份信息,隐藏用户与交易地址之间的关联关系,用户在参与数字货币交易的过程中,无须暴露姓名、身份证号等真实的身份信息,而是将系统生成的假名地址作为交易时的身份标识[2],防止被追踪或审查。用户可以通过智能合约创建和管理自己的数字身份,选择性地向第三方提供必要的信息,而不是全部暴露。以太坊智能合约和区块链匿名性的结合为用户提供了更多的自主权、隐私权和信任度,是区块链技术发展的重要方向之一。

随着Web3.0时代的到来,去中心化应用(DApp)开始受到越来越多的关注和尝试。去中心化应用是运行在分布式网络上,无须信任协议,参与者的信息被安全保护或匿名的应用。它们与传统的中心化应用相比,有着更高的透明度、安全性和自主性。去中心化应用的后端代码(即智能合约)运行在一个去中心化的网络上,如以太坊,而非中心化的服务器。它们使用以太坊区块链网络作为数据存储端,使用智能合约负责操作逻辑和数据存储,并通过交易与DApp前端或多个智能合约进行交互[3]。去中心化应用的前沿领域包括去中心化金融(DeFi)、艺术品和收藏品、游戏、科技等。这些领域都有着巨大的创新潜力和社会价值,为用户提供了更多的选择。

由于以太坊智能合约本质上是一段程序,由一门针对区块链运行环境而设计的程序语言编写,运行在栈式的以太坊虚拟机中[4],所以智能合约同样存在安全问题。为了提升系统的安全性,本文基于以太坊智能合约平台,使用了Vyper进行智能合约开发,Vyper 是一种运行在以太坊虚拟机上的智能合约编程语言,它的设计目标是安全、简单、易审计,为了提高智能合约的安全性,它会故意禁止一些事情甚至使得某些需求变得更难实现。与主流的智能合约编程语言Solidi?ty相比,两者有着如下区别(见表1)。

本项目使用了Brownie智能合约开发框架对智能合约进行开发和管理,Brownie是一种基于Python的以太坊智能合约开发框架,它提供了一系列的工具和库,方便开发者编译、部署、测试和调试智能合约;系统前端采用的是Vue框架,Vue通过MVVM模式将代码拆分为视图和数据两部分,开发者只需要关注数据即可,视图部分会根据数据的变化自动响应更新[5];在Vue中引入了ethers.js库以便前端能够直接与以太坊上的智能合约进行交互,同时也引入了axios库来实现上传图片到IPFS分布式文件系统;为了更加有效率地开发和测试论坛的各项功能,使用了Ganache以太坊开发环境作为论坛系统的开发和测试环境,模拟了真实的以太坊网络行为和状态。

1 系统设计

论坛是用于交流观点、分享经验、讨论话题的网络平台,论坛核心的“三要素”是发送帖子、浏览帖子、回复帖子[6]。本论坛系统与传统论坛系统的区别在于,它利用以太坊区块链上的智能合约作为后端逻辑,以及使用IPFS分布式存储,IPFS 可以使Web 内容的分发方式发生改变,实现去中心化的特性[7];此外,本系统取消了传统论坛的注册和登录功能,使得任何人都可以浏览帖子,只有在发帖和评论这类需要改变智能合约状态的情况,届时才会唤起MetaMask錢包支付gas费。

本系统主要由四个功能模块组成,分别是帖子列表模块、发布帖子模块、帖子详情模块、帖子评论模块。每个模块会同时涉及智能合约部分和前端部分。

1.1 帖子列表模块

本模块负责在首页展示已发布的帖子列表,并按照发布时间降序排列,即最新发布的帖子显示在最前面。由于从链上的智能合约查询帖子列表需要一定时间,所以在查询过程中,首页应显示“正在加载帖子”,如果查询结果为空,即没有任何帖子时,首页则应显示“目前暂无帖子”。如果帖子数量过多,超出一页的显示范围,则会启用分页功能,方便用户浏览不同页码的帖子。本模块的程序流程图如图1所示。

1.2 发布帖子模块

本模块负责实现发布帖子,用户可以在页面填入帖子的标题、内容、图片,点击发布按钮后,前端页面会调用MetaMask钱包支付gas费,并将用户刚发布的帖子信息写入链上的智能合约,然后自动跳转到首页,用户可以看到刚刚发布的帖子显示在首页。本模块的时序图如图2所示。

1.3 帖子详情模块

本模块负责帖子的详情页,用户可以在该页面查看帖子的详细信息,包括标题、内容、图片、评论。前端页面通过获取首页路由传递的帖子ID,从链上的智能合约查询该ID对应的帖子信息,并展示在页面上。

1.4 帖子评论模块

本模块负责实现评论功能,用户可以在帖子详情页面的下方输入评论内容,并点击发送按钮提交评论。前端页面会调用MetaMask钱包支付gas费,将评论内容写入链上的智能合约,并关联到相应的帖子。然后页面会自动刷新,显示最新的评论列表。

2 系统实现

2.1 智能合约

本系统使用Vyper语言编写智能合约,首先定义了一个名为post_struct的结构体,用于表示一个帖子的信息,包括帖子标题、帖子内容、帖子位置(帖子ID)、帖子发布时间、图片哈希值(图片CID)、评论数组和评论位置,post_struct中的变量见表2。

合约中还设计了一个名为post_title_struct的结构体,表示一个帖子的标题信息,包括帖子标题、帖子位置和帖子发布时间,便于在查询帖子标题列表时,返回以该结构体为元素的数组。合约中设计了两个变量,分别是posts和post_sign,posts是一个长度为100 的post_struct数组,表示所有的帖子。post_sign是一个uint8类型的变量,用于记录帖子存放的位置。合约中设计了四个函数,分别为publish_post、pub?lish_comment、get_posts_titles、get_post_object。pub?lish_post函数是发布帖子时需要调用的函数,接收的参数为帖子的标题、内容、发布时间戳和图片哈希值,该函数将这些信息存储在posts 数组中,并更新post_sign,如果posts数组已满,则覆盖最旧的帖子,并将post_sign设置为0。publish_comment函数是发布评论时需要调用的函数,接收的参数为评论内容和对应的帖子位置,该函数将评论内容追加到posts数组里对应帖子的评论数组中,并更新评论位置。如果评论数组已满,则抛出异常。get_posts_titles函数是查询合约中所有帖子的标題时需要调用的函数,它会返回一个长度为100的post_title_struct数组,表示所有帖子的标题信息。get_post_object函数是查询指定帖子的详情信息,接收的参数为帖子位置,返回该位置所对应的帖子的标题、内容、图片哈希值以及该帖子下的评论。

2.2 前端页面

前端使用的是Vue框架,主要使用的Node.js依赖包见表3。

Vue使用的是组件化的开发,本系统主要包含5 个组件,分别为App.vue、Header.vue、HomeView.vue、PublishView.vue、PostView.vue。

1)App.vue:根组件,负责加载整个应用的页面。里面仅包含两个子组件,一个是Header组件,另一个是RouterView组件。Header组件即为页头。Router?View组件是路由库提供的路由组件,用于根据不同的URL显示不同的子组件,如HomeView组件、Publish?View组件和PostView组件。

2)Header.vue:页头组件,组件包含两个按钮,分别为首页和发帖。点击首页按钮会跳转路由到Hom?eView组件,显示帖子列表。点击发帖按钮会跳转路由到PublishView组件,进入发布帖子的页面。

3)HomeView.vue:首页组件,用于展示帖子标题列表。组件挂载完毕后,前端页面会调用ethers.js库来查询智能合约上的帖子列表数据,并将查到的帖子列表按照时间倒序展示到页面。如果帖子数量超过十个,超出一页的显示范围,则会启用分页功能。用户可以点击帖子标题跳转到PostView组件,查看帖子详情,该组件实现的页面效果如图3所示。

4)PublishView.vue:发布帖子组件,在页头点击发帖即可跳转到该组件,在该组件渲染的页面中,可以填写帖子标题、帖子内容以及上传图片进行发帖。上传的图片会通过axios 库上传到IPFS 分布式文件系统,并返回一个唯一的IPFS哈希值作为图片的标识符。帖子发布成功后,会跳转到HomeView组件,将刚发布的帖子标题展示到首页的最上方。该组件实现的页面效果如图4所示。

5)PostView.vue帖子详情组件,在该组件渲染的页面中,会显示当前帖子的标题、内容、图片以及评论列表。用户还可以在评论框中输入自己的评论,并点击发送按钮来发表评论。该组件实现的页面效果如图5 所示。

3 结束语

本文完成了一个基于以太坊智能合约的去中心化匿名论坛系统①,旨在为用户提供一个自由、安全、隐私的在线交流平台。用户无须注册账号,即可在论坛上发布和浏览帖子,且不会暴露身份信息。用户的每一次发帖或评论都会通过智能合约记录在区块链上,保证了数据的不可篡改和透明性。前端页面及帖子图片都存储在IPFS分布式文件系统上,保证了数据的持久性和可访问性。本系统展示了区块链技术和分布式存储技术在社交领域的应用价值,为未来去中心化社交网络提供了参考和启示。

猜你喜欢
智能合约去中心化
农产品供应链金融信用体系框架设计
区块链技术在互联网保险行业的应用探讨
一种去中心化的网络域名服务系统模型
“去中心化”电子商务背景下大学生网络创业前景分析