Solana - не Эфир
Original: https://teletype.in/@mcdry/solana
До этого мы уже делали статью по поводу того как сделать контракт для раскидки соланы на несколько кошельков.
Так вот мы подумали что не написали достаточно информации про сам блокчейн, а также как на нем все работает. Поэтому в этой статье достаточно много полезных фактов и информации, о которых не знают большинство людей.
Содержание
Полезные Факты про Транзакции и Контракты
Общая Информация
Кратко о блокчейне
Солана это достаточно новый блокчейн с уже достаточно не маленькой базой юзеров. Работает на методах Proof of stake и Proof of history, о которых мы опишем по подробнее снизу. Минимальная комиссия за транзакции и утверждения команды создателей что количество транзакций в секунду может доходить до 70к, хотя реалистично в среднем через солану проходит около 2.5к транзакций в секунду. Оригинальный план создателей был придумать что-то инновационное что могло бы помочь с большой комиссией, очень медленной скоростью выполнения транзакций, и в целом очень маленькой пропускаемостью транзакций - на тот момент (2017 г.) через большинство блокчейнов проходило всего по 15 транзакций в секунду.
Как работает блокчейн
Солановский блокчейн работает на комбинации двух алгоритмов - Proof of Stake и Proof of History.
Такая система очень сильно отличается от алгоритма Proof of Work на эфириуме, так как POW требует достаточно мощное оборудование чтобы юзеры соревновались друг с другом в вычислении хешов для воссоздания блоков и транзакций.
На солане с другой стороны, более мощное оборудование тебе не даст никакого преимущества.
Алгоритм POS требует юзеров стейкать солану чтобы иметь шанс быть выбранным для создания следующего блока. Соответственно чем больше застейкано соланы - тем больше шансов замайнить новые блоки. А чем больше блоков ты майнишь, тем больше прибыли ты получаешь с комиссий транзакций. Это приводит к своеобразной системе лояльности юзеров к солане.
Также, по скольку валидаторы выбираются рандомно, то скорость выполнения транзакций будет всегда одинаковая, соответственно комиссия ничего решать не будет. Поэтому не удивляйтесь когда ваша транзакция долго не будет проходить при завышенном трафике на блокчейне.
Если POS выбирает кто будет майнить тот или инной блок, то POH как раз-таки помогает ему криптографически подтверждать и соединять те или инные ивенты которые происходят, чтобы иметь полную синхронизацию всей сети, и удостовериться что все транзакции расположенны в правильном порядке и так скажем найдены правильным валидатором.
Два выше описанных алгоритма позволяют солане добиться таких скоростей, а также они потребляют очень мало энергии, что позволяет солане быть достаточно экологически чистым блокчейном по сравнению с другими. (В теории одна транзакция на эфире = 60,000 транзакций на солане)
Полезные Факты про Транзакции и Контракты
Транзакции
Транзакции на солане тоже не мало отличаются от других блокчейнов. Они состоят из неограниченного количества более мелких транзакций которые на солане называются инструкциями. Из чего же состоит инструкция? Инструкция может быть любой транзакцией, начиная с обычного трансфера соланы с одного аккаунта на другой, заканчивая минтом нфт.
Используя лишь пару библиотек на javascript можно вполне написать достаточно сложные транзакции которые по функционалу не будут уступать некоторым контрактам.
И теперь вы нас наверняка спросите - получается предыдущий гайд по написанию контракта для диспарсера бесполезен? Технически да, так как можно спокойно напихать сколько угодно инструкций по трансферу в одну транзакцию и заплатить ровно столько же комиссии как с одного трансфера. Но во первых, это хорошая практика, а во вторых, через контракт все будет выполняться быстрее так как он находится в самом блокчейне.
Контракты
Контракты на солане пишутся на c-type языке программирования - rust. Хоть он и не настолько популярен, но у него есть очень неплохое преимущество над солидити (язык блокчейна эфириума) - его также можно использовать в других сферах и индустриях. Раст используется популярными компаниями по типу Amazon, Microsoft, Mozilla, Google, Dropbox, поэтому с этим языком точно не пропадешь.
На данный момент конечно же, написание контрактов на солане не настолько популярно, потому что не так много людей в этом полноценно разбираются, а также на блокчейне соланы пока не придумали адекватные способы верификации контрактов, из-за чего невозможно никак даже посмотреть и поучиться с контрактов каких-то больших проектов. Из-за этого на солане пока что нет больших возможностей и потенциала написания контрактов, особенно новичкам, для которых нет большой помощи
Токены и нфт
Это наверное самая интересная часть статьи, так как нфт и токены в целом - самая важная и популярная часть соланы, так как они способствовали большинству хайпа солановского блокчейна.
В отличии от эфира все токены и нфт на солане относятся к одной общей группе - SPL (Solana Program Library) Token. Соответственно взаимодействовать со всеми ними достаточно удобно.
И как мы говорили выше про преимущества обычных транзакций, можно спокойно создать токен не используя никаких контрактов, потому что токены привязываются к создателю.
Но самая главная вещь, которая как раз-таки позволяет токену существовать самому по себе без всяких контрактов - токен аккаунт. Изначально, на вашем кошельке вы можете хранить только солану. Чтобы хранить любой другой токен вам надо обязательно иметь специальные токен аккаунты под каждый токен. Вам конечно ни за что беспокоиться не надо, так как все махинации с этими аккаунтами проводятся за вас при переводах, минтах, и т.д, с вас просто при создании такого токен аккаунта снимается чуть больше комиссии чем обычно.
Также раз токен аккаунты можно создать, их также можно удалить, и при удалении вернуть комиссию которую потратили на их создание. Ручками это никак не сделаешь, но вот тут небольшой пример мини приложения которое отображает все ваши ПУСТЫЕ токен аккаунты, а так же через написанный контракт позволяет удалить их и вернуть за них комиссию. (за сайт не ручаемся)
Небольшой пример создания токена
Тут небольшой кусочек кода на typescript (код также полностью будет работать на js, большой разницы нет) который показывает как создать свой токен:
// Все нужные библиотеки которые надо установить через npm или yarn
import { clusterApiUrl, Connection, Keypair } from "@solana/web3.js";
import {
createInitializeMintInstruction,
TOKEN_PROGRAM_ID,
MINT_SIZE,
getMinimumBalanceForRentExemptMint,
createMint,
} from "@solana/spl-token";
import * as bs58 from "bs58";
// анонимная функция, очень удобно их использовать при тестах
(async () => {
// Инициализация подключения к девнету блокчейна
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
// подписчик транзакции
const feePayer = Keypair.fromSecretKey(
bs58.decode("Приватный ключ который можно экспортировать из вашего кошелька")
);
// авторитет/владелец, который потом сможет изменять и блокировать токен
const authority = Keypair.fromSecretKey(
bs58.decode("Приватный ключ")
);
// Используем встроенную функцию
let mintPubkey = await createMint(
connection, // Подключение к блокчейну
feePayer, // Подписчик транзакции
authority.publicKey, // Авторитет/владелец токена
authority.publicKey, // Авторитет заморозки токенов
8 // количество десятичных разрядов (в данном случае один токен = 100000000 так называемых частиц (по типу лампортов на солане))
);
console.log(`mint: ${mintPubkey.toBase58()}`); // минт адрес токена
})();Для минта нужно использовать минт адрес который мы получили при создании токена используя код выше
import {
clusterApiUrl,
Connection,
PublicKey,
Keypair,
Transaction,
getAccountInfo
} from "@solana/web3.js";
import {
createMintToCheckedInstruction,
createAssociatedTokenAccountInstruction,
getAssociatedTokenAddress,
TOKEN_PROGRAM_ID,
ASSOCIATED_TOKEN_PROGRAM_ID
} from "@solana/spl-token";
import * as bs58 from "bs58";
(async () => {
// Инициализация подключения
const connection = new Connection(clusterApiUrl("devnet"), "confirmed");
const feePayer = Keypair.fromSecretKey(
bs58.decode("Приватный ключ")
);
// можно также получить ключ авторитета имея лишь публичный адрес
// используя конструктор new PublicKey("Публичный адрес авторитета")
const authority = Keypair.fromSecretKey(
bs58.decode("Приватный ключ")
);
const mintPubkey = new PublicKey("Минт адрес который получили из функции выше");
// тут придется транзакцию создавать самому, так как надо также создать токен аккаунт для получателя
const tx = new Transaction()
// получаем адрес токен аккаунта
const receiverTokenAddress = await getAssociatedTokenAddress(
mintPubkey, // минт адрес токена
feePayer.publicKey, // получатель
false, // не столь важная переменная
TOKEN_PROGRAM_ID, // общий контракт всех токенов
ASSOCIATED_TOKEN_PROGRAM_ID // общий контракт всех токен аккаунтов
);
// получаем сам токен аккаунт получателя
const receiverTokenAccount = await connection.getAccountInfo(
receiverTokenAddress
);
// если токен аккаунта не существует то добавляем инструкцию по созданию его в транзакцию
if (receiverTokenAccount === null) {
const createATAInstruction = createAssociatedTokenAccountInstruction(
feePayer, // подписчик транзакции
receiverTokenAddress, // получатель (его токен адрес)
feePayer.publicKey, // публичный адрес получателя
mintPubkey, // минт адрес токена
TOKEN_PROGRAM_ID, // общий контракт всех токенов
ASSOCIATED_TOKEN_PROGRAM_ID // общий контракт всех токен аккаунтов
);
tx.add(createATAInstruction);
}
// добавляем саму функцию минта в транзакцию
tx.add(
createMintToCheckedInstruction(
mintPubkey, // минт адрес токена
receiverTokenAddress, // получатель (его токен аккаунт)
alice.publicKey, // авторитет минта
1e8, // количество токенов (в 8 степени так как 1 токен = 100000000 частиц)
8 // количество дробных разрядов
)
);
// и отправляем саму транзакцию
const signature = await connection.sendTransaction(tx, [feePayer]);
})();В примере выше мы создаем объект транзакции, и добавляем в нее две инструкции - создание токен аккаунта у получателя (feePayer), и потом сам минт одного токена на кошелек получателя.
Единственная проблема - у токена не будет никаких метаданных, поэтому в фантоме он будет выглядить как-то так:
Чтобы у токена появилась фотка, название, символ, надо самому физически добавить метаданные в базу токенов на гитхабе соланы. Там можно найти всю подробную информацию и инструкцию.
Теперь, так как вы хотя бы кратко понимаете работу токенов на солане, давайте более подробно рассмотрим нфт.
Как вы уже можете догадываться, никакие нфт на солане не имеют своего личного контракта. Они все привязаны к одному контракту, более известного как candy machine. Единственное что отделяет одни коллекции от других - candy machine id коллекции, а именно адрес/кошелек который генерируется при создании коллекции и через который как раз-таки используя методы про которые мы говорили выше, создаются все нфт (если что они создаются точно также как обычные токены, только процесс гораздо сложнее, так как нужны метаданные и т.д, а для них нужно создавать отдельные аккаунты, поэтому через канди машину делать все гораздо легче).
Вообще контракт candy machine в опен сурсе, и чисто технически любой человек может его полностью изучить (весь контракт состоит из 1400 строк 😱) и сделать свой контракт который мог бы спокойно минтить сразу несколько нфт и отправлять их всех на свой личный адрес, но в этом нет нужды так как к контракту канди машины можно легко подключится используя IDL (ABI), так как контракт верифицирован на блокчейне, и потом просто используя их функцию “mintNft”, передав в неё некоторые аргументы, можно спокойно минтить нфт любой коллекции. В подробности конечно вдаваться не будем, так как тогда точно будут минус все паблик сейлы на солане, поэтому dyor, инфы мы вам дали достаточно.
Вывод
Грязь конечно на солане не поделаешь, но у этого блокчейна есть достаточно не маленький потенциал. Лично по нашему мнению солана только начинает свой путь. Вполне возможно люди в скором времени проявят больший интерес в написании контрактов. Поэтому будет больше выборов чего-то за абузить, особенно если люди начнут писать свои контракты под нфт коллекции.
Лично нам кажется что метаплекс (создатели candy machine) не совсем стабильный репозиторий, так как у них не очень устойчивый код, постоянно что-то где-то меняется, ну и самая главная проблема - в любой момент они просто могут перестать поддерживать свои контракты.
На существующие коллекции это конечно не сильно повлияет, так как нфт привязаны не к контракту а к адресу который генерируется при создании новой коллекции через канди машину. Но это будет достаточно не маленькая проблема для новых коллекций.
У людей больше не будет шанса штамповать коллекции налево и направо, что на самом деле даже отрегулирует циркуляцию нфт на блокчейне и маркетплейсах. А также даст шансы хорошим кодерам попрактиковаться не только абузить такие контракты, а также и писать их и делать более усовершенствованными и защищенными.
Не забывайте подписываться на наш канал, нам было бы очень приятно. Скоро также выйдет статья про эфир и солидити.