Starknet – истинный ZK
Из всех L2 сетей, Старкнет самый особенный. И дело даже не в его EVM несовместимости, а в причине, из-за которой эта совместимость невозможна. Сейчас мы поговорим о языке Cairo.
Cairo это собственный язык программирования Старкнета, именно из-за него нам приходится проходить 9 кругов ада для пополнения кошелька, но именно благодаря ему Старкнет имеет преимущество над своим главным конкурентом – ZkSync.
Если говорить коротко и не вдаваться в техническую часть, то отличие Старкнета от ZkSync заключается в децентрализации первого, и централизации второго.
Starknet. Cairo позволяет создавать программы, которые могут генерировать доказательства с нулевым разглашением, используемые в технологии STARK. То есть, Zk-proof внедрен в работу блокчейна.
ZkSync. Solidity не поддерживает Zk-proof. В случае zkSync технология zero-knowledge proofs используется не на уровне смарт-контрактов, написанных на Solidity, а на уровне протокола zkSync самого по себе.
С общими положениями разобрались, теперь переходим к уровню advanced.
1. Принципы работы с данными: Фиксированное поле vs Разнообразие типов
В Cairo все данные представлены в форме чисел в ограниченном поле, что можно сравнить с игрой, где ваши передвижения ограничены размерами игрового поля. Вы не можете выйти за его пределы, и каждое действие должно соответствовать правилам поля.
func add(x : felt, y : felt) -> (result : felt): let (result) = x + y return (result) end
Solidity дает вам возможность использовать разные типы данных, подобно тому как в шахматах у вас есть разные фигурки: пешки, ладьи, кони, каждая с уникальными движениями и возможностями.
function add(uint x, uint y) public pure returns (uint) { return x + y; }
2. Подход к безопасности: Встроенная анонимность vs Опциональная анонимность
Поскольку Cairo спроектирован с учетом zk-STARKs, он как бы создает "невидимый" слой безопасности для транзакций, что можно сравнить с отправкой зашифрованных писем, где получатель может проверить, что письмо подлинное, не вскрывая конверт.
@view func transfer_proof_example{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}(sender : felt, recipient : felt, amount : felt): # Тело функции, которое генерирует zk-STARK доказательство # ... return () end
В Solidity анонимность не встроена, и это как отправка обычных писем с возможностью выбора использовать конверт или нет. Если вам нужна приватность, вы должны добавить дополнительные механизмы защиты. Например саму платформу ZkSync.
contract Transfer { event Transfer(address indexed from, address indexed to, uint amount); function transfer(address to, uint amount) public { emit Transfer(msg.sender, to, amount); } }
3. Масштабируемость и эффективность
Оптимизация под Cairo представляет собой процесс, направленный на уменьшение сложности вычислений, что можно сравнить с попыткой упаковать самолет максимально компактно, чтобы сократить расход топлива.
@view func get_optimized_sum{syscall_ptr : felt*, pedersen_ptr : HashBuiltin*, range_check_ptr}(x : felt, y : felt) -> (sum : felt): # В Cairo необходимо работать в ограниченном поле, так что все вычисления обязаны быть совместимыми с этим полем. # Это значит, что большие числа обрабатываются по-особенному, чтобы они "умещались" в это поле без переполнения. let (sum) = x + y return (sum) end
Solidity требует тщательной оптимизации под Ethereum, которая может быть похожа на попытку настроить автомобиль для гонок: каждая деталь важна и может существенно увеличить расходы на бензин.
Этот контракт использует меньше газа, поскольку использует более дешевые по газу операции и паттерны оптимизации.
contract GasOptimized { uint public total; function sum(uint[] memory array) public { for(uint i = 0; i < array.length; ++i) { total += array[i]; } } }
Мы разобрали лишь часть отличий Starknet и ZkSync, но этого достаточно что бы ответить на вопросы о различиях проектов. Первая часть статьи из цикла Starknet подошла к концу, надеемся это было полезно!