Блокчейн

Боль­шин­ство моих ЖЖ-дру­зей, навер­ное, в кур­се, что это, и как это рабо­та­ет. Но вдруг кто не зна­ет или не пони­ма­ет.

Самое глав­ное в блок­чейне — это функ­ция одно­сто­рон­не­го шиф­ро­ва­ния, часто назы­ва­е­мая хеш-функ­ци­ей. Одно­сто­рон­нее шиф­ро­ва­ние созда­ёт из бло­ка дан­ных шифр-текст (хеш) опре­де­лён­ной дли­ны, кото­рый невоз­мож­но рас­шиф­ро­вать назад без тупо­го пере­бо­ра всех воз­мож­ных изна­чаль­ных вари­ан­тов. Про­ще все­го думать о хеше как об циф­ро­вом отпе­чат­ке паль­цев. Люди вон какие раз­ные — и по росту, и по цве­ту глаз, волос, и про­че­го, а отпе­чат­ки паль­цев — это их хеш, уни­каль­ный для каж­до­го инди­ви­ду­у­ма.

Если два экс­пер­та про­ве­дут дак­ти­ло­ско­пи­ро­ва­ние одно­го и того же чело­ве­ка, они полу­чат (во вся­ком слу­чае, долж­ны) оди­на­ко­вый резуль­тат. Так и с ком­пью­те­ра­ми — если два чело­ве­ка будут исполь­зо­вать один и тот же алго­ритм хеши­ро­ва­ния на одном и том же набо­ре дан­ных, они долж­ны полу­чить один и тот же хеш. То-есть, если у тебя есть кусок тек­ста, и у меня есть кусок тек­ста, мы его хеши­ру­ем одним и тем же алго­рит­мом, и у нас полу­ча­ет­ся оди­на­ко­вый хеш — это зна­чит, что кус­ки тек­ста, кото­рые мы ана­ли­зи­ро­ва­ли, 100% иден­тич­ны (1).

Теперь постро­им свой соб­ствен­ный при­ми­тив­ный блок­чейн. Блок­чейн — это block chain, т.е. цепь из бло­ков. Каж­дым бло­ком внут­ри нашей цепи будут 5 кус­ков тек­ста, раз­де­лён­ных запя­ты­ми: хеш преды­ду­ще­го бло­ка, три кус­ка «полез­ной нагруз­ки», и хеш для это­го бло­ка. Хра­нить в блок­чейне мож­но любые дан­ные, но допу­стим у нас будет хра­нит­ся инфор­ма­ция о финан­со­вых тран­зак­ци­ях. Исполь­зо­вать будем алго­ритм хеши­ро­ва­ния MD5 (2)

Постро­им пер­вый блок. Так как это началь­ный блок в цепи бло­ков, у него не может быть хеша преды­ду­ще­го бло­ка. Ну и пле­вать, при­ду­ма­ем свой. abcdefghijklmopqrstuvwxyz1234567 — вполне сго­дит­ся. Далее ука­зы­ва­ем тран­зак­цию, кто кому запла­тил, и сколь­ко: Маша,Олег,5 руб­лей. И хеши­ру­ем всё это вме­сте:

md5sum «abcdefghijklmopqrstuvwxyz1234567,Маша,Олег,5 руб­лей», полу­ча­ем хеш a61d142c8be7fac8b41da05d11c9f76e.

Всё, вот пер­вый блок в нашем блок­чейне:

abcdefghijklmopqrstuvwxyz1234567,Маша,Олег,5 рублей,a61d142c8be7fac8b41da05d11c9f76e

Стро­им вто­рой блок, где Серё­жа запла­тил Тане 3 руб­ля:

md5sum «a61d142c8be7fac8b41da05d11c9f76e,Серёжа,Таня,3 руб­ля», полу­ча­ем хеш 20e22c43963d6ee9bbc71d65c4251492, и, соот­вет­ствен­но, блок:

a61d142c8be7fac8b41da05d11c9f76e,Серёжа,Таня,3 рубля,20e22c43963d6ee9bbc71d65c4251492

И теперь наш блок­чейн выгля­дит так:

abcdefghijklmopqrstuvwxyz1234567,Маша,Олег,5 рублей,a61d142c8be7fac8b41da05d11c9f76e
a61d142c8be7fac8b41da05d11c9f76e,Серёжа,Таня,3 рубля,20e22c43963d6ee9bbc71d65c4251492

Ну, и так далее, бло­ков мож­но добав­лять до окон­ча­ния места на жёст­ком дис­ке.

Чем это кру­то? Тем, что блок­чейн лежит в сво­бод­ном досту­пе, и ЛЮБОЙ чело­век, взяв этот блок­чейн, может соб­ствен­но­руч­но пере­вы­чис­лить все хеши и про­ве­рить все запи­си: если хеши сов­па­да­ют, зна­чит, инфор­ма­ции мож­но дове­рять. Имен­но этим и зани­ма­ют­ся май­не­ры — они пере­про­ве­ря­ют тран­зак­ции для крип­то­ва­лют, то-есть, обес­пе­чи­ва­ют функ­ци­о­ни­ро­ва­ние пла­тёж­ной систе­мы, за что им отстё­ги­ва­ют денег.

В блок­чейне мож­но хра­нить всё, что долж­но быть общим досто­я­ни­ем и в то же вре­мя тре­бу­ет стро­гой про­вер­ки — напри­мер, заве­ща­ния, тек­сты зако­нов, и т.д. В любой момент мож­но всё пере­про­ве­рить.

1. 100% гаран­тии, разу­ме­ет­ся, быть не может, но если алго­ритм шиф­ро­ва­ния нор­маль­ный и не име­ет кол­ли­зий (это когда два раз­ных набо­ра дан­ных дают один и тот же хеш), то веро­ят­ность сов­па­де­ния будет при­мер­но 1/количество воз­мож­ных хешей, т.е. для хеша дли­ной 128 бит это 2.94E-39, или пре­не­бре­жи­тель­но мало. Для хеша дли­ной 512 бит это вооб­ще чис­ло со 150+ сим­во­ла­ми после деся­тич­ной точ­ки.
2. Алго­ритм хеши­ро­ва­ния MD5 доста­точ­но хре­но­вый по совре­мен­ным мер­кам, и име­ет кол­ли­зии. Прав­да, для реаль­но чита­е­мо­го чело­ве­ком тек­ста мож­но пре­не­бречь — все суще­ству­ю­щие при­ме­ры кол­ли­зий это хеши спе­ци­аль­но сге­не­ри­ро­ван­ных дво­ич­ных дан­ных. Но в реаль­но рабо­чих при­ло­же­ни­ях, тем не менее, реко­мен­ду­ет­ся исполь­зо­вать более кол­ли­зи­он­но­устой­чи­вые алго­рит­мы, типа SHA-256 (исполь­зу­ет­ся в блок­чейне для бит­ко­и­на) или SHA‑3.