BUIP041(BUIP038计数器):防止少数的算力发起大区块攻击

2016-12-22 14:34 来源:巴比特资讯 阅读:5546
BUIP038描述了一种小算力攻击方式:小算力有可能暂时制造远大于“更大的可接受区块尺寸(EB)”这一参数大的多区块,并且通过暂时地通过多数算力设置的“接受区块深度(AD)”这一参数。

                                                        0                             182                                                                                                

att

问题

BUIP038描述了一种小算力攻击方式:小算力有可能暂时制造远大于“更大的可接受区块尺寸(EB)”这一参数大的多区块,并且通过暂时地通过多数算力设置的“接受区块深度(AD)”这一参数。节点的EB值一旦被越过,这个节点将允许随后一段时间内没有延迟地接受在链上产生的任何更大的EB值区块。通俗来说,称之为“粘性门”特性。如果少数算力能够压倒多数算力,多数算力就不再有能力限制区块大小,这就是BUIP038声称的,允许少数算力将“任意大小” 的区块添加至区块链。

这是一个有趣的攻击方式,它现在可以被以下几种方式防御:

1. 可以增加AD值, 因为少数算力挖到区块量超过多数算力挖到的量大于N个区块,其可能性是随着N的增加以指数的方式减少的。

2. 巨大的块仍必需由矿工传播和验证。BU对区块传播和“间谍挖矿”的理论和实证研究表明,一个巨大的块会被孤立或者被一个序列的空块跟随,使区块平均大小和网络交易吞吐量匹配。

BUIP038 提出恢复“粘性门”的特性来防御这种攻击。然而,恢复这种特性并不能解决问题。一个攻击者可以产生巨大区块*作为它的第一个分叉区块*(和第二,第三个等等)。如果攻击者可以相比于多数算力能多挖到AD个区块,多数算力将被迫切换到攻击者的分支链上。换句话说,没必要等到“粘性门”时期来生产巨大区块。这个区块可以在攻击者试图攻击的任何时间内产生。(译者注:最后一句话的逻辑关系我也没搞明白。In other words, is unnecessary to wait for the “sticky gate” period to produce the huge block. The block can be produced at any time during the attacker’s attempt.)

然而,BUIP038 可以减少可挖到的巨大区块的数量,因为没有144个区块“粘性门”时期。但是,这远远不能确定,“多数”矿工有不同的AD设置。这种情况下,“多数”矿工将不会在相同的分支上工作。相反,他们将各自在开始于他们自己AD设置区块顶端的一个分支上工作。这也许意味着攻击者的算力将成为有效的多数。

BUIP038 对链的收敛有常不利。“涌现共识”算法的目的是允许节点和矿工抵制对区块大小的不良变更,然而如果多数算力正在挖这更大的区块,则接受这种改变。但是通过BUIP038的方式, 一个矿工将绝对不会接受区块的改变,并且将自己的链收敛到链的顶端。它将总是试图分叉为一个较低的区块大小,从顶端后面开始AD区块(一个巨大的缺点)。对拥有各种切分大小的两种算法的模拟(见附件1)表明,当区块始终在一个组的EB之上时,BUIP038 有很多的孤块。 例如:使用现在的算法,1000次运行~1800个区块,66%vs 33%分割显示最大值是13个孤块,平均值是2个孤块。但是如果通过传递BUIP038 ,孤块数量的最大值和平均数是642和278,超过1800个区块。BUIP038 实际的孤块数量是无限的,因为链从不收敛,这意味着33%的算力多数时间用于生产孤块。

我不相信矿工可以接受BUIP038 的行为,因为孤块导致的经济损失是无法控制的。是的,矿工应该小心地监控他们的网络。矿工可以(也应该)仔细监测网络,一旦发现他们的EB门被破坏,并导致自己的算力不再追随主链顶端,就需要立即修改他们的EB参数。但是如果这种做法是大家期望的,那应该这样做—-一个矿工可以设置AD=99999(有效的无穷大)并保持他的选择是EB,直到它被手动修改。但是如果通过BUIP038,就没有办法发生相反的动作—-接受网络的选择,在链的顶端挖矿直到被矿工手动干预。实际上,一个好的策略准确来说应该是:从链的顶端建立一个更小的区块。至少在这个案例中,你的区块有很大可能性会成为区链的一部分,通过限制你的经济损失,你的较小区块将会减少网络的平均区块大小(网络生产一个平均区块大小,其中算力对每个矿工挖出来的区块大小来说是有利的。)

建议的解决方案

为了解决少数算力攻击的问题和保持链的收敛性,必须修改逻辑,根据与之前过大区块相比,判断区块尺寸超过了多大比例,从面来增加AD值。 但是最初更大的区块应该至少等到AD个区块。因此EAD坐标图并不是基于第一个更大的区块或随后的区块来画出。第一个更大的区块就像是一堵墙。(译者注:我暂时没有理解这句的逻辑,请读者原谅。So a graph of the EAD is different based on whether this is the first excessive block or subsequent ones. If its the first, it looks like a wall with a staircase on top.)

filehelper_1482382675891_62

随后的更大的区块—-也就是,只是比第一个区块大一点的更大区块,不应该有初始的AD“墙”。如果对第一个稍微大一点的区块都存在一个初始“墙”,那一个矿工可以通过每次增加1个字节的区块大小来迫使其他矿工进入BUIP038 指定的“总是跟随”的行为中。

让我们定义内部参数,“有效AD”(EAD), 和“有效EB”(EEB)。

首先,我们计算EEB:

if none of the last 144 blocks are marked excessive on this chain:
  EEB = max(EB, largest block of the last 144 on this chain)
else:
  EEB = max(EB, largest block marked excessive of the last 144 on this chain)

如果链上最近的144个区块都没有被标记为更大的区块:

EEB= 最大值(EB, 最近的144个区块中的最大区块)

否则:

EEB= 最大值(EB, 最近的144个里被标记为更大区块中的最大区块)

现在说,生成一个大小为S的区块。如果S<=EEB, 这个区块就不算是有效的更大区块,因此返回。

另外EAD按如下计算:

ADfraction = floor(AD*(S — EEB)/EB) # This calculates the “steps” in the graph. Its basically computing how much bigger the new block is in fractions of EB. And then waiting “accept depth” times that fraction. 
if EEB == EB:
  EAD = AD + ADfraction # Add the initial wall
else:
  EAD = ADfraction

ADfraction=floor (AD*(S-EEB)/EB) # 在图中计算“steps”。 它主要计算一个新区块大于EB值的比例,得到一个分数。然后等待“接受深度”乘以分数

如果 EEB == EB :

EAD = AD + ADfraction # 加初始墙

否则:

EAD = ADfraction

最终确定过大的区块:

if EAD == 0:
  this block is not excessive.
if EAD > 0:
  mark this block excessive, 
  and wait for EAD children before accepting it.

如果EAD=0

这个区块不是更大的区块

如果EAD > 0 :

标记这个区块过大,

并在接受它之前等待 子EAD

例如,在英语中,如果新区块比最后一个大区块大2EB,则拒绝这个分支链,直到这条分支链的长度达到2*AD。这解决了网络由于低AD设置允许大区块的问题。区块越大,节点抵制链的时间越长。

如果在24小时内(即144个区块)所有区块都小于最后一个更大的区块,就没有任何一个区块会被标记为更大的区块,因此下一个区块将导致一个“AD+ADfraction”的完整的等待高度。我不认为每24小时“hiccp”是说的通的。所以“if”语句在EEB计算中处理这种情况(未标记的区块必须小于或者等于标记为更大的之前区块和你的节点等待的区块)。这也适合启动阶段需要处理的情况。在启动时,我不认为我们希望AD触发较旧的区块,特别是那些不在意EB/AD 设置的使用者将忘记去设置这些值。因此,在至少144 个区块在启动时会被检查, 并且EEB设置为最大的前区块。

此逻辑算法共识不是关键。其他的客户可以创造不同的算法以在不破坏共识的情况下惩罚大区块。

Example:

EB = 1MB

Now 2MB block comes in. This is the first excessive block, so EEB=EB. We wait AD blocks + AD*(2–1)/1 blocks. That is: 2*AD blocks. Subsequently EEB will be 2MB.

例如:

EB=1MB

现在进入2MB区块。这是第一个更大的区块。因此EEB=EB。我们等AD区块+ AD*(2-1)/1区块。即:2*AD 区块。随后EEB将变为2MB。

现在一个10MB 区块在2MB之后出现(在计算下一个“粘性点”的时候不要跳过2*AD 区块)。(10-2)/2=8,因此我们现在卡在8*AD个10 MB区块。EEB=10 MB。

在10 MB之后,让我们说,我们找到一个11MB 区块。(11-10)/1=1, 因此我们现在卡在1*AD 区块的11MB 区块。EEB=11MB。

接下来,一个5MB 区块进来。小于EEB,所以我们立即接受它。

接下来,143区块通过,并且一个4MB区块进来。EEB是5MB,因为这里没有被标记为过大的区块,并且5MB 是最大的。因此4MB区块立即被接受。如果145个区块已经通过,那么EEB就成为EB并且4MB 区块将变成更大的区块。

附件1:

数据来自区链模拟(剪切并粘贴到宽文本编辑器中)。这个模拟可以在此网址找到:

https://github.com/gandrewstone/chainsim:

BUIP041 (this BUIP):
           SPLIT (block height, max blocks, avg blocks):  max fork depth, max orphans, avg orphans, { X:Y where Y runs had X forks }
0.500000/0.500000 (1807, 1810, 1669): 4, 33, 5, {0: 73, 1: 365, 2: 186, 3: 129, 4: 103, 5: 47, 6: 42, 7: 16, 8: 18, 9: 10, 10: 5, 11: 2, 12: 3, 15: 1}
0.600000/0.400000 (1793, 1798, 1670): 4, 20, 3, {0: 129, 1: 505, 2: 196, 3: 95, 4: 37, 5: 23, 6: 9, 7: 1, 8: 4, 9: 1}
0.667000/0.333000 (1821, 1822, 1668): 4, 14, 2, {0: 189, 1: 572, 2: 147, 3: 55, 4: 23, 5: 11, 6: 1, 7: 2}
0.750000/0.250000 (1812, 1814, 1669): 4, 14, 1, {0: 276, 1: 596, 2: 103, 3: 20, 4: 4, 8: 1}
0.800000/0.200000 (1794, 1795, 1670): 4, 6, 1, {0: 429, 1: 505, 2: 54, 3: 11, 4: 1}
0.900000/0.100000 (1787, 1788, 1667): 4, 4, 1, {0: 637, 1: 343, 2: 18, 3: 2}
0.950000/0.050000 (1793, 1793, 1667): 2, 2, 1, {0: 806, 1: 192, 2: 2}
BUIP001 + trailing fix (currently released code):
           SPLIT (block height, max blocks, avg blocks):  max fork depth, max orphans, avg orphans, { X:Y where Y runs had X forks }
0.500000/0.500000 (1801, 1809, 1673): 4, 34, 5, {0: 60, 1: 386, 2: 207, 3: 134, 4: 76, 5: 48, 6: 38, 7: 15, 8: 14, 9: 8, 10: 1, 11: 3, 12: 4, 13: 4, 17: 1, 18: 1}
0.600000/0.400000 (1788, 1792, 1669): 4, 21, 3, {0: 117, 1: 502, 2: 212, 3: 92, 4: 50, 5: 15, 6: 6, 7: 1, 8: 1, 9: 1, 10: 1, 11: 1, 12: 1}
0.667000/0.333000 (1767, 1771, 1667): 4, 12, 2, {0: 212, 1: 552, 2: 153, 3: 56, 4: 21, 5: 3, 6: 3}
0.750000/0.250000 (1793, 1794, 1669): 4, 8, 1, {0: 338, 1: 558, 2: 72, 3: 21, 4: 9, 5: 1, 6: 1}
0.800000/0.200000 (1823, 1824, 1668): 4, 7, 1, {0: 394, 1: 531, 2: 64, 3: 7, 4: 4}
0.900000/0.100000 (1786, 1786, 1669): 3, 3, 1, {0: 667, 1: 326, 2: 7}
0.950000/0.050000 (1828, 1828, 1665): 4, 4, 1, {0: 811, 1: 186, 2: 3}
BUIP038 (Original BUIP001 commit):
           SPLIT (block height, max blocks, avg blocks):  max fork depth, max orphans, avg orphans, { X:Y where Y runs had X forks }
0.500000/0.500000 (940, 1820, 1671): 23, 937, 418, {714: 1, 740: 1, 742: 1, 743: 1, 746: 1, 747: 1, 750: 1, 752: 2, 759: 2, 760: 1, 761: 2, 763: 1, 764: 2, 766: 1, 767: 1, 768: 2, 769: 1, 770: 4, 771: 2, 772: 1, 773: 2, 774: 5, 775: 5, 776: 4, 777: 4, 778: 6, 779: 3, 780: 10, 781: 1, 782: 3, 783: 9, 784: 2, 785: 9, 786: 12, 787: 8, 788: 6, 789: 5, 790: 4, 791: 4, 792: 14, 793: 7, 794: 9, 795: 6, 796: 9, 797: 8, 798: 9, 799: 11, 800: 9, 801: 13, 802: 11, 803: 12, 804: 17, 805: 11, 806: 10, 807: 9, 808: 12, 809: 14, 810: 11, 811: 15, 812: 9, 813: 12, 814: 15, 815: 14, 816: 9, 817: 11, 818: 10, 819: 14, 820: 20, 821: 3, 822: 10, 823: 14, 824: 15, 825: 15, 826: 10, 827: 10, 828: 13, 829: 17, 830: 15, 831: 19, 832: 11, 833: 13, 834: 11, 835: 10, 836: 16, 837: 14, 838: 13, 839: 9, 840: 9, 841: 10, 842: 13, 843: 12, 844: 6, 845: 10, 846: 8, 847: 5, 848: 10, 849: 14, 850: 10, 851: 12, 852: 10, 853: 11, 854: 10, 855: 8, 856: 10, 857: 8, 858: 5, 859: 4, 860: 5, 861: 5, 862: 7, 863: 3, 864: 4, 865: 3, 866: 1, 867: 4, 868: 7, 869: 2, 870: 4, 871: 5, 872: 5, 873: 6, 874: 5, 876: 2, 877: 3, 878: 2, 879: 1, 880: 3, 881: 4, 882: 6, 883: 1, 884: 2, 886: 1, 889: 1, 890: 2, 891: 2, 892: 1, 893: 2, 894: 1, 896: 3, 897: 1, 898: 1, 900: 2, 901: 2, 908: 1, 912: 1, 913: 2, 923: 1, 932: 1}
0.600000/0.400000 (1101, 1800, 1669): 19, 744, 334, {595: 2, 598: 1, 599: 2, 602: 1, 603: 1, 604: 1, 607: 7, 608: 1, 609: 2, 610: 1, 611: 5, 612: 2, 613: 3, 614: 3, 615: 3, 616: 3, 617: 4, 618: 8, 619: 6, 620: 2, 621: 2, 622: 3, 623: 6, 624: 5, 625: 7, 626: 5, 627: 5, 628: 5, 629: 11, 630: 3, 631: 9, 632: 7, 633: 11, 634: 7, 635: 10, 636: 9, 637: 7, 638: 8, 639: 8, 640: 14, 641: 7, 642: 10, 643: 11, 644: 13, 645: 17, 646: 7, 647: 12, 648: 9, 649: 13, 650: 16, 651: 13, 652: 15, 653: 14, 654: 12, 655: 14, 656: 20, 657: 9, 658: 15, 659: 14, 660: 16, 661: 11, 662: 15, 663: 28, 664: 16, 665: 9, 666: 16, 667: 17, 668: 18, 669: 17, 670: 15, 671: 14, 672: 9, 673: 13, 674: 18, 675: 10, 676: 8, 677: 19, 678: 18, 679: 8, 680: 11, 681: 13, 682: 17, 683: 15, 684: 8, 685: 8, 686: 13, 687: 12, 688: 8, 689: 10, 690: 6, 691: 10, 692: 7, 693: 9, 694: 9, 695: 8, 696: 2, 697: 5, 698: 8, 699: 3, 700: 2, 701: 4, 702: 6, 703: 8, 704: 3, 705: 4, 706: 3, 707: 5, 708: 1, 709: 4, 710: 4, 711: 5, 712: 5, 713: 2, 714: 3, 715: 1, 716: 1, 717: 2, 718: 4, 720: 1, 721: 2, 722: 2, 723: 2, 724: 1, 725: 1, 726: 1, 727: 1, 729: 1, 736: 1, 737: 1, 744: 1}
0.667000/0.333000 (1219, 1785, 1670): 21, 624, 278, {512: 3, 513: 4, 514: 6, 515: 4, 516: 7, 517: 8, 518: 3, 519: 5, 520: 5, 521: 9, 522: 10, 523: 11, 524: 9, 525: 8, 526: 8, 527: 10, 528: 13, 529: 9, 530: 10, 531: 11, 532: 13, 533: 7, 534: 15, 535: 12, 536: 15, 537: 13, 538: 10, 539: 19, 540: 20, 541: 17, 542: 16, 543: 20, 544: 11, 545: 19, 546: 24, 547: 12, 548: 13, 549: 14, 550: 17, 551: 19, 552: 11, 553: 22, 554: 9, 555: 13, 556: 15, 557: 26, 558: 15, 559: 32, 560: 15, 561: 17, 562: 10, 563: 14, 564: 17, 565: 13, 566: 13, 567: 16, 568: 14, 569: 17, 570: 10, 571: 15, 572: 10, 573: 4, 574: 9, 575: 10, 576: 7, 577: 13, 578: 15, 579: 12, 580: 11, 581: 7, 582: 10, 583: 7, 584: 5, 585: 9, 586: 5, 587: 10, 588: 4, 589: 2, 590: 1, 591: 1, 592: 3, 593: 5, 594: 4, 595: 4, 596: 4, 597: 1, 598: 2, 599: 2, 600: 3, 601: 3, 602: 1, 603: 2, 604: 2, 606: 1, 607: 1, 611: 1, 612: 1, 613: 1, 615: 1, 624: 1, 476: 1, 479: 1, 483: 1, 484: 1, 488: 1, 489: 2, 498: 1, 499: 2, 501: 3, 502: 2, 503: 3, 505: 1, 506: 2, 507: 4, 508: 1, 509: 2, 510: 2, 511: 2}
0.750000/0.250000 (1362, 1788, 1669): 11, 478, 209, {353: 1, 355: 1, 356: 1, 357: 1, 362: 2, 364: 1, 365: 1, 368: 1, 370: 2, 371: 1, 373: 4, 374: 3, 375: 2, 377: 3, 378: 2, 379: 2, 380: 2, 381: 6, 382: 2, 383: 5, 384: 5, 385: 6, 386: 5, 387: 4, 388: 6, 389: 8, 390: 6, 391: 8, 392: 17, 393: 6, 394: 7, 395: 14, 396: 7, 397: 18, 398: 19, 399: 22, 400: 25, 401: 14, 402: 23, 403: 15, 404: 12, 405: 24, 406: 23, 407: 22, 408: 18, 409: 16, 410: 13, 411: 23, 412: 15, 413: 28, 414: 16, 415: 13, 416: 24, 417: 13, 418: 20, 419: 16, 420: 21, 421: 18, 422: 12, 423: 17, 424: 18, 425: 20, 426: 21, 427: 22, 428: 20, 429: 13, 430: 13, 431: 12, 432: 12, 433: 11, 434: 16, 435: 21, 436: 10, 437: 11, 438: 14, 439: 7, 440: 10, 441: 7, 442: 6, 443: 13, 444: 13, 445: 3, 446: 2, 447: 4, 448: 5, 449: 8, 450: 5, 451: 3, 452: 7, 453: 2, 454: 4, 455: 2, 456: 5, 457: 1, 458: 1, 459: 3, 460: 1, 461: 3, 462: 1, 463: 2, 464: 1, 465: 2, 468: 1, 474: 1, 478: 1}
0.800000/0.200000 (1432, 1786, 1666): 7, 392, 167, {278: 1, 281: 1, 283: 1, 284: 1, 285: 2, 286: 1, 288: 1, 289: 2, 290: 3, 291: 2, 292: 5, 293: 1, 294: 3, 295: 3, 296: 5, 297: 4, 298: 6, 299: 6, 300: 4, 301: 5, 302: 7, 303: 3, 304: 6, 305: 8, 306: 3, 307: 9, 308: 11, 309: 11, 310: 16, 311: 7, 312: 6, 313: 8, 314: 11, 315: 12, 316: 12, 317: 18, 318: 23, 319: 19, 320: 16, 321: 19, 322: 15, 323: 21, 324: 14, 325: 19, 326: 19, 327: 27, 328: 15, 329: 21, 330: 24, 331: 28, 332: 24, 333: 20, 334: 25, 335: 24, 336: 18, 337: 24, 338: 15, 339: 19, 340: 22, 341: 20, 342: 15, 343: 17, 344: 24, 345: 15, 346: 22, 347: 14, 348: 13, 349: 12, 350: 9, 351: 15, 352: 11, 353: 5, 354: 16, 355: 6, 356: 12, 357: 7, 358: 7, 359: 5, 360: 6, 361: 11, 362: 10, 363: 3, 364: 5, 365: 5, 366: 7, 367: 3, 368: 3, 369: 3, 370: 4, 371: 3, 372: 1, 373: 3, 374: 5, 375: 1, 376: 1, 378: 1, 380: 1, 382: 1, 384: 1, 392: 1}
0.900000/0.100000 (1633, 1828, 1667): 4, 211, 84, {131: 2, 133: 1, 135: 4, 136: 2, 137: 3, 138: 2, 139: 2, 140: 4, 141: 4, 142: 5, 143: 6, 144: 4, 145: 8, 146: 10, 147: 10, 148: 12, 149: 10, 150: 16, 151: 19, 152: 14, 153: 19, 154: 17, 155: 14, 156: 35, 157: 25, 158: 23, 159: 34, 160: 25, 161: 28, 162: 21, 163: 34, 164: 32, 165: 29, 166: 29, 167: 23, 168: 35, 169: 37, 170: 19, 171: 29, 172: 31, 173: 32, 174: 24, 175: 26, 176: 24, 177: 21, 178: 29, 179: 22, 180: 18, 181: 15, 182: 17, 183: 8, 184: 7, 185: 7, 186: 12, 187: 10, 188: 11, 189: 3, 190: 5, 191: 4, 192: 2, 193: 2, 194: 3, 195: 2, 196: 2, 197: 1, 198: 3, 199: 3, 200: 2, 201: 1, 203: 1, 204: 1, 205: 1, 208: 1, 211: 1, 113: 1, 122: 1}
0.950000/0.050000 (1706, 1789, 1667): 3, 115, 42, {57: 2, 58: 1, 59: 1, 60: 3, 61: 1, 63: 1, 64: 7, 65: 4, 66: 6, 67: 8, 68: 13, 69: 14, 70: 17, 71: 18, 72: 25, 73: 18, 74: 27, 75: 21, 76: 32, 77: 40, 78: 36, 79: 44, 80: 42, 81: 49, 82: 47, 83: 43, 84: 33, 85: 39, 86: 44, 87: 54, 88: 30, 89: 24, 90: 27, 91: 26, 92: 36, 93: 15, 94: 26, 95: 15, 96: 20, 97: 15, 98: 11, 99: 11, 100: 10, 101: 13, 102: 6, 103: 2, 104: 9, 105: 4, 106: 2, 107: 2, 109: 2, 110: 1, 112: 1, 114: 1, 115: 1}

译者注:我正在翻译Bitcoin Unlimited开发者写的技术文章,这是一个系列,帮助比特币用户了解Bitcoin Unlimited客户端。 这个系列技术性非常强,我译的非常吃力。经常会出现语句我无法理解,所以译文经常会出现不通畅的地方。请读者见谅。

在这里非常感谢币友 @PC 不厌其烦地回答我各种难句的翻译问题。谢谢。

声明:此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。本网站所提供的信息,只供参考之用。

点击阅读全文