-
Notifications
You must be signed in to change notification settings - Fork 130
/
README.rus
85 lines (80 loc) · 9.45 KB
/
README.rus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
Описание криптовалюты cheatcoin
-------------------------------
-- Версия документа T13.654-T13.701 $DVS:time$
В cheatcoin каждый блок состоит из одной транзакции и в то же время является адресом,
на который можно перечислять монеты. В дальнейшем будем использовать слова блок,
транзакция и адрес как синонимы. Транзакция забирает из адресов-входов данное число
монет и направляет их адресам-выходам, каждому - указанную сумму, а также часть монет
оставляет в своём блоке и часть передаёт в качестве вознаграждения другому блоку,
который первым сошлётся на данный блок и включит его в общую сеть. Каждые 64 секунды
один из блоков становится главным, в нём генерируются новые монеты. Максимально
возможное число монет - читкоинов - 2^32, а одном читкоине 2^32 читош. В первых 2^21
главных блоках (примерно 4 года) генерируется по 1024 читкоина, всего 2^31,
в следующих 2^21 блоках по 512 читкоинов и далее примерно раз в 4 года вознаграждение
делится пополам и уменьшается до 0 примерно через 172 года.
У каждой транзакции может быть до 15-ти ссылок на другие блоки - входов и выходов.
Будем говорить, что блок A является потомком блока B, если от A до B
можно перейти по ссылкам на блоки. Цепь блоков - последовательность, в которой
каждый следующий блок является потомком предыдущего. Сложность блока - это величина,
обратная его хешу (двойной sha256), сложность цепи блоков - сумма сложностей блоков.
Цепь максимальной сложности среди тех, у которых все блоки принадлежат разным
64-секундным интервалам называется главной. Главные блоки - это блоки главной цепи.
Транзакция считается действительной, если некоторый главный блок является её
потомком. Вознаграждение за включение транзакции в сеть достаётся первому из блоков,
который ссылается на этот блок, где первенство определяется по следующему порядку:
предки предыдущего главного блока предшествуют предкам следующего; вначале идут
предки блока, затем сам блок; предки блока, в которые можно попасть по первой ссылке
из данного блока предшествуют тем, в которые можно попасть по второй и т. д.
Если транзакции противоречат друг другу (двойная трата), то выполняется та из них,
которая идёт раньше по этому порядку.
Блок имеет фиксированный размер 512 байт и состоит из 16 записей по 32 байта.
Каждая запись имеет тип, который занимает 4 бита. Так, запись типа 0 - это случайные
32 байта, назначение которых не оговорено, запись типа 1 - заголовок блока.
Заголовок находится в 0-й записи блока, он содержит типы всех блоков, метку времени
и размер вознаграждения за ссылку на этот блок. Метка времени выражается в 1024-х
долях секунды, прошедших с 1 января 1970 года GMT (эра unix). Количество монет
определяется 8-байтовым числом и выражается в читошах: старшие 4 байта - число
читкоинов, а младшие - число читош. Младшие 24 байта хеша блока являются адресом,
соответствующим блоку и в то же время ссылкой на блок. Для записи адреса
в символьной форме используется нотация base64 с набором символов [0-9 a-f A-F / +].
Адрес состоит из 32 символов. Создатель каждого блока должен сгенерировать хотя бы
одну пару из открытого и закрытого ключа метода шифрования ECDSA, размер открытого
ключа - 64 байта (512 бит). Всюду принят little endian порядок байт.
Типы записей в блоке:
0 - произвольные данные; если 0-я запись в блоке имеет этот тип, то блок - это
сообщение транспортного уровня, пересылаемое между хостами, при этом тип первой
записи определяет тип сообщения; 0-я запись содержит параметры сообщения,
1-я - id запроса или ответа (равный id запроса), 2-я и последующие -
структуру cheatcoin_stats, содержащую статистику сети; типы сообщений:
0 - запрос прислать все блоки, попадающие в данный отрезок времени:
начало и конец отрезка времени содержатся в 2-м и 3-м 8-байтовом
числе 0-й записи;
1 - уведомление, что запрос типа 0 выполнен; присылается после всех
блоков, 1-я запись содержит тот же id, который был в запросе;
1 - заголовок (версия 1), имеет структуру:
8 (младших) байт - заголовок транспортного уровня, при вычислении всех хешей
это поле полагается равным 0;
8 байт - типы 16-ти записей этого блока по 4 бита на тип;
8 байт - метка времени блока;
8 байт - вознаграждение за включение блока в сеть;
2 - вход транзакции:
24 байта - младшие байты хеша (двойной sha256) блока-входа;
8 байт - количество монет, забираемых с этого входа;
3 - выход транзакции:
24 байта - младшие байты хеша (двойной sha256) блока-выхода;
8 байт - количество монет, отправляемых на этот выход;
4 - половина подписи блока; удостоверяет, что у создателя блока есть закрытый ключ;
подписи одного типа группируюются по парам в порядке следования:
32 байта - число r или s подписи ECDSA, которой подписан хеш (двойной sha256)
записи, состоящей из блока, в котором данная и все следующие подписи
(в том числе отпирающие) заменены нулями, и соответствующего открытого
ключа длиной 33 байта: вначале байт чётности (2 или 3), затем ключ;
5 - половина отпирающей подписи блока; подобна типу 4, за тем исключением,
что в транзакции, выводящей монеты из данного блока, должен быть открытый ключ,
соответствующий одной из отпирающих подписей данного блока, и соответствующая
подпись к нему (которая может не быть отпирающей в транзакции);
6 - открытый ключ с чётностью 0:
32 байта - координата X из метода шифрования EСDCA, при этом Y чётно;
7 - открытый ключ с чётностью 1:
32 байта - координата X из метода шифрования EСDCA, при этом Y нечётно;
8...15 - зарезервированы для более поздних версий протокола.