查看原文
其他

Blockstack Dev 讨论 | 提升 DApp 用户体验

一块链习 一块Plus社区 2020-11-11

一块链习是首家区块链技术学习社区,提供最系统的区块链技术课程学习,定期出品有深度的技术观察 + 评论。


《 Blockstack 从开发入门到技术实战》 是一块链习联合 Blockstack 中国技术社区负责人、底层代码贡献者 Gavin 老师共同打造的全球首个 Blockstack 开发课程。



目前第一期课程已经进行到第三周,同学们会在班级群讨论学习中遇到的难题或不解。另外每周六晚 8 点,都会进行课程内容知识拓展——作业点评会和在线答疑。

现在将第二周班级群日常优质的讨论内容和吴逸飞助教对第 三 课的作业点评分享给大家。


Q&A


01

Real : 高老师能介绍一下开发调试的技巧吗?
 
Gavin 老师:我能想到的是,如果想开发一个Blockstack项目的话,你先要根据自己对于项目的理解想清楚数据流,包括数据加密的关键节点。
 
数据流包括文件的存储方式(明文或加密)、文件结构(单文件还是多文件)。身份授权Blockstack已经剥离得很清楚了,所以不用太过于操心这块。
 
项目设计随着大家对于Blockstack技术栈底层的了解会越来越清晰,这个也是我让大家在第二节课就开始构思的原因,一开始肯定会构思得很简单、流程也很模糊,但是随着看得、学得越来越多你会对于Blockstack技术栈是否能解决你设想中的问题的答案越肯定。
 
开发工程技巧的话我推荐大家参考一下 https://github.com/blockstack-radiks/banter 这个项目,产品网址 https://banter.pub/。
 
前端项目开发其实要把组件的view(视图)和计算逻辑(一般存在component里面)分开,这个在我给大家的demo里面没有体现出来。

当大家设计复杂的产品的时候要考虑视图的复用性和组件的复用性,我虽然不是前端专家,但是可以给大家上面的仓库去参考一下。
 
02
小丹:Blockstack的atlas路由层, 是中心化的吗?会不会存在单点故障, core.blockstack.hub挂了所有app都不能用?
 
Gavin 老师:atlas 不是中心化的,但是core.blockstack.hub是。你可以通过修改browser里面的settings来修改你的账户节点默认寻址的core节点前缀。
 
我收到了挺多有关core节点在中国会被墙的反馈,后续有时间会在国内云服务平台开一个core,到时候中国社区的小伙伴可以把这里面的core节点前缀改成比如说core.blockstack.cn,这里说明atlas并不是中心化的。
 
03
小丹:atlas是可以配置的, 和Gaia hub一样。但是社区有动力去部署一个atlas节点吗?
 
Gavin 老师:我认为很快就会有的,1.0的问题是没挖矿所以没动力,2.0就有出块了,矿工会帮忙做这件事情的。
 
04
一休一休哥:高老师,如果一个应用,想为用户创建一个圈子或者Group的概念,然后圈外的人可以按名字或者id搜索圈子申请加入,进来之后,可以看到圈子成员列表。
 
这里面我的问题是:
1、任何一个用户都可以创建自己的圈子,但为了让别的用户能搜索到,网络中所有圈子的数据该如何存储?
2、基于上面的存储方式,用户通过 id 搜索圈子的流程大概是什么样子的?
 
Gavin老师:你这个问题简直就是radiks的引言和介绍。
 
我第四节课中提到了一个数据定向授权的流程,其实group的难点就在于怎么让一群人同时拥有同一把钥匙做数据的加解密。
 
Blockstack Gaia作为底层基础设施是不管你上层的封装的,只管存和读。所以通过简单密码学方式是可以实现这个方法的。
 
甚至你可以把代理重加密技术或者nucypher的加密方法加在Gaia存和读的上面也是完全可以的,radiks只不过是基于大家的需求,给大家提供了一个实现方法作为组件。
 
05
小丹:Blockstack Gaia文件存储的结构是扁平的,文件和文件之间的关系需要有代码去维护比如做个博客, 需要有list.json和很多artitle.json。

当我文章数量很多时, 比如一万篇, 再加一片文章, 我需要加载整个structure.json, append一条记录。推荐用什么办法来处理呢?
 
Gavin 老师:这块我感觉就是Blockstack相比较中心化公司的优势了。个人的数据再多,也比不过中心化应用的数据量多,甚至不在一个数量级上,所以简单的索引,分片实现逻辑是很简单的。
 
比如说1~50存在一个文件里面,structure也可以分表。
 
06
小丹:大部分的应用在数据和数据之间都有关系, 扁平的数据存储就把逻辑都放到客户端去处理了, 而且文件之间的关系越复杂, 每次需要更改的关联文件就越多。

如果要支持更为复杂的应用, 而且多开发更友好, 是不是支持图形关系会更好, 像是一个去中心化的图形数据库?
 
一休一休哥:嗯,博客文章之类的,会有文件存储需求。
 
小丹:我觉得比较理想的是提供两类接口, 一种是blob, 就是现在的接口。另一个种是structure, 这个最好是操作图型的数据结构。
 
Gavin 老师:你提到的这个问题我觉得对于开发者来说真的很重要,我刚才在思考两个个问题:
1. Blockstack应用的更新该怎么做,因为数据存在用户这边,如果开发者想更改file结构是有点困难的。 
2. 图形化的关系是有助于开发者设计文件存储的模式,图形化设计能否解决更新的问题呢?
 
你提的这点我觉得很棒。我开发的时候也有这个感觉,就是对于开发者热更新或者冷更新Blockstack 没有组件去确保这个过程的安全,如果图形文件索引结构可以解决这个问题那就太完美了。
 
你提到的这点应该是数据库工程师的工作内容吧?这块传统端有什么好的解决方案么?可以借鉴一下,开发一个组件。
 
小丹:graphdb, 可以看看这个 https://janusgraph.org/,但是参考下概念。这个实现起来比现有的存储方式要复杂很多, 但是如果能实现, 那是极好的。
 
Gavin 老师:你对于Blockstack 整个技术栈存储文件的更新是怎么看的,比如说开发者团队想要把原来的文件读出来,放到一个新的文件中。就好比blog,原来是1~50,现在想改成1~100了,你觉得怎么做会好一些?
 
小丹:个人感觉永远不应该有这种更新。对于博客,最好是开始的时候就把每个strcuture里面放多少设计好, 比如20个, 然后可以
1) 每个structure.json维护一个 next structure.json 的path
2) 维护一个index.json, 里面放所有的structure.json的path
 
Gavin 老师:了解了,这种更新中心化产品有中心化的做法,但是去中心化产品也可以做得很好,比如说告知用户数据是如何修改的,让用户授权是否通过等等。这个问题我好好思考一下。
 
07
小丹:ETH, EOS等执行只智能合约的时候, 钱包或者浏览器插件都是有提醒的, 像什么合约执行什么操作。但是Blockstack的应用, 执行任何操作, 不管是不是sensitive, 是没有任何提示的。
 
Gavin 老师:这就是我想说的,应用在修改数据调用putfile或者deleteFile的时候应该有一个授权的过程,通过了才能把私钥从localStorage里面给出去。
 
但是因为现在修改的是自己的数据库,所以这个问题一直没有扩大化。因为智能合约修改的是全局状态,而Gaia操作修改的是自己的私人状态。唯一遇到的问题就是应用方故意使坏,把你的数据全给改了或者全给删了,这样用户的数据会受到损害。
 
你的这两个问题我去官方发个proposal帖子吧,我觉得非常棒!其中后面的这个论坛之前有人做过相关的讨论。
 
小丹:恩, 只是提个建议。Blockstack整体上我还是很喜欢的,这次课程也学到很多。

 

作业点评

 
产品设计
先看这个流程图,这是我看到的条理最清晰,制作最精美的流程图了,大家可以参考一下。
 
             
做产品级别的流程图,如果能做到这样的程度,那么任何合格的工程团队就都能按照它去实现。
 

产品设计说明
规则:
每日支付 n coins(单位待定)参与早起打卡,放入早起打卡奖池。

次日早晨5:00-8:00(UTC+8,下文均为此时区)作为早起打卡时间,用户在此期间进行打卡;若成功打卡,可随机分当日奖池内全部鼓励金,奖金设置下限最低0.01 * n,不设上限。

用户未在次日早晨5:00-8:00内打卡(例如:已过打卡时间),视为打卡失败,不可参与当日鼓励金的分配。

每日瓜分金额于早8点后开始结算,当日9点前到账。

如出现用户单笔重复支付,或全部参与用户未打卡情况,该期奖金将原路返回。
同一id视为同一用户。

系统随机奖励,平台不收费用。
 
这个设计实际上是非常偏向智能合约的设计。以太坊,eos等这些平台产品的影子非常重,但是Blockstack目前还并不支持智能合约,因此要实现这样的设计困难还是很大的。我觉得目前在设计Blockstack应用的时候,既有的区块链思维最好能够都被忘记。
 
具体说来,Blockstack目前v1版本的专长应该在身份授权,数据加解密等方面,而类似于自动售货机功能(比如token根据某一逻辑转移)并不是目前版本Blockstack擅长做的事情。
 
当然,以后在v2的时候这一情况会有所调整,让我们拭目以待。
 

 Demo作业
putFile的时候加密的问题,实际上是产品设计的时候需要考虑的点。比如说有一份作业想要做一个私人的密码管理工具,这个创意其实挺不错挺实用的。
 
但有一个小问题,这里面的密码是明文存储在Gaia上的。那这个工具肯定就没有人敢用了。实际上课上已经讲过有关如何给putFile加密的方法了。
    const options = { encrypt: true }
    userSession.putFile(FILE, CONTENT, options)
 
Blockstack中数据所有权是web3应用中很需要注意的一个问题,而Blockstak强调用户的数据归用户所有,所以说,对于一些敏感的数据,涉及用户隐私的数据,务必要使用密文去存储。
 
下面我们来看一个做到了这一点的例子
 

优秀范例
存储的是隐私图表。
 
对于个人的炒币的仓位信息,当然是非常隐私的,不应该被任何其他人所知道,因此使用加密数据去存储仓位信息,是十分必要而且十分符合Blockstack精神的做法。

当然,这位同学在其他方面demo的内容丰富程度和完成度都是一流的,让我觉得十分厉害。
 
大家可以去围观下,亲自去操作一下,向优秀的产品学习
https://github.com/oneblocktest/mychart
 
(当然这个创意也是非常的好哈哈,从私人角度我也是很喜欢,如果去参加黑客松,估计能得奖哈哈)——来个题外话
 
最后,在我看来其实目前的demo(所以几乎大家所有的作业)有个小缺陷,不知道大家有没有注意到?

就是每次提交完状态都需要手动刷新才能看到存储的新状态。事实上,在现有代码的基础上,只要增加一行
 
userSession.putFile('status.json', JSON.stringify(status), options)
       .then(() => {
         this.setState({
           newStatus: status.text
         })
         this.fetchData()
       })
 
就可以利用现成的fetchData函数,使得状态能自动跟新,用户体验好了很多。

当然这个方法不一定是最好的,也有比如Hook的方法,不过在这里我也就是抛砖引玉啦,希望大家也能有时间多注意注意用户交互的部分。毕竟现在 DApp 用户体验是用户流失的一个很大的原因。

每一课作业都由助教批改并评选出优秀作业,第三课的优秀作业名单如下:




更多阅读:

Blockstack Dev 周记  | 拿好DID,出发下一代互联网

Blockstack Dev 分享 | 最详细DID身份授权流程

Blockstack Dev 讨论 | 帮你少走弯路的教程在这里



扫码关注公众号,回复“1”加入开发者社群


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存