Автор: Линь Гуаньхун / Призраки под рукой
Самородки:Талант /user/178526…
Гитхаб:Github.com/afan913337456...
Облачная колонка Tencent:cloud.Tencent.com/developer/U…
Кстати: моя техническая книга «Практика разработки блокчейн-приложений на Ethereum» опубликована и может быть приобретена в Интернете.
содержание
- пролог
- Алгоритм консенсуса PoS
- Особенности PoS
- Напишите PoS-код
- массив блоков-кандидатов
- Адрес узла в блоке
- произвести распределение капитала
- Победители выбираются на основе справедливости
- Заканчивать
пролог
Эта статья является предисловием к предыдущей, а ссылка на предыдущую:
nuggets.capable/post/684490…(1) Алгоритм консенсуса блокчейна: общее введение и общее объяснение форков
Эта статья будет посвящена
PoSАлгоритм консенсуса и используйте примеры кода, чтобы реалистично проиллюстрировать его
о什么是共识算法Эта проблема, пожалуйста, см.(1) Алгоритм консенсуса блокчейна: общее введение и общее объяснение форков, который уже дал ответ.
Алгоритм консенсуса PoS
PoSполное имяProof of Stake 股权证明. Буквально, владение акциями. То есть у кого больше акций, у того больше силы в словах, что тесно связано с ситуацией в нашей жизни.股份制公司Смысл акционеров почти такой же.
Однако при применении цепочки блоков мы не можем быть действительно привязаны к цепочке.节点Акции, а не что-то другое, эти вещи выступают в роли акций, и мы присваиваем эти вещи цепочке节点. Вот несколько примеров, иллюстрирующих эту концепцию.
НапримерPoSсуществует虚拟货币В приложенииXXXКоличество токенов для измерения, сколько акций этого узла это сколько говорят. Предположим, что мужская цепная сеть, в общей сложности3个节点, A и B и C, где узел A имеет 10 000 токенов XXX, а B и C имеют 1 000 и 2 000 токенов соответственно, то в этой сети Ethereum, скорее всего, будет выбран блок A, право на высказывание относительно велико.
В качестве другого примера предположим, что какое-то будущее非虚拟货币Блокчейн, публичная цепочка, цепочка, объединяющая физическую промышленность, такую как汽车链, мы можем положить каждый车主所拥немного车辆数目и他的车价值多少钱Распределение股份, например, чтобы указать формулу:车数*车价值 = 股份的多少,существуетPoSЧжунго — это концепция, концепция, которая измеряет право говорить.
Особенности PoS
Вышеприведенное описание уже объяснилоPoS共识算法的概念。 Потому что это拥有某样东西的数量Приходить衡量Это означает, что пока в наших узлах есть такие вещи, даже если у нас есть только一个, все имеют право высказаться, пусть оно очень маленькое, и даже не имеет шанса проявить себя, но шанс все же есть.
существуетPoS, блоки уже отчеканены (здесь нет понятия «майнинг», поэтому мы не используем это слово для доказательства доли),PoWЕсть понятие майнинг.
Это также привело к тому, что он имеет следующие особенности:
-
преимущество:
- Сокращение времени достижения консенсуса, более быстрые блоки консенсуса в цепочке
- Нет необходимости потреблять много энергии для моего
- Обман прибыли и убытки, потому что, если человек, владеющий более 51% капитала, обманывает, это эквивалентно обману самого себя, потому что он человек с наибольшим капиталом, и результат обмана таков, что чем больше у вас есть, тем больше больше потерь у вас есть.
-
недостаток:
- Стоимость атаки низкая, пока узел имеет количество элементов, таких как количество токенов, его можно запустить.
脏数据的区块攻击 - Кроме того, узлы с большим количеством токенов будут иметь большую вероятность получения учетных прав, что приведет к тому, что в сетевом консенсусе будет доминировать небольшое количество богатых учетных записей, что приведет к потере беспристрастности.
- Стоимость атаки низкая, пока узел имеет количество элементов, таких как количество токенов, его можно запустить.
Напишите PoS-код
Чтобы позволить большему количеству людей и не-разработчиков понять, следующее будет проходить伪代码Для достижения, пожалуйста, оставьте свою электронную почту для полного кода GO.
Сначала мы используем массив блоков-кандидатов для хранения, каждый节点Объект блока, переданный и сгенерированный его текущим узлом:
candidateBlocks [ ]Blocks 候选区块数组
каждый区块结构体Eсть变量используется для записи генерации этого блока节点地址из
type Block struct {
Timestamp string // 时间戳,代表该区块的生成时间
Hash string // 这个区块的 hash 值
PrevHash string // 这个区块的 上一个 区块的 hash 值
NodeAddress string // 生成这个区块的 节点地址
Data string // 区块携带的数据
}
тогда есть子线程, который конкретно отвечает за обход候选区块数组, в соответствии с区块адрес узла внутри获取его количество токенов, то分配股权
stakeRecord []string // 数组
for block ~ candidateBlocks {
coinNum = getCoinBalance(block.NodeAddress) // 获取代币数量
for i ~ coinNum { // 币有多少,就循环添加多少次
if stakeRecord.contains(block.NodeAddress) { // 是否以及包含了
break // 包含的就不再重复添加
}
stakeRecord = append(block.NodeAddress) // 添加
}
}
затем изstakeRecordсередина选出кампания胜利者. Эта вероятность такая же, как и вышеcoinNumАктуально, чем больше, тем больше шансов.
index = randInt() // 得出一个整形随机数
winner = stakeRecord[index] // 取出胜利者节点的地址
Наконец, мы можем вытащить этоwinnerСгенерированный блок используется для доступа к публичной цепочке, а затем транслируется.
for block ~ candidateBlocks {
if block.NodeAddress == winner {
// 添加
}
}
// 广播出去
...