月亮链 月亮链
Ctrl+D收藏月亮链
首页 > 火必下载 > 正文

OST:还记得当年的百度贴吧吗? 今天有人写了一个去中心化的..._POS

作者:

时间:1900/1/1 0:00:00

今天科技圈最大的新闻莫过于百度李彦宏被“浇水”一事了,微博、微信、今日头条可谓是炸开了锅,但想想要是10年前,讨论最火的地方可能不是这些app,无疑是百度贴吧了,但可能却面临删帖的危险...

这时,区块链的不可篡改行就帮上了大忙!

今天营长就使用DApp开发框架Embark,手把手教你构建一个去中心化的社交新闻网站,从主要分以下三个部分:

明确DApp需求,部署智能合约;

使用DApp开发框架Embark的JavaScript程序库EmbarkJS测试智能合约;

使用JavaScript用户界面框架React构建DApp的前端。

明确DApp需求,部署智能合约。

百度贴吧是一个功能非常复杂的平台,因此我们无法做到把它全部推倒重建,我们只会构建出百度贴吧的一些核心功能,并在构建中详细介绍如何使用Embark框架构建DApp。

我们的构想非常简单:首先我们给DApp取名为DReddit(去中心化的百度贴吧),它允许用户在其中发布帖子,而其他用户可以凭兴趣以及帖子的质量对帖子进行好评和差评的投票。为了简化开发,DReddit直接使用以太坊钱包账户作为用户帐户,也就是说每个以太坊钱包账户都是该应用程序的有效帐户,用户可以使用基于浏览器的以太坊轻钱包Metamask等扩展程序进行身份认证。

我们将创建一个智能合约来实现发布帖子以及对帖子投票的功能。同时为了简化用户的交互过程,我们还会使用React框架构建一个用户界面。

1、应用程序设置

首先,安装Embark框架,命令如下:

npminstall-gembark

使用new命令来创建并设置应用程序:

embarknewdredditcddreddit

使用cd命令进入文件夹之后,我们可以看到应用程序的文件结构,在其中最重要的文件夹是用来存放智能合约的contracts,以及用来存放前端程序的app。

火币宣布上线PENDLE (Pendle) 其充币业务已开放:据官方消息,火币宣布上线PENDLE,其充币业务于07月03日16时(GMT+8) 开放;PENDLE的币币交易(PENDLE/USDT)于今日17时(GMT+8)开放。公告显示,其提币业务将于07月04日17时(GMT+8)开放。

Pendle是一个无需许可(permissionless)的收益率交易协议,用户可以执行各种收益率管理策略。作为一个利率衍生品协议,Pendle将传统金融的利率衍生品市场引入到DeFi中,释放了收益率的全部潜力,使用户能够执行高级收益率策略。[2023/7/3 22:15:09]

2、创建智能合约

使用Solidity语言编写智能合约,在其中加入创建帖子功能和投票功能。

在contracts文件夹下创建智能合约文件DReddit

上述结构体只能用来存储单个帖子,在多个帖子场景中,我们需要添加一个数组来存储多个帖子结构体,代码如下:

Postpublicposts;

a)新建帖子

创建函数createPost,其中参数_description是用来表示帖子内容的字节型数据。

functioncreatePost(bytes_description)public{uintpostId=posts

在函数中,我们为存储的帖子创建一个序号id,然后使用刚刚定义的帖子结构体Post创建一个新的实例。

b)发布帖子

创建一个新的事件类型NewPost,代码如下:

eventNewPost(uintindexedpostId,addressowner,bytesdescription)

定义完成后,在新建帖子函数createPost中使用所需的数据执行NewPost:

functioncreatePost(bytes_description)public{..

CFTC前主席指控SEC在Coinbase诉讼时机上故意采取行动:金色财经报道,CFTC前主席Chris Giancarlo周四表示,在Coinbase首席法律官准备在国会作证前几个小时,SEC对其提出指控似乎是故意的。从他领导联邦机构的经验来看,此举似乎是“经过深思熟虑的”。当被问及众议院监管加密货币浮动的各种法案时,Giancarlo称,这些法案今年很有可能在众议院获得通过,”吉安卡洛说。他对参议院通过一项法案并不乐观。[2023/6/23 21:55:42]

c)好评/差评

DReddit允许用户对帖子进行好评差评投票。为实现这一功能,我们需要使用投票计数器来扩展之前定义的帖子结构体Post,并引入一个代表投票类型的枚举结构。为了方便前端应用程序调用,我们需要添加一个新建投票事件NewVote。完成后,我们还需要添加一个用来执行投票的方法。

首先,定义一个表示投票种类的枚举类型Ballot,其中可选的投票类型包括好评UPVOTE、差评DOWNVOTE、不投票NONE:

enumBallot{NONE,UPVOTE,DOWNVOTE}

为存储每个帖子中的投票纪录,我们需要在帖子结构体Post中相应地加入“好评”投票计数器和“差评”投票计数器。为确保用户不会重复投票,我们还需要添加一个用来存储所有已投票用户以及投票的映射:

structPost{..

现在的新建投票事件NewVote应该如下所示:

eventNewVote(uintindexedpostId,addressowner,uint8vote);

由于帖子结构体Post中加入了投票计数器,需要用新的结构体更新createPost():

functioncreatePost(bytes_description)public{..

现在万事俱备,只欠投票函数vote()了!!!

Pepe的社交参与度在过去一周下降了31.5%:金色财经报道,根据Lunar Crush的数据,Pepe 的社交参与度在过去一周下降了 31.5%。此外,相对于其价格,自5月5日达到最高点以来,社交参与度一直低于其价格。加密货币交易商CryptoMichNL在Twitter上最近的一项技术分析指出,每一个阻力位都是做空的机会。根据分析,Pepe的最终价格目标为0.00000085美元,较当前价格下跌40%左右。[2023/5/29 9:47:34]

函数的参数_vote就是我们刚刚定义的投票枚举类型Ballot,它的取值为0、1、2这三个无符号整数,分别对应三种类型的投票。

使用Solidity的require()语句确保用户只能对实际存在的帖子进行投票及用户不能对同一个帖子多次投票。

在函数中,我们用当前的投票类型更新“好评”投票计数器或“差评”投票计数器,存储已投票用户的信息并发出新建投票事件NewVote:

functionvote(uint_postId,uint8_vote)public{Poststoragepost=posts;require(post

else{post

post

d)判断用户是否可以投票

在前端中,我们希望向用户展示自己是否已经对帖子进行了投票。为此,定义一个可以判断用户能否对帖子投票的API将大大简化这个过程。判断用户是否可以投票的过程非常简单,只需要判断该帖子中是否存在该用户的投票,判断代码如下:

functioncanVote(uint_postId)publicviewreturns(bool){if(_postId>posts

e)获取投票信息

如果你想浏览自己过去的投票信息怎么办?很简单,一个简单的函数getVote()就可以实现,代码如下:

functiongetVote(uint_postId)publicviewreturns(uint8){Poststoragepost=posts;returnuint8(post

分析:2023年全球经济衰退的高风险可能会影响加密市场:1月17日消息,根据世界经济论坛(WEF)1月16日发布的一份报告,国际货币基金组织(IMF)预计,全球约三分之一的经济将在2023年陷入衰退,全球增长前景依然疲弱,全球衰退风险很高。该报告补充说,到2023年初,企业将面临“三重挑战”。关键投入价格高企,货币政策收紧,需求疲软,这些都将抑制经济复苏。

首席经济学家还认为,员工短缺、人才可用性和大幅削减成本也是因素之一。这一切都对底层的零售消费者产生了涓滴效应。此外,美国储蓄率已降至历史最低水平2.3%左右(该指标是用来衡量一个人从可支配收入中扣除用于投资的金额)。

分析称,这可能会对通常被认为高风险的加密资产产生重大影响。如果可支配收入减少,加密货币等风险资产的投资者就会减少。经济衰退可能会进一步影响这一点,因为可能只有富人才有能力涉足高风险的加密投资。(Crypto Potato)[2023/1/17 11:16:43]

到这里,部署智能合约大功告成!

使用EmbarkJS测试智能合约

前面已经部署了DReddit智能合约,并在智能合约中实现了发布帖子和给帖子投票的功能,接下来就需要使用Embark框架为智能合约编写一些测试。

1、编写第一个测试

先从最简单的功能开始测试。

首先,我们需要在测试文件夹test中创建一个测试文件DReddit_spec

);});

运行测试命令embarktest,输出如下:

所有测试都成功通过,接下来测试一些实际的功能!

2、测试帖子的创建过程

测试创建帖子:首先以某种方式在JavaScript中导入DReddit智能合约的实例,然后调用智能合约中的各个方法测试它们能否正常工作,同时我们还需要配置测试环境来正确创建智能合约的实例。

a)导入智能合约实例

法国央行行长希望在MiCA标准之前推出加密许可制度:金色财经报道,法国央行行长Francois Villeroy de Galhau正在敦促对法国的加密公司提出更严格的监管要求。这将领先于欧盟具有里程碑意义的加密资产市场 (MiCA) 法规,该法规将为加密公司建立一个欧盟范围内的许可制度,并计划于2月投票表决,并于2024年实施。

目前在法国没有数字资产服务提供商 (DASP) 获得加密许可证。大约60家公司确实获得了法国市场管理局AMF不那么严格的“注册”称号。Villeroy周四在巴黎的一次演讲中表示,目前加密货币市场的动荡表明法国需要许可要求。2022年的所有混乱都助长了一个简单的信念:法国希望尽快转向DASP的强制性许可,而不仅仅是注册。[2023/1/6 10:24:35]

在运行测试时,Embark框架会在全局范围加入一些必要的自定义函数和对象。其中一个就是自定义获取函数require(),它可以帮助我们从特定的Embark路径中导入智能合约实例。

就比如说,为了在测试中导入DReddit智能合约的实例,我们需要在spec文件中添加如下的命令:

constDReddit=require('Embark/contracts/DReddit');

DReddit现在被指定为一个EmbarkJS的智能合约实例,我们需要使用设置函数config()让Embark框架知道,我们需要的智能合约都有哪些。设置函数config(),以便Embark框架知道我们需要哪些智能合约:

config({contracts:{DReddit:{}}});

这个操作与配置智能合约的操作非常相似,实际上它就相当于在测试环境中配置智能合约。我们将所需的智能合约作为参数,通过配置对象将它传递给设置函数config()。在我们这个应用程序中,需要设置的参数只有DReddit,这是因为我们的智能合约并不需要构造函数。

b)测试创建帖子函数createPost()

导入好智能合约实例之后,我们就可以测试智能合约的创建帖子函数createPost()了。不过在定义createPost函数时,我们指定了帖子的描述为字节形式,如何测试呢?

首先我们需要说明的是为什么要用字节形式的数据。我们都知道,帖子的长短不好控制,有些帖子很长,有些帖子很短,所以最好的方案就是将帖子的描述(内容)存储在一个并不在意数据大小的地方,而在智能合约之中存储的只是帖子描述的哈希值。通过使用哈希值我们可以保证数据的索引与数据一一对应,同时智能合约中存储的数据索引始终具有相同的长度,所以我们将帖子真正的描述存储在IPFS中,而创建帖子函数createPost中的帖子描述实际上是帖子描述的IPFS哈希值。

在得到帖子描述的哈希值后(代码中选用之前准备好的哈希值),我们可以使用Web3程序库的fromAscii()工具函数将该哈希值转换为字节,然后使用智能合约的创建帖子函数createPost将它发送出去。在测试时,我们可以检索刚才发出的事件,并检查它的返回值,这些操作的代码如下所示:

..

);});

运行测试命令embarktest,两条测试都测试通过!

3、测试数据的正确性

需要测试的另外一个功能是,存储的数据(帖子的描述,所有者)是否能解析回正确的数据。这就要用到先前定义的全局可见的帖子序号postId。我们还需要执行与先前测试类似的检查,如果要测试帖子的所有者数据是否正确,我们首先需要访问创建帖子的帐户。

Embark框架的设置函数config可以让我们轻松地访问钱包帐户,我们所要做的就是将一个解析处理程序加入到设置函数config中并存储传递的值:

..

);

完成了操作后,测试代码如下:

it('postshouldhavecorrectdata',async()=>{constpost=awaitDReddit

);

注意到,代码中引用了帐户accounts,但仅仅通过查看代码,我们无法确定账户account是否是我们指定的那个账户。而Embark框架可以帮助我们解决这个问题,在设置完帐户后,Embark框架会自动将钱包的第一个帐户(accounts)设置为用于发起交易的默认帐户。这种特性让我们可以确定,账户accounts会是帖子的所有者。

另一种方法是将所有帐户发送给智能合约的send()函数,在这种情况下,我们可以决定使用哪个账户发起交易。

4、测试能否投票函数canVote()

接下来我们来测试能否投票函数canVote()是否按预期的方式工作。很简单,用户不能给不存在的帖子投票,因此测试只需要用能否投票函数判断不存在的帖子序号postId。测试代码如下:

it('shouldnotbeabletovoteinanunexistingpost',async()=>{constuserCanVote=awaitDReddit

);

不过,当用户确实可以给某个帖子投票时,我们要确保能否投票函数canVote()的返回值是能true,我们需要用该函数来判断之前存储的帖子序号postId:

it('shouldbeabletovoteinapostifaccounthasnotvotedbefore',async()=>{constuserCanVote=awaitDReddit

);

很棒,我们现在完成了5个测试!

5、测试投票函数vote()

投票功能可谓是我们应用程序的核心功能,因而对它的测试是重中之重。我们有许多种不同的方法验证投票函数vote()的功能是否符合预期,但在本教程中,我们只检查新建投票事件NewVote发出投票的所有者帐户是否与真正执行投票的帐户相同,在代码实现中我们可以借鉴先前的测试:

it("shouldbeabletovoteinapost",async()=>{constreceipt=awaitDReddit

);

5、测试每个用户每个帖子只能投一票

在智能合约定义中,我们设置了每个用户对每个帖子只能投一票,因而最后一个也是最必要的一个测试就是检查智能合约是否允许用户在同一帖子上多次投票。这个测试中我们又用到了async/await异步操作的方法,同时还用到了try/catch来更好地进行测试。当用户对一个已经投过票的帖子再次进行投票时,投票函数vote()将执行失败,这个操作我们可以使用断言(assert)方法来实现:

it('shouldnotbeabletovotetwice',async()=>{try{constreceipt=awaitDReddit

catch(error){assert(error

});

代码看起来可能会让你有些困惑,但实际上它的逻辑非常直接。如果投票函数vote()执行失败,我们不应该调用函数assert.fail(),而应该立即进入catch()部分。如果结果不是这样,那么就说明测试发现了问题,这种测试方法其实就是大名鼎鼎的负向(Negative)测试。

到这里,也就是我们最后一次运行embarktest进行测试了,如果一切正常的话,测试的输出应该如下所示,也就是说,我们已经完全覆盖了所有的测试!快为自己点个赞!

?embarktestCompilingcontractsDReddit?shouldwork(0ms)-?shouldbeabletocreateapostandreceiveitviacontractevent(60ms)-?postshouldhavecorrectdata(18ms)-?shouldnotbeabletovoteinanunexistingpost(14ms)-?shouldbeabletovoteinapostifaccounthasn'tvotedbefore(12ms)-?shouldbeabletovoteinapost(42ms)-?shouldn'tbeabletovotetwice(37ms)-7passing(5s)->Alltestspassed

由于下一部分篇幅过长,我们将在下一篇文章中介绍如何使用React框架作为客户端前端JavaScript库来构建DReddit前端界面。主要包括以下5部分:

渲染组件

构建创建帖子组件CreatePost

构建帖子组件Post

构建帖子列表组件List

添加投票功能

老铁们,敬请期待

标签:OSTPOSTPOSVOTiost币值得长期持有吗SafePostpos币种VOTE价格

火必下载热门资讯
BIX:Bibox首期通证债券年化收益率超266% 未来重点聚焦“BIX通证经济改革”_IBOX

Bibox首期通证债券已于北京时间2019年7月3日到期,并停止交易。平台已完成本息发放,用户可在“资产管理-我的钱包-我的账单”中查看明细.

1900/1/1 0:00:00
TOKEN:8BTCCI与8BTCVI齐回落,主力再探有效支撑位,短期延续震荡调整_TOK

截至07月02日10时,8BTCCI指数报16565.73点,远高于纳斯达克综合指数,自发布日起全球Token市场表现好于证券市场表现.

1900/1/1 0:00:00
THE:BCAC official announced holdings of HCP announcement_UPCOIN

DearHCoinusers,BCACteamfirmlyonHCOINplatformandHCPpointcardtokens.

1900/1/1 0:00:00
比特币:速览一周加密热点和好文:Edgeware 修复致命漏洞,Dash 激活 51% 攻击防护_比特币中国禁止后怎么提现

Edgeware被爆有致命漏洞,9亿美元的锁定资金还安全吗?原文标题:《Edgeware被爆有致命漏洞.

1900/1/1 0:00:00
LIB:观点 | 巨头入场 超级产业牛或正在路上_数字货币害了多少人

数字货币的每一轮牛市,都有一个主题。这个主题,往往都是在牛市发生之后,人们才能够总结提炼出来。例如,在2017年年底前,谁也没料到本轮牛市的主题竟然是由以太坊引发的ICO.

1900/1/1 0:00:00
BTC:多空激战10000刀,最后的上车机会?_ETH

市场主力继续回调探底,多空对决有所缓和,短时大概率继续盘整且有反弹需要,短期下行空间不大。从历史表现来看,加密资产长期的上涨趋势未改,短期还需继续观察:BTC和ETH是调整后缓慢上行还是快速回调.

1900/1/1 0:00:00