以太坊:对随机数的追求,是人类最朴实的公正_RAN

作者:BlockPunk社区:果壳宇宙前言

4000年前的东方大陆,萨满缓慢的从篝火的灰烬中扒出龟甲,龟甲上随机的裂纹会决定部落下一次狩猎的时机;3000年前的地中海,尊贵的雅典神官主持着抽签仪式,他们要随机选出五百位优秀公民,来参与城邦政务的讨论;2000年前的中东,行商围坐在一张桌旁,紧张的注视着桌面上转动的四面骰子,它的最终结果会决定一大笔财富的归属。在上千年的人类历史里,我们一直不断地探寻着可靠的随机数,并将随机数用在生活的各个方面,民主与共和的抽签制度,战争时期的军情传递、生产上的模型计算,以及娱乐时的可信参照。对可靠随机数的追求,更是人类对公平的追求,对随机数的承认,可以说是人类最早的关于公正的共识。而在2000多年后的现代,人类发明了计算机,开始了崭新的数字纪元,随机数成为了整个虚拟世界的基础。真随机数

我们祖先朴实的技术而言,人类创造了很多生成随机数的方法,但这些随机数的随机强度与不可预测程度,并不比烧龟甲来的更高。这里就要讲到真随机数与伪随机数了。古代的人类观察物理世界时,会发现到处都存在着随机的波动,这种随机性在他们看来,是上天的旨意,你完全没法预测未来会怎么样。真正的随机性,只存在于物理世界,大气噪声、宇宙背景辐射、放射物的衰变期、量子塌缩现象,通过观测这些现象,得到的随机数是完全无规律可循的。

《百万乱数表》图片来自网络上世纪40年代,兰德公司利用模拟电路制成的电脉冲发生器生成了100万个随机数,并将其出版为《百万乱数表》,一直销售到今天。现在看来这似乎是一个异想天开的行为艺术,但在当时却是非常重大的突破。

熔岩灯图片来自网络有趣的是,在互联网时代的今天,仍有人在使用这种方法。一家名叫Cloudflare的云服务商,通过图像识别实时处理熔岩灯中蜡的形状,计算量化来获取真随机数,从而对数据进行高强度的加密。这听起来好像有些愚蠢,但其实它的随机强度,却远强于现在主流的随机数。假随机数

我们可以从物理现象中得到神秘而无穷的随机性,但有些现象并不能精确量化。但同时我们需要巨量的随机数来加密数据、训练模型、公平仲裁,仅依靠自然界的随机数是远远不够的。这也是计算机之父,冯诺依曼思考过的。在1946年,\n\n冯诺依曼参与了美军氢弹的设计,他在一台名为ENIAC的计算机上,模拟计算核聚变的过程。而这个模型的训练,需要对随机数进行快速的存取,但ENIAC的内存不够大,无法保存长真随机数,因此冯诺依曼设计了一个算法,来模拟一个随机性的混乱状态。

ENIAC计算机|图片来自网络这个算法是这样的:首先获得一个很短的随机值,比如操作时刻的毫秒数,作为这个算法的“种子”,然后将“种子”平方,输出平方结果的中间部分数字,再作为“种子”重复上述操作。重复足够的次数后,就获得了一个“随机数”。这被称为平方取中法,这也只是无数假随机数算法中的一种,这个算法输出的序列,只取决于最初种子的随机性。由于机器的确定性,同样的种子,就可以计算出同样的随机数。种子的位数决定了随机数的随机度,当你设定一个两位的种子生成一个10位随机数,在函数产生重复循环之前,最多只能得到100个可用的随机数;而在自然界中,10位随机数应该存在一百亿种可能。这两者之间巨大的数量级差别,就是随机数真与假的区别。只要你使用基于“种子”的假随机数,必然会出现重复循环的过程,也就是说,只要知晓了你的随机数算法,另一台计算机迟早能暴力尝试出相同的随机数。这就是区块链钱包的密钥生成随机函数被攻破后,暴力盗取密钥的手段。

图片来自网络假随机数存在规律的周期,点集中表现为脉络当然这种随机数是足够使用的,我们必须引入计算机科学中非常重要的一个概念,时间边界,也就是在多长的时间里,这个随机数是安全不重复的。和我们使用密码车锁一样,我们知道正确的密码必在一万种的组合方式之中,但一个个尝试需要花费好几天时间,这个时间边界内都算是安全,假随机数也是如此。我们闭眼敲键盘的随机字符串,其实也有规律可循,这就是QWER的键盘布局,通过分析后破解随机数的可能性就会很大这依然无法满足区块链的使用要求,因为我们需要一个能在固定时间内,分布式的获取随机数的方法,而不能依赖于任何一个中心主体。区块链为什么需要随机数

在传统互联网中,随机数是作为密码学与隐私安全的基础,通过共享随机的密钥,两个节点间就可以进行加密的私人通讯,而在区块链中,就是使用私钥密钥传输财产;同时随机数还广泛应用于有限带宽下的多节点通讯,可以利用随机数来决定数据发送的合理顺序,来协调多方节点,在区块链上,就是利用基于随机数的共识算法,协调交易确认者,保证一段时间内大家只对部分节点的消息进行反馈更新,从而在网络消息数有限的情况下获得一致。而在区块链与加密的世界里,随机数上再次投射出了人类对公平的追求。我们的世界是随机的,过去无法更改,但未来不可预测,这是对生命最大的公平。区块链上一样,我们通过随机数的可信,脱离人性的干扰,获得链上的公正性,保证整个系统的去中心化程度与可信性。特别是权益证明PoS越来越火的现在,我们比以往任何时候都需要一个安全、稳定、可信的随机数,来保证密钥对的生成、链上数据的加密、出块权力的裁定、智能合约的运行。总结

公平的决定出块权力,维持一致性共识。部分PoW与PoS机制下,依靠随机数选定出块者或者出块组的,包括DPoS机制下的循环出块的顺序,也是依靠随机数决定。私钥的生成。目前私钥只要由各钱包自定随机数方法生成,存在较大安全隐患。链上应用的随机数源。保证、游戏、抽奖、分发、调查等应用的公平公正,此类容易被黑客攻击。数据加密。链上数据因为是公开审查的,需要强度较高的加密,通过足够强的随机数确保链上数据的隐私与安全。链上随机数的难点

虽然区块链还是基于过去的互联网技术,但是在随机数生成部分却有着非常大区别。传统的随机数产生方式是中心化的,产出的随机数,与特定机器的状态值、物理状态相关,而同一个随机数算法,在不同的节点上得到的随机数是不同的,并且也没法针对每一个随机数进行验证,因此传统的方式无法产生一致性的随机性,这和区块链不兼容。因此区块链上的随机数,需要重头开始设计机制,从而来获得满足分布式特点的结果。因此到目前为止,没有真正意义上完美的方案,区块链上的真随机数是缺失的,连假随机数都很难获得。链上随机数的原则

1.不可预测因为随机数决定着整个协议层包括所有以上层级的公正性,如果这个随机数是能提前预见的,那么就可以伺机发动攻击。当然这个不可预测性是存在时间边界的,一般以区块链时间为边界,通过控制计算难度,或设置等待,来增加预测的难度。简而言之,有两种方案:保证随机数从区块时间上看是串行的保证随机数产生的难度,并按情况调节难度2.不可干扰随机数决定着区块的共识确认,因此如果能干扰到随机数的发生,无需掌握超越上限的节点/算力,就可以间接的控制区块链未来的走向,虽然干扰可能很微小,但多次干扰积累下来就会出现较严重的问题。有两种解决方案:保证随机数生成是非交互的,或完全根据节点本身状态计算设置随机数生成时延,需要等待长时间的复杂计算才能得出随机数,让干扰者无法预估自己施加的影响3.可验证应该详细表述为,可被简单验证,这表示随机数必须能够被任何节点快速进行验证其合法性,这样分布式的节点才能通过检验随机数,确认某一节点的出块资格,从而达成一致性。如果验证效率很低,需要很长时间,那么节点间共识的达成就会遥遥无期,区块链无法使用。不符合上述原则的一些解决方案

为了解决区块链上的随机数难点,自发的产生了许多解决方案,以下简述以下不符合上述三个原则的方案,虽然他们各自都有自洽的逻辑与一定的安全性,但在现阶段还是存在问题的,在对安全需求不是那么高的地方仍可以使用。这不不针对某个项目,而是指出相似范式的问题。1.使用链下真随机数不在链上计算随机数,而是使用从物理现象中获得的真随机数,比如大气噪声、电子脉冲,以及依赖包含热噪声电路的芯片组。但是对区块链来说,链下部分是不可见的,默认就是不可信的,链下获得随机数一定需要一个第三方上传至链上,这不仅违背了区块链的去中心化精神,完全无法验证,且存在篡改与提前预知的风险。就算使用预言机来去中心化的获取链下的真随机数,但仍存在物理上的人为干扰。因此这种方案非常不可取。2.将当前块的数据作为随机源很多的链上类Dapp,都习惯直接引用最近区块的哈希根值等作为合约的随机种子,再来产生随机数。虽说简介的借助了链上算力的保证,如此产生的随机数看似足够有公信力,但需要考虑到多维度的安全性。首先,区块上的数据是透明的,所有节点都能获取,攻击者同样能用来攻击合约,唯一的障碍就是不开源的随机数算法。第二点,出块人获得出块资格后,可以尝试变更打包交易顺序、尝试打包不同交易,来产生最有利于他的哈希根值,从而扩大自己中奖的概率,这对其他参与者是不公平的。3.借助分布式组织产生随机数因为随机数的强度来源于种子的随机性,因此就有人提出由一个分布式组织来产生足够随机的种子,依赖与本地节点的特殊状态或控制者的“自由意志”,向链上上传秘密与验证,以特殊算法组合种子,再在链上产生随机数。先不论链下的合谋可能,这种方案还是存在“最后参与者攻击”的可能,也就是最后一个上传秘密的参与者,可以知道此前的全部秘密,他可以控制自己的秘密来干扰最终随机数的产生。且在掌握了函数算法后,可以预测影响的规律,如此可以多次施加干扰,进而不断扩大自己的影响,这就是“放大攻击”。三类方案

虽然区块链上的随机数并不完美,但随这越来越多的项目认识到了随机数对效率和冗余度的巨大优化,随机数的可信与高效显得越来越重要。因此这里总结了三类相对成熟方案,并指出了相关项目与方案优缺点。哈希碰撞

在PoW系统中,矿工的客户端有一个基于本节点状态的随机数发生器,可以输出随机数序列,然后再计算其哈希值,一但生成的哈希值在规定的大小范围内,就是为获得了出块资格,其他节点获取这个随机数值,计算一次哈希值即可进行验证,因此它的验证是十分简洁的。因此这个随机数得经历数百兆亿次随机数发生后,才有机会获得一个符合要求的随机数,因此它的随机程度非常的高;同时由于得出随机数消耗的资源非常大,想要提前几个区块预测这个随机数几乎是不可能的;由于随机数完全根据节点本身状态输出随机数,因此这个随机数不会其他攻击者干扰;即时的难度调整,在安全时间边界内不会出现被攻破的情况。PoW的共识特点,使得其天然具备随机性的。优点:随机性最强,安全性号,非常适合驱动共识层;产生随机数时不需要使用网络带宽。缺点:计算冗余度,计算消耗大,资源浪费;难以在应用层使用;不具备唯一性,可以同时存在多个满足要求的随机数,可能导致区块分叉;无法抵抗并行加速破解,计算机持有多的人可以连续预测多个随机数。可验证随机函数

VRF算法于1999年由莫卡利教授提出,由于其较好的安全性与效率,被越来越多区块链项目拿来优化共识过程,让共识的随机数部分占用计算资源变少,让资源更多地被交易的确认与合约的运行所占用。

集合上图简述生成步骤:0.生成随机数签名专用公私钥对;1.获得一个足够随机的种子,可以直接使用上一轮结果,与区块高度、时间的变量等进行组合;2.用随机数私钥对之进行签名,或是先签名再组合;3.对签名后的值做哈希摘要,得出最新的随机数;4.检查随机数是否在合法范围中,判断是否抽签成功进入出块组5.根据公钥与轮次等输入,计算证明,接受随机数后验证者使用函数进行验证。因此这样产生的随机数,节点可以轻松验证其是否合乎算法,"Verifiable"就这样做到了;而经过足够复杂的算法,加上哈希摘要过程,获得足够随机分布的结果,“Random”得到了保证。VRF主要结合PoS机制一起使用,来进行出块人的随机选择,个别项目中直接决定区块的一致性选择。这个随机数的生成过程可以完全在一个节点的链下运行,同时也可以整个运行在链上。需要注意的是签名随机的部分,VRF的这个签名随机算法应当具备唯一性,也就是说用同一把密钥,对同一个数据签名随机多次,只有唯一的一个随机数能被公钥验证,这就能防止产生随机数时,多次运行签名随机部分,来获得最有利于自己的随机数。优点:算力要求低,产出随机数效率高;产生唯一性、确定性的随机数,不易出现分叉;验证可滞后于随机数产生,适合进行秘密选举;可设置为抗并行加速破解,矿机多者也无法连续预测随机数。缺点:验证步骤较多,秘密选举下需要多次验证;随机数分布均匀性不好,因为是根据特点密钥计算的;带宽占用高,延时长,是为让秘密选举的节点互相确认,BLS项目问题不大;Algorand

每一个节点都获取前一轮确认区块上的随机种子,集合轮次时间等,在链下单独运行VRF函数,然后对结果进行哈希摘要,节点将结果与网络中哈希值范围进行比较,范围内的成员便有资格参与验证与出块。因为VRF是在网络边界,也就是节点链下部分运行的,对整个网络来说,究竟抽出哪些节点是不可知的,抽中节点不清楚那些节点也被选中,需要互相发送随机数与证明,并收集验证来判断其他节点身份,因此这个过程被称其为“秘密选举”。而至于区块的选择,是根据抽中的出块节点随机数的“资质”决定,同时节点需要对其他的区块进行投票,这过程是一个改进过的拜占庭容错协议,并且投票需要两轮,每一轮都需要进行一次“秘密选举”。可见,algo是节点各自运行VRF,然后全网根据拜占庭容错的过程,获得了唯一的随机数。优点:“秘密选举”,无法第一时间知晓所有被选中节点,因此无法提前串通或定点攻击;每一轮次共识,随机生成验证组,组的规模与成员都无法预知;缺点:抽中的节点需要很长时间互相确认身份,需要遍历全网,带宽使用率太高,这使得一般人无法参与共识,影响去中心程度;由于验证组大小根据概率范围分布,网络规模小时选不出足够多的节点,网络规模大时验证组过大性能太低;DFINITY

节点第一次进行抵押加入网络,就会根据分布式密钥生成协议,随机为每个节点专属的“随机数密钥”。这个分布式密钥协议会生成符合要求的总密钥对,并根据系统规定的委员会组大小,对总密钥对进行切分,分给组内的节点。节点会获得一个专用签名密钥,但是谁都不知道总密钥是什么。组的分配是随机的,一个节点能同时存在于多个组中,但是组的成员是事先固定已知的,这一点与Algorand的“秘密选举”有所不同——DFINITY是“先验”,Algorand是“后验”。DFINITY的随机数生成过程是完全在链上的,你无法对这个随机数过程进行控制。上一轮的随机数,会在多个组中选出本轮的委员会组,整个过程的公开的。委员会组会履行出块、公证的义务,公证过程时,节点会不断寻找“权重”最高的那个区块,这个“权重”也是上一轮的随机数决定的,找到一个区块,就会使用“随机数密钥”签名并广播。

而有一个运行在链上的程序,叫做随机数信标,它在不断地接受当前轮的签名数据,当有一个区块的签名的签名超过验证组节点数的50%,它就会将签名聚合起来,产生一个唯一确认的随机数。这个随机数的出现,就预示着本轮共识的结束,将会继续选择下一轮共识的参与者。整个随机数生成过程中,没有任何一个节点可以控制这个随机数信标,并且不需要节点间互相交流来获得唯一确认性,而神奇的是,在不需要节点交流共识的情况下,只要随机数信标收集了足够多的签名,\n\n不管这些签名来自哪50%,它一定会生成一个唯一合法且确定的随机数,目前唯一能现在这个功能的算法,就是BLS阀值签名算法,也是DFINITY最大的特色。优点:共识与随机数生成阶段节点无需交互,自动执行,无需拜占庭容错,效率高,带宽占用较低;随机数的生成过程时不可操作的,非交互式的,因此无法施加影响,随机数更公正;阀值组已经确定,而不随共识变化,天生适合分片,因此扩展性很好;签名体积小,共识敲定快,TPS、最短确认时间与最终确认时间,都比同类VRF+PoS项目要好。缺点:后验性,组员在共识前就已确定好,可能存在串通勾结的可能;完全由随机数驱动,勾结节点虽无法控制区块链,但可以使系统宕机停止;BLS算法学术基础已经足够,但缺少工程实现,并无开源案例。Cardano

此项目是著名的衔尾蛇算法的首个实现,共识阶段以时代为周期,每个轮次存在多个插槽,每一个插都会产生一个区块,如果出现问题可以跳过一个插槽。而每一个插槽该由谁来进行出块,是需要使用本轮时代的起源区块给出的随机数种子、有资格参与共识节点的抵押权益、节点公钥、插槽列表等数据,集合节点公布的公钥,计算最终结,数就决定了哪个节点(slot\nleaders)能进行出块。因此Cardano的关键就在于每一个时代,起源区块上包含了决定出块者的随机数,实则在这状态机下的节点里,在起源区块生成之初就已经决定了本时代的出块者都是谁,这个选择从算法需要计算一阵子,这个计算出块者的过程可以看作是VRF的后验证过程,因此Cardano也可以近似的看作“秘密选举”。关键就在于起源区块中随机数的产生,他需要足够随机,且能被节点们共同认可。Cardano以承诺揭秘的过程来让每一个节点上传他们自根基自机器状态产生的随机数,在秘密揭露后,将这些随机数组合起来共同产生一个随机字符串。这就是随机数的生成过程。揭秘的过程比较复杂,首先在插槽出块阶段前,所有根据权益选上的节点,会秘密的计算一个随机字符串,然后把这个字符串进行复杂加密,将加密后的密文广播全网,并承诺会解释秘密。随后在插槽出块过程中,节点会公开一个揭示数据Open,这个Open包含了解密与原随机数,可以用于检验节点的这个随机数。如此便可以保证在产生随机数之前,节点早就准备好了随机数并没有修改过,而不是在收到他人秘密后才生成的,因为那样可以间接的干扰随机数的生成,从而间接控制区块链。但是有一个问题,节点可以在揭露阶段不发送Open和随机数,这有几率导致手机不到足够多的节点随机数,起源区块无法产生,最终区块链宕机。为了抵抗这种风险,Cardano规定节点必须在发送加密密文阶段,就把Open根据算法分成好几份,使用本时代出块者公钥加密。一但有节点跑路,出块节点就可以用自己的私钥解密Open的碎片,然后拼合起Open。而这个分割Open的算法,被称为可验证的密钥分享VSS\n(verifiablesecretsharing)\n。再把Open分割后,吃有一个碎片是无法窥探Open全貌的,因此这个随机数,即使是出块者也没法提前获得。同时这个VSS算法优点类似于DFINITY使用的BLS算法,不需要全部碎片拼合起来,只要部分碎片就可以恢复出完整的Open。可见上述的VSS、拆分揭示等多种容错,保证了因节点跑路掉线导致宕机的可能性降得很低。

优点:随机性较好,安全性较高;不会因为VRF的缘故发生宕机。缺点:验证组是先确定的,根据权益大小排序,因此去中心化略差;节点间可以串通勾结;获取随机数是需要多次通讯,带宽占用高。VDF+Randao

之前有哈希碰撞中有讲到,因为区块数据的透明,PoW机制下的随机数很难在上层的合约中作为种子应用,以太坊1.0也存在这个问题。因此就有人考虑使用去中心化的组织来分布式的收集种子,从而在合约上实现一个安全不可预测的随机数,这就是Randao。上文中也提到了,虽然其使用经济上的设计限制了串通,但是却依然存在“最后参与者攻击”与“放大攻击”的风险。最后参与者攻击:最后一个参与Randao的人可以预测部分未来随机数,因此可以选择不公开秘密,对其施加干扰。放大攻击:多次执行最后参与者攻击,将对随机数的干扰扩大,从而简介掌控组织。而在最近公布的以太坊2.0的方案中,为了性能的考虑,需要使用PoS来替代PoW,因此需要随机数来选定出块资格。随机数运行在一条称为“信标链”的单链上,其产生的随机数来随机控制分片的组成,进而实现多片并行,扩展以太坊性能。因此随机数又成为了以太坊升级的重要基础,涉及到分片的公正性,与最终确认的可能性。PoW的分片方案太过复杂,因此以太坊2.0的分片基于PoS实现,随机数也是如此,无法再用过哈希碰撞来获取共识层的随机数了,因此以太坊2.0借鉴了Randao的想法,但为了解决上面讲的两个问题,引入了一个可验证延迟函数VDF,让通过Randao产生的随机数需要经历一段很长的时间,才能得出结果,这个计算难度比较高,且必须等待多个区块,是串行运行的,这样一开始像Randao中传送秘密时,攻击者无法预测吃自己的秘密对最终最技术的影响,也就无法发动上述攻击了。首先介绍一下Randao,以太坊2.0上的节点通过抵押32的ETH,获得加入Randao的资格,每一获取随机数种子时,参与Randao的节点会在心里默念一个秘密的数字,然后加密后广播出去。在所有人都获取了其他人的密文后,节点会相继公开这个秘密,随机数使用某种方式合并,就可作为随机数种子,来生成最终的随机数。这就像玩桥牌,先牌面朝下的发牌给玩家,然后开牌时一个个进行揭露、为了不让最后一个参与者预测结果,来施加干扰,选择使用VDF来生成最终的随机数。而这个VDF存在以下特点:1.计算难度高,结果有延迟。VDF的计算过程较为复杂,需要等待很长的时间才能得出结果,因此将延迟时间设置的足够长,想快速预测结果是十分困难的;2.验证简单。VDF的运行过程可以是困难且耗时的,但是检验结果时必须足够快捷;3.串行性。VDF的计算是一步一步执行的,想要计算最终结果必须按部就班的来,没法进行并行加速,即使攻击者手持多台机器也无法短时间里预测结果。就比如对一个长整数,连续取10次方后,对某一个大素数求余数,然后连续进行上述步骤几百次,这就是一个VDF的函数。因此计算次方的算法是有难度的,且多次循环下,必须知道前一次结果才能进行后一次的运算,因次这个算法的最终结果没法很快的计算出来,必须老老实实一步一步的进行。同时由于人类的计算机架构,即使是算你差别非常大,这个计算难度也不会有指数级的变化,依旧十分难解。这个不可预测性,就保证了随机数的安全性。其实上述部只是一个计算结果的算法,VDF还应包含一个用于验证结果的算法,VDF的结果不仅只是一个随机数,还产生一个对随机数的验证,任何节点都可以快速的验证。

在以太坊2.0阶段,这个VDF的延迟被设定为102分钟。每100区块称为一个世代(epoch),也就是6分钟左右,每经历一个世代,就会揭露一次Randao的秘密,每次揭露都要运行一个VDF。因此计算得知,任何时间总会有16个VDF同时在链上运行。优点:目前区块链上最难预测的假随机数,随机数强度非常高,但弱于POW;随机数严格遵序串行,抗并行加速运算;得到随机数过程不需要过多的交互,带宽专用率低于VRF。缺点:VDF计算过程难度很高,获取随机数的效率很低,对计算性能有较大浪费;虽然计算难度很高,但不像PoW一样抗量子计算,有攻破可能;不能立刻生成随机数,需要等待长时间延迟;总结

统计学家弗朗西斯·加尔顿在1890年的《自然》杂志上写道:“作为一个选择随机的工具,我发现没有什么优于骰子。”人类不断的试图用规律总结随机性,但新的随机性又会出现在新的规律之下,我们惊讶于量子世界的无序与随机,这又激发了我们探索的好奇心。可以说对随机数的认识,就是人类的进步史,对随机数的追求,不仅是对科学的诉求,更是对宿命论的反驳。同时,我们创造了二进制的虚拟世界,我们想在这个世界上,尽可能地模拟复制我们的宇宙,也获得大自然中那美妙而神秘的随机数,这个意义是巨大的——有了机器上的真随机数,我们是不是就可以给虚拟世界赋予生命了?我们是不是就能模拟一个“自由意志”了?我们人类是不是也有可能虚拟化的生存了?宇宙间的随机性,是对生命最大的公平性,区块链上的随机数,会成为人类对公平的最直观也是最根本的追寻。过去已经决定,现在正在发生,未来总体是随机的,区块链上的世界也应该如此。一个运行在01机器上,能被世间万物所认可的随机数,在区块链之前,从来都没有这么迷人过。

郑重声明: 本文版权归原作者所有, 转载文章仅为传播更多信息之目的, 如作者信息标记有误, 请第一时间联系我们修改或删除, 多谢。

大币网

FilILY:说好的和巴菲特走心,孙宇晨先走肾了_DAI

文|昕楠编辑|卢晓明出品|Odaily星球日报孙宇晨宣布因病取消巴菲特午餐,引来各方猜测。距离天价午餐不到两天,孙宇晨以结石为由取消与巴菲特午餐,孙宇晨成为了20年来首次取消巴菲特午餐的人.

[0:0ms0-3:703ms