Dapper Labs在加密世界中有着令人骄傲的成绩:开发了CryptoKitties这一OG爆款应用后,转而开发公链Flow,又在公链上推出了出圈产品NBA Top Shot,占尽风头。当前,Flow也仍在积极拓展生态资源,近日刚刚宣布Meta前高管将入职。本文将从产品技术和运营生态等角度来分析Flow,理解其当下发展。
Flow的技术中有两个最大的特色,一是「多节点架构」,二是「面向资源编程」,而这两点恰恰对应着当下的两个热点潮流:模块化区块链和Move系新公链。
Flow的第一个特点「多节点架构」指的是,将整条链从计算执行到完成共识的过程区分成不同的过程,用四类不同的节点完成相应的工作。相对于ETH Sharding的平行分工,这是一种垂直分工[1]。当下火热的模块化区块链,也是类似思路,Flow可以看作是模块化的一个早期案例。
四类节点分别包括:计算节点、共识节点、验证节点和收集节点。其中,计算节点运行要求高,必须部署在数据中心,实行准入制,目前总共7个计算节点;此外的其他节点云心要求较低,合计400+个节点。


来源:https://flowscan.org/staking/nodes
Flow试图通过这样的方式来实现扩容。不过,目前的TPS还算不上很优秀,根据官网,简单转账的情况下可以达到100+TPS,但实际使用场景大多比转账复杂,估计没法做到[2]。垂直分工也让一部分节点的门槛降低,能让更多用户参与共识环节,但是计算节点的运行仍然是中心化的,「不可能三角」的问题仍然存在。
第二个特点「面向资源编程」(Resource-oriented Programming)是其自研编程语言Cadence的特征。「面向资源」也是Aptos/Sui/Linera这三条Libra系公链的通用语言Move的特征,Flow团队早期正是受到Move启发,完成了Cadence语言的开发。
面向资源编程作为一种新的语言趋势,目的是为了更好地适配链上资产的应用场景。Solidity是一种「账本模型」,一个资产对应一个所有者,资产都记录在合约中;而以Cadence为代表的面向资源编程则是「资源模型」,资产全部记录在所有者的地址中,只有所有者可以调用方法挪动资产。
以下面两张图为例,场景都是CryptoKitties转账,但是左图代表的账本模型是更改资产对应的owner字段,右图代表的资源模型则是将owner地址中的资产移出,再转移到新的owner地址下。


来源:https://medium.com/dapperlabs/resource-oriented-programming-bee4d69c8f8e
目前的Cadence仍然较为独立。虽然借鉴了Move的思路,但是对于语法有较大改动,代码迁移的工作量仍然不小,短期内较难与Move系生态共享开发者。不过,Flow已有规划,将上线Move VM,届时或许能够共享Move系生态红利。
通常认为,面向资源的语言相对于Solidity有两方面的好处:其一,由于将资产放在所有者地址下,天然地避免了合约控制者调用资产的「后门」,因此更安全;其二,在某些业务逻辑上可以做到更好的处理,比如很容易实现某个资产拥有另一个资产的逻辑。
Flow上的项目品类很丰富,NFT、Defi、游戏等都存在,官网显示有1,000+个项目,但是真正撑起Flow市值的还是传统体育IP的NFT项目,特别是Dapper Labs自己和NBA合作推出的NBA Top Shot——NBA比赛视频NFT的系列收藏品。
下图展示了头部项目历史以来的交易量,其中NBA Top Shot已经累计成交11.1亿美元,在Top 10中占89%。排名第二的NFL ALL DAY和排名第三的UFC Strike分别是橄榄球联赛和终极格斗锦标赛,也都由Dapper Labs推出;第四Gaia是基于FLOW的商城,第五BALLERZ是一个篮球主题的生成性NFT系列。除此之外的项目成交额均在1,000万美元以下。

来源:https://www.flowverse.co/rankings
可以看到,最头部项目都是基于体育IP的NFT项目,且这类项目为Flow贡献了主要的交易额。元宇宙(Matrix World)和游戏(Chainmonsters)虽然也都在列,但占比较小。除此之外,Flow上也有Defi项目Increment Finance,但TVL仅在300多万美元。
NBA Top Shot为Flow带来了持续的营收。今年6月和7月,单月的成交额分别为770万和830万美元,这其中包含了新卡包的发型和用户间的二次交易[3]。假设NBA Top Shot交易额占全平台的~85%,那么全平台单月大概在950万美元左右,和Immutable X的单月900万美元交易额近似[4]。不过,Flow的收入应该高于Immutable,一方面新发行的收入都归项目方所有,应该在NBA和Flow之间分摊,另一方面NBA Top Shot所有的卡牌都在自建的商城内交易,而商城会对所有二次交易收取5%的税;相对而言Immutable仅对NFT交易收取2%的协议费。
尽管有NBA Top Shot这头现金牛作为坚挺支柱,但是毕竟营收来源较为单一,不如Immutable X生态多样,亟需开拓新的应用场景。近期Flow宣布与Meta合作,将在Instagram合作展示用户NFT,这更像是软性营销,不确定是否能有效提升业务指标。
Flow的代币为$FLOW,核心作用在于支付链上操作手续费、作为激励分发给节点。普通用户也可以委托质押给节点,分享节点激励。
$FLOW还有一个较为独特的作用:由于面向资源编程的特性,用户如果要拥有资产也就必须有相应的存储空间,为此需要支付一定费用,而支付方式为锁定$FLOW,如果未来情况存储空间也就可以释放相应的$FLOW。
$FLOW在2020年底发行,初始发行量为12.5亿个。为了尽量减小抛压,$FLOW实行低通胀,链上操作手续费均会分发给节点,多则冻结、少则增发。目前$FLOW的铸造总量为13.9亿,流通量为10亿(数据来源CMC),占~72%。
在初始的分配中,38%归属Dapper Labs公司和开发团队,20%归属投资人,32%归属生态发展,10%作为社区发售。

来源:https://flow.com/token-distribution
Dapper Labs成立于2018年,早期由于Crypto Kitties而名声大噪,也为团队带来了持久的名声,后来才转而开发公链Flow。同时,Dapper Labs基于Flow推出的NBA Top Shot等体育明星卡牌也成为了爆款,持续为团队带来营收。
Dapper Labs从2018年到到2021年已完成多轮融资,累计融资6亿美元,主要的投资方包括a16z、Union Square Ventures、Venrock、Coatue。
CEO及创始人Roham Gharegozlou,本硕毕业于斯坦福,毕业后曾在基金公司工作,2013年创办创意工作室Axiom Zen,协助创业公司募资和开发产品,也是在Axiom Zen中Roham Gharegozlou开发了CryptoKitties,在2018年成立Dapper Labs专注于CryptoKitties业务,并衍生出公链Flow。
CTO Dieter Shirley于1996年毕业于滑铁卢大学,其后曾在包括苹果在内的多家公司担任软件工程师,2013年加入Axiom Zen担任首席软件架构师,开启了和Roham共同的创业之路,并在2018年一同加入Dapper Labs。Dieter Shirley也是ERC-721标准的创立者。
Dapper Labs近日在Twitter上表示,Meta前内容及社区合作伙伴副总裁Nick Grudin即将加入Dapper Labs担任首席商务官,负责合作伙伴关系、开发者体验及营销[5]。这或许会对Flow的生态发展带来改观。
链茶馆认为,Flow的核心优势在于:
1)技术上敢于做创新,较早地采用了模块化分工的思路和面向资源编程的语言,是一个愿意开拓新领域的团队;
2)从CryptoKitties到NBA Top Shot,Flow是难得的有连续成功爆款经验的公司,拥有几乎不可复制的信任背书;
3)NBA Top Shot也在为Flow公链带来持续的可观营收,基本面较稳固。
同时,Flow也面临相应的挑战:
目前的生态较为单一,交易额集中在Dapper Labs推出的几个NFT产品,其他类型的项目如游戏、Defi等虽然也存在,但并不繁荣。未来生态发展的核心变量:一是Move系语言生态能否兴起、且Flow能否通过Move VM共享红利,二是Dapper Labs能否持续BD到营收可观的项目。
我有一个字符串input="maybe(thisis|thatwas)some((nice|ugly)(day|night)|(strange(weather|time)))"Ruby中解析该字符串的最佳方法是什么?我的意思是脚本应该能够像这样构建句子:maybethisissomeuglynightmaybethatwassomenicenightmaybethiswassomestrangetime等等,你明白了......我应该一个字符一个字符地读取字符串并构建一个带有堆栈的状态机来存储括号值以供以后计算,还是有更好的方法?也许为此目的准备了一个开箱即用的库?
对于具有离线功能的智能手机应用程序,我正在为Xml文件创建单向文本同步。我希望我的服务器将增量/差异(例如GNU差异补丁)发送到目标设备。这是计划:Time=0Server:hasversion_1ofXmlfile(~800kiB)Client:hasversion_1ofXmlfile(~800kiB)Time=1Server:hasversion_1andversion_2ofXmlfile(each~800kiB)computesdeltaoftheseversions(=patch)(~10kiB)sendspatchtoClient(~10kiBtransferred)Cl
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我正在使用ruby1.9解析以下带有MacRoman字符的csv文件#encoding:ISO-8859-1#csv_parse.csvName,main-dialogue"Marceu","Giveittohimóhe,hiswife."我做了以下解析。require'csv'input_string=File.read("../csv_parse.rb").force_encoding("ISO-8859-1").encode("UTF-8")#=>"Name,main-dialogue\r\n\"Marceu\",\"Giveittohim\x97he,hiswife.\"\
我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此
我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r
刚入门rails,开始慢慢理解。有人可以解释或给我一些关于在application_controller中编码的好处或时间和原因的想法吗?有哪些用例。您如何为Rails应用程序使用应用程序Controller?我不想在那里放太多代码,因为据我了解,每个请求都会调用此Controller。这是真的? 最佳答案 ApplicationController实际上是您应用程序中的每个其他Controller都将从中继承的类(尽管这不是强制性的)。我同意不要用太多代码弄乱它并保持干净整洁的态度,尽管在某些情况下ApplicationContr
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
简而言之错误:NOTE:Gem::SourceIndex#add_specisdeprecated,useSpecification.add_spec.Itwillberemovedonorafter2011-11-01.Gem::SourceIndex#add_speccalledfrom/opt/local/lib/ruby/site_ruby/1.8/rubygems/source_index.rb:91./opt/local/lib/ruby/gems/1.8/gems/rails-2.3.8/lib/rails/gem_dependency.rb:275:in`==':und
是否可以在应用程序中包含的gem代码中知道应用程序的Rails文件系统根目录?这是gem来源的示例:moduleMyGemdefself.included(base)putsRails.root#returnnilendendActionController::Base.send:include,MyGem谢谢,抱歉我的英语不好 最佳答案 我发现解决类似问题的解决方案是使用railtie初始化程序包含我的模块。所以,在你的/lib/mygem/railtie.rbmoduleMyGemclassRailtie使用此代码,您的模块将在