简说亦来云——从外行的视角看: 联合挖矿 (一)

2018年12月10日11:48:05 发表评论 4,255 views

简说亦来云——从外行的视角看: 联合挖矿 (一)

Overview 概述

亦来云采用了双重挖矿机制来更新并保证其区块链的安全。这种双重挖矿机制包括工作量证明机制的联合挖矿(AuxPOW)和委托权益证明(DPoS)。DPoS依赖于民主提名投票的节点集合,在将有效区块写入到区块链之前对其进行审核。而联合挖矿是一种通过利用在单独的区块链上进行的竞争性的挖矿来确保区块链安全的方法 [4]。为了成功地执行联合挖矿,这两条相关联的区块链必须使用同样的共识机制。. 亦来云使用工作量证明作为其底层的挖矿机制从而和比特币进行联合挖矿。为了能对联合挖矿构建全面的理解,我们的首要任务是学习比特币的基础构架知识。

区块与区块链

如果没有特别说明,下文中的区块链指的都是比特币区块链。

一个区块(Block)本质上是一堆数据 。这些数据包含区块头和一整套有效的交易信息。

一个区块头(Block Header) 又包含几项基本元素。 即区块的时间戳,前一个区块的哈希值,默克尔根(Merkle Root),难度水平(Difficulty Level),以及一个被称作Nonce的随机常数。一个哈希值实际上是一长串由数字和字母构成的字符串,被特别用来标记一个区块。 一个区块的哈希值可以类比为我们的社保账号:没有任何的两个区块共用一个哈希值,就像没有哪两个中国公民共用一个社保账号一样。

一个时间戳(Time Stamp) 包含一个区块发布时的具体日期和时刻信息。

默克尔根(Merkle Root)是一种通过一个特定区块中所有交易信息整合到一起的方法得到的值,这样就能在区块头中用单一的哈希值来代表它们了。

哈希值由一套确定的被成为哈希函数的算法产生。一个哈希函数是一种数学运算过程,不论输入的信息大小如何,通过这个运算输出的信息的大小都是固定的。这个输出的数据就被称作该输入数据的哈希值,通常是一个由字母和数字组成的字符串。 比特币采用了SHA265 哈希函数,也就是说其输出数据的大小固定为256 比特。一个比特(位)是电脑中数据存储的最小单位,用0或1来表达。

比特币的哈希值并非由256个0和1组成,而是转换为了十六进制数据。十六进制数字以字母数字字符(0-9和AF)的形式表示,其中每个字母数字字符占4位 ——即一系列4位数字,为0或1.例如,十六进制中数字“2”用4位表示为”0010.“对于给定输入,SHA256哈希函数的输出将始终生成与该数据唯一对应的固定的由64个字母和数字组成的字符串。虽然输出是确定性的,但它的结果与输入的值之间却没有可直接观察到的关系,因此不能用于获取原始输入。即使对输入数据进行微小更改,也会导致哈希值完全不同,并且与先前的输出并不相似。因此,哈希可以被认为是特定数据集的“数字签名”。如下图,输入“Elastos”产生的哈希值就与输入“ElastOS”完全不同。

当新形成的比特币区块发布到区块链上时,它区块头中的哈希值就是通过将所有数据输入到SHA256哈希函数中而形成的其唯一字符串。

Nonce是区块头中的一个32位任意随机数。与区块头中的其余元素不同,Nonce是由创建区块的矿工随机选择的,并且可以不断修改。由于哈希函数仅需要对输入进行微小更改就能生成完全不同的哈希值输出,因此区块生成器会根据指定的挖矿难度不断修改Nonce以尝试获得有效哈希值输出。

难度水平是区块头中的字段,它确定了为当前区块找到有效哈希值的难度。难度目标设定了一个定量阈值下限,要求输出哈希值要以最小数量的前导零开始。要理解一个特定的难度水平的含义,请考虑256位哈希值输出中的每个位由0或1表示。如果难度指定散列必须包含12个前导零,则需要前48位为零,因为十六进制中的“0”转换为“0000”。产生具有48个前导零的哈希值的可能性可等同于连续48次投掷硬币都正面朝上的概率。这个结果等于(½)^ 48或281.5万亿分之一的概率!

区块链是一系列带时间戳的区块,它们通过哈希算法以加密方式链接。每个连续的块包含前一个块的哈希值,并且每个区块自己的哈希值部分地由其前一个区块的哈希值输入而形成。结果:一串区块由它们各自的哈希值相互连接起来了。

Untitled
虽然每个区块只包含前一个区块的哈希值,但它却是依赖于之前的所有区块的。当前区块的哈希值取决于前一个块的哈希值,而这个哈希值本身又取决于前一个区块的哈希值,然后依次往回追溯,一直返回到区块链的创世区块,通常称为Genesis Block。因此,如果之前最近的任何块以发生了任何改变,每个后续区块的哈希值必定相应地改变,从而使整改区块链保持有效。

那么,然我们“rehash”一下(译注:让我们回顾一下):区块链本质上是一个系列区块构成的链条,每个区块都包含一系列有效的交易和一些其他信息。换句话说,它是一个包含特定区块链网络中曾经发生过的每笔交易的分布式账本。尽管区块链是由上述结构元素定义的,但其无数用例的神奇之处在于它的安全性和更新方式。

矿工、共识和工作量证明

区块由被称作矿工的实体添加到区块链上。矿工验证交易的有效性,并将它们记录在区块链账本上。他们也会在自己的硬盘里保存一个区块链账本副本。任何人如果有合适的硬件设施并下载了相关软件都可以成为矿工。 每一个区块链都有一套自己的关于什么是有效的交易和如何将区块添加到链上的规则。为了将一个新的区块被添加到链上,大多数的矿工必须达成共识来证明这个区块的有效性。

在一个区块链上当大多数矿工都同意添加一个新的区块,共识(Consensus)就达成了。

共识机制(consensus mechanism)决定了矿工网络关于如何就添加新区块和区块链的状态达成共识的过程和规则。

比特币使用被称为工作量证明的共识机制。工作量证明(PoW)是一种算法,要求矿工以CPU算力的形式进行工作,然后提供他们所执行的工作量证明,以便将他们的候选区块(candidate block)添加到区块链中。候选区块是已由矿工成功构建的区块,但尚未通过网络的共识确认为有效。网络中的每个矿工都在竞争“解决”下一个区块以添加到链中。矿工“解决”下一个区块的能力取决于其为创建当前区块而达到令人满意的哈希输出的能力。换句话说,每个矿工的工作就是在当前难度水平下创建具有符合要求的哈希值的候选区块。

以下是该过程的展开方式:

每个矿工通过从最近的交易矿池收集所有有效交易并构建区块头来创建候选区块。确保交易有效是每个矿工的工作——也就是说,确保尝试发送比特币的用户实际拥有可用资金。如果交易无效,矿工将不会将交易打包在各自的候选区块中。

当矿工将其新创建的区块头输入SHA256哈希函数时,就会输出一个256位哈希值,以十六进制表示。

然后,矿工检查新创建的区块的哈希值,以确定它是否满足由比特币网络设置的当前难度水平下所规定的条件。回想一下,是难度指定了区块的哈希值中必须存在的最小前导零数。

如果矿工对候选区块进行哈希处理然而哈希值不符合难度标准,则矿工必须重新挖掘该区块。但是,为了更改哈希输出值,矿工必须对哈希输入进行至少一次更改。在区块头中,除了nonce之外,所有信息都描述了区块本身的精确内容和性质。因为随机数是随机任意值,所以矿工可以在不损害块的完整性的情况下修改随机数,然后重新进行哈希运算以期输出满足当前难度级别的哈希值。

一旦矿工输入一个为其候选区块产生有效哈希值的Nonce,这个矿工就会向网络中的所有矿工广播其解决方案。其他矿工通过输入区块头中的值为自己确认哈希的有效性。如果大多数矿工确认该解决方案实际上是有效的,则他们达成共识,并且将该区块被添加到链中。 Nonce作为工作完成的证明。而这个共识算法被称为“工作量证明”,指的是找到解决当前候选区块的随机数的唯一方法是通过随机猜测,这需要大量的计算能力。

出块时间与难度

如前所述,难度实际上是一种内置机制,使比特币网络能够自动调整为下一个区块找到有效哈希值的难度。除了功能之外,难度水平在维持10分钟的出块时间方面起着重要作用。当更多矿工加入网络时,总计算资源增加 ——也促使哈希运算能力增加——矿工能够在给定的时间间隔内输入更多的随机数。结果,区块被解决并以更快的速率发布到区块链。为了缓和区块生成的速度,比特币网络定期重新评估难度水平——确切地说,每2,016个区块,或者说每2周一次进行一次。如果比特币网络确定区块生成太快或太慢,那它将分别通过添加或减去哈希输出所需的前导零的个数来增加或减少难度。

但为什么是10分钟呢?

比特币区块链作为一个平台,支持以数字形式的无缝,安全地进行信息存储和价值交换。比特币的原生令牌,即比特币,是保证和转移价值的货币。因此,为了使其网络有用,比特币利用挖矿过程不仅保护其网络和记录交易,而且还以公正和绩效为基础来分配置比特币。无论何时矿工成功解出一个区块哈希值,他或她都会获得区块奖励。区块奖励(block reward)是指矿工在成功挖出区块时,他或她获得的比特币。在2009年的比特币开始时,矿工每成功挖出一个区块就会获得50 BTC的区块奖励,尽管这个数字在9年后变为每个区块大约12.5 BTC,因为区块奖励每4年减半。

10分钟出块,50个比特币作为区块奖励,4年一个奖励周期:这会带来什么?

不要被愚弄——这些数值的设定远非任意为之;每个数值都在比特币生态系统中起着强大的经济作用。对于任何货币,通货膨胀时间表——货币供应量的增速——必须在长期得到认真实施和维持。如果货币过快膨胀,就会进入恶性通货膨胀状态,其快速贬值变得非常严重,个人就不会持有它,从而杀死了整个生态系统。另一方面,如果膨胀太慢,货币价值会急剧上升,这会刺激个人囤积而不是支出,也会削弱其经济效用并对生态系统造成同样的损害。

比特币推出了一套前所未有的独特货币,可谓开天辟地:这是一种不受中央银行管理和控制的货币,仅由无需第三方信任的代码管理。因为矿工获得的比特币是解决了区块而获得的奖励,而不是由中央银行负责人手工打印和分发,其区块创建和发布的速度直接影响其货币供应扩张的速度。因此,为了确保每4年期限内的稳定通货膨胀率,比特币网络不断重新评估区块生成时间,并相应地每2,016个区块调整难度水平。随着比特币向主流应用方向发展,为了减缓通货膨胀,区块奖励继续每4年减半。

除了确定合理的经济原则和货币政策外,比特币的10分钟出块时间确定了一个足够的时间间隔,矿工可以在这个时间间隔内了解最近发布的区块,并开始构建它们。一旦矿工成功解决了有效区块并将其发布到区块链,其他正在解决包含与已发布区块相同的交易的区块的矿工正在有效地执行过时的工作。这些矿工可能需要一分钟时间才能收到生产区块的通知,以便他们可以开始从新的交易池中获取交易并继续解决下一个区块。 10分钟的出块时间为所有矿工提供足够的时间来持续响应其他矿工发布的区块,并继续将他们的工作重新定向到下一个区块。结果:很少的时间——也就是很少的能量——被浪费在产生过时的区块上。通过这种方式,周期性调整的难度水平既可以建立合理的货币政策,也可以优化比特币网络内的系统能效。

所以,PoW的目的是什么?

工作量证明最重要的作用是确保交易分类账的不可更改性,从而最大限度地提高网络安全性。想象一下,当前区块高度为50,恶意实体打算从区块高度为10的地方修改交易。回想一下,每个区块中的所有交易信息都被整合为一个称为默克尔根的哈希值。如果恶意实体从区块10处修改了单个交易,则区块的默克尔根将被改变,这将改变区块10的哈希值。但是,由于每个连续区块都包含前一个区块的哈希值,所以整个区块10之后的区块链也将被改变。现在改变后的区块10的新哈希值将与区块11中存储的原区块10的旧哈希值不匹配。为了增加混乱,区块10的新修改的哈希将是随机的,因此它的新哈希要满足相应的难度水平现在看来几乎是不太可能的。所以将它标记为无效。

当恶意实体广播区块修改时,所有矿工都很快看到区块11中包含的区块10的哈希值不再匹配,并且将拒绝接受或确认该这个修改。在区块10中修改交易之后,恶意实体将不得不重新挖掘区块10 – 通过连续输入nonce – 以便找到满足难度水平的哈希值,然后使用该哈希值再来创建新区块11。由于块11随后也将改变,因此实体将需要重新挖掘区块11并使用该区块11的哈希值来创建新区块12.然后,恶意实体必须通过当前区块不断重复该过程。

在这种情况下,现代计算速度使得更改区块的哈希值变得相当容易,并且很快更新后续区块的哈希,从而产生链从未被打破的错觉。实际上,哈希运算是一种非常简单的操作,并且在该示例中,从块10到块50,仅需要40个散列。从这个的角度来看,市场上最快的采矿机每秒可以执行1.29万亿次哈希!

但正是这样,工作量证明展示了其复杂性核心的天才设计。工作量证明要求矿工以电力生成的CPU电力的形式进行工作,以便通过要求每个区块的哈希值低于预定的难度水平来解哈希函数并向区块链添加新区块。由于这种条件性,矿工必须重复输入随机数,直到它产生一个十分特殊的哈希值,如工作证明一致性算法所设定的那样。解出一个区块的哈希值就很难,更不用说数十个,一百个甚至几千个。因此,恶意实体必须花费计算能力以便在改变其中的事务之后解决区块10。然后,恶意实体必须通过生成数十,数百甚至数千个有效哈希值来重建从区块10到现在的整个区块链,同时速度要显著超过网络中的其余矿工,这继续将其所有计算能力用于挖掘新的原始有效区块链上的区块。

所涉及的电力成本使得生成区块成为极其昂贵的过程。一个实体越深入地对区块链进行更改,那它必须要重现的区块就越多,因此进行更改的难度和成本也越高。在某一点上,实际上就变得不可能了。这就是随着网络总哈希速率的增加,PoW区块链变得更加安全的原因。较高的总哈希率意味着向链中添加区块的难度增加,因此恶意实体重新计算这些区块的成本也随之增加。对于比特币这样的区块链来说,它已经积累了巨大的哈希算力,即使是一个区块,解决这个问题也是非常耗费人力,代价是十分高昂的。正是由于这个原因,具有足够累积足够哈希算力的PoW区块链被认为是实际上不可更改的,因而为其网络中的参与者提供了最高级的安全性。

双重花费,51%攻击 和经济激励

比特币是几种技术的融合,早在其诞生之前。比特币的主要创新成就在于其对“双重花费”问题的内在解决方案。双花问题(double-spend problem)源于数字货币的内在无形属性。因为数字货币没有物理形式,所以它们很容易被几乎不耗费成本地复制,使得它们的网络容易将单个单元发送到两个不同的地址—— 换句话说,双重花费。虽然一些幸运的用户可能会暂时获得加倍的购买力,但这会使比特币作为货币使用变得不可行。幸运的是,比特币利用区块链技术来防止双花问题,如以下示例所示:

假设一个人试图两次使用相同的比特币。消费者创建两个交易(交易A和B),并将它们输入等待确认的交易池。该方案包含两个可能的结果:

交易A包含在下一个区块中并添加到区块链中,而交易B保留在尚未确认的交易池中。当矿工尝试将交易B添加到下一个区块时,它立即被识别为无效,因为比特币已经被交易A中的相同地址花费了。交易B被丢弃,没有任何损害。

两个不同的矿工,各自将一个交易添加到他们各自的候选区块中。他们几乎在同一时间向网络广播他们的区块。这导致网络分裂成两个链;一个包含保存交易A的块,另一个包含保存交易B的块。结果就是产生所谓的分叉。分叉描述了当同时产生两个有效区块时,区块链在两个方向上出现临时分支的情况。在这种情况下,只有一条链可以被认为是有效的,否则可能会出现双重花费的问题。

请注意,单个矿工永远不会在同一个区块中同时包含交易A和交易B,因为这正是验证交易要检查项目之一。

区块链分叉与路径中的分叉非常相似,其中路径实质上表示节点网络中的分割。换句话说,所有矿工都没有达成协议,并且必须决定创建哪个区块 ——即采取哪条路径。对于比特币区块链,矿工遵循最长链路是有效路径的原则,并始终通过将新区块连接到该路径来继续构建区块链。当两个区块 – 一个包含交易A,另一个包含交易B – 被广播到网络时,一些矿工将首先接收具有交易A的区块,而其他区块将首先接收具有交易B的区块。当矿工收到任一区块时,认定该区块有效并开始工作以解决下一个区块。如果矿工成功解决了下一个块,它会将块添加到路径的一侧,从而增加其长度。成功添加另一个区块的第一个链就成为有效链,因为整个网络将观察到该链最长。另一条链被丢弃,连同其上现在被视为双重花费的交易。如果两个再次链同时添加了下一个区块,则继续这个过程哪条链第一个添加更多的区块哪条链就是有效链。添加一个区块被认为是一次确认,并且在某个区块之后发生的确认越多,用户就越确定该块中的交易将永久地添加到链中。出于这个原因,人们应该等待至少6次确认,以便绝对确定交易被认为是有效的。

虽然这个过程解决了双重花费的问题,但它仍然容易受到潜在攻击,其中最值得注意的是51%攻击(51% attack)。当一个实体获得超过比特币总哈希算力50%以上的控制权时,区块链网络就会变得容易受到51%的攻击。在这种情况下,控制大部分哈希算力的实体则能以比网络其余部分更快的速率产生区块。回想一下,对于比特币来说,最长的链被认为是有效链。控制51%哈希率的恶意实体可以私自生成区块,直到它的长度超过公共链。然后,恶意实体可以自行决定广播其私链,并且所有矿工别无选择,只能接受它作为有效链。这样的情况 ——如果成功执行 —— 使得持有51%哈希算力的恶意实体能够采取下面的邪恶策略:

双花:恶意实体花费一些比特币来购买商品,等待在网络上确认交易后,再发布自己的私链,但其中不包含交易记录。在这种情况下,恶意实体有效地消除了赃物,而它的付款永远不会传递给商家。
交易审查:恶意实体通过创建自己的专用链并省略某些地址的交易,有效地阻止某些交易在网络上执行。
攻击者不能:

反转其他用户的交易

更改每个块生成的比特币数量

凭空创造比特币

发送它从未拥有的比特币

51%的攻击会严重打击区块链的完整性。如果要让用户信任区块链,那么51%攻击成功的可能性必须微不足道。对于比特币来说,恶意实体的进入机会是惨淡的,而且非常耗费人力,因为在比特币网络中获得总哈希率的51%既具有高度竞争性又十分昂贵。然而,还有另一个因素可以阻止坏人甚至推翻比特币区块链网络的企图。比特币是采用工作量证明共识机制来利用竞争动态和激励结构这样深刻的混合体系来减少网络攻击的可能性,而不是通过预防措施来抵御恶意实体。

为此,比特币区块链包含了博弈论的基本思想。博弈论本质上是一个数学分支,涉及研究处理涉及多个理性决策者的竞争情境的策略。它的目的是在一个玩家做出选择关键取决于其他完结的选择的情境下做出预测。博弈论最着名的经济实例被称为“囚徒困境”,通过快速百度搜索将提供许多很好的例子。

我们来举一个例子,假设一群人在玩扑克牌,他们都可以看到其他人的牌面。此外,唯一的获胜手牌是Full house (即三带二)。在这种情况下,透明度是强制性的,玩家获胜的机会减少,要靠他或她手牌的运气。现在想象一下,游戏规则允许每个玩家从他或她摸取尽可能多的牌,一次摸出一张牌,并同时丢弃另一张手牌。但每次球员拿牌时,他或她必须支付一定的费用。就在这时,竞争引入了游戏,因为玩家现在可以争夺最好的牌。玩家摸的牌越多,创造获胜牌的机会就越大。然而,玩家摸牌的次数越多,他或她花费的钱就越多,这意味着吸引更多牌的玩家的成本会更高。此外,如果一名玩家被发现作弊,他或她立即被淘汰出局,也就因此失去了他或她投入为赢取获胜手牌的所有资金。如果玩家保持诚信并设法赢得比赛,他或她的奖励将涵盖所有费用并为他或她提供合理的利润。

上述案例与建立在比特币网络中的挖矿激励的方式是异曲同工的,其中额外摸出的卡片就类似于购买更多的哈希算力。

比特币的激励架构主要用于奖励良好行为,并阻止不良行为。很简单,在比特币网络中,做一个好玩家而不是坏玩家更有利可图。比特币网络中的参与者获得比特币的主要手段是获得区块奖励。由于所有矿工都通过相互竞争来解决区块问题,因此自然结果就是矿工们努力地为网络提供比同行更多的哈希算力。因此,网络积累了更大的哈希率,这反过来又增加了进入的门槛,从而加强了比特币区块链的安全性。由于比特币的大部分价值都与其网络安全性有关,因此更高的累积哈希率会促使比特币网络的基本价值更高。通过增加比特币网络的价值,矿工们得到进一步激励,从而也产生更多的竞争。

这种正反馈循环已经加速到使得接管比特币网络变得非常困难。今天,获得比特币占大部分比例的哈希算力的成本是如此之高,以至于只有少数超级富裕的实体有资源尝试这样的壮举。然而,即使一个实体设法获得如此巨大的哈希算力,这样做的成本也远远超过了从少量赃物中获得的潜在利润。如果能够利用其哈希算力挖掘比特币区块链并将作为诚实节点为网络服务,那么能够收集如此巨大的哈希算力的实体就已经可以获得可观的利润了。

此外,恶意实体需要在专门的ASIC挖掘硬件上投入巨额资金才能攻击比特币网络。但如果成功进行攻击,比特币区块链缺乏安全性就会暴露出来,其用户也会放弃网络。到这个阶段,恶意实体提出的大规模投资已不再有用,因为它曾经试图征服的巨型网络现在已经变得虚弱和贫瘠。因为网络提供的唯一奖励是以BTC计价的,所以攻击网络会无意中贬低任何潜在的奖励。

通过这种方式,比特币创造了一个巧妙而全面的激励架构,这是第一次实现了诚实行事的好处超过作弊的好处。这也正是比特币的真正深刻之处:它不抵挡坏人;相反,它将坏人转换为诚实的节点。

当中本聪(Satoshi Nakamoto)公布比特币早期版本中的源代码时,就预言了这样的激励结构:

“比特币网络实际上或许还可以减少垃圾信息,因为那些僵尸账号基地都改用自己的算力去挖比特币了。”

“The Bitcoin Network might actually reduce spam by diverting zombie farms to generating bitcoins instead.” ~Satoshi Nakamoto

现在我们已经对比特币区块链有了基本了解,我们可以继续学习亦来云和联合挖矿了。

第二部分将于下周发布,请保持关注。

想了解编写本文的团队,或者想加入我们,请点击加入“简说亦来云”团队

参考文献

[1]. BeckyMH. (2018, October 22). 联合挖矿规范. 网址: https://en.bitcoinwiki.org/wiki/Merged_mining_specification

[2]. Khatwani, S., Teddy, Appelberg, I., Palash, Juan, Lucas, . . . DJ AFINO. (2018, October 11). 什么是双花问题,比特币是如何规避它的? 网址https://coinsutra.com/bitcoin-double-spending/

[3]. 运行一个全节点 (n.d.). 网址 https://bitcoin.org/en/full-node

[4]. Judmayer, A., Zamyatin, A., Stifter, N., Voyiatzis, A. G., & Weippl, E. (2017). 联合挖矿:诅咒还是良药?计算机科学数据隐私管理,加密货币与区块链技术讲义,316-333. doi:10.1007/978-3-319-67816-0_18

[5]. (n.d.). 网址 from https://satoshi.nakamotoinstitute.org/posts/bitcointalk/532/

[6]. 域名币. (2018, Nov. 22). 网址 https://en.wikipedia.org/wiki/Namecoin

[7]. R/Namecoin– 联合挖矿:诅咒还是良药?(来自SBA Research的有趣文章).(n.d.) https://www.reddit.com/r/Namecoin/comments/6xbsb6/merged_mining_curse_or_cure_interesting_paper/

 

作者团队

Charles Coombs-Esmail[reddit上的用户名为u/C00mbsie]

Amos Thomas[Youtube上用户名为 Famous Amos]

Michael Ekpo[discord 上的用户名为 adeshino]

 

来源:https://blog.cyberrepublic.org/zh/2018/12/09/%E7%AE%80%E8%AF%B4%E4%BA%A6%E6%9D%A5%E4%BA%91-%E4%BB%8E%E5%A4%96%E8%A1%8C%E7%9A%84%E8%A7%86%E8%A7%92%E7%9C%8B-%E8%81%94%E5%90%88%E6%8C%96%E7%9F%BF-%EF%BC%88%E4%B8%80%EF%BC%89/

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: