В последнее время протокол Runes является самым популярным проектом в экосистеме Биткойн.,Поэтому я использовал свое время ночью,Реализован протокол Runes с использованием языка Go.,Адрес проекта:https://github.com/bxelab/runestone,Также на основе этогоRunestoneБиблиотека записывает соответствующий клиент командной строки вздесь,на основеRunesГлубокое понимание протокола,Я обнаружил, что многие проекты в Интернете неправильно используют руны.,Поэтому я напишу еще одну техническую статью.,Давайте углубимся в подробности. Если вы хотите развивать руны,,Вы можете обратиться к нему.
Травление — это структура, используемая в протоколе записи рун для создания новых рун. Он содержит следующие необязательные поля:
divisibility
:Указывает на делимость рун。ЭквивалентноERC20вdecimalПоле,Десятичные знаки。type Terms struct {undefined Amount *uint128.Uint128 //Mint Сумма, которую можно отчеканить за один раз
Cap *uint128.Uint128 //Сколько раз можно принимать Мяту?
Height 2*uint64 //Разрешить начальную и конечную высоту Mint (абсолютное значение)
Offset 2*uint64 //Разрешить начальную и конечную высоту Mint (относительные значения, эквивалентные высоте выданной руны)
}Поскольку разрешен предварительный майнинг и последующий Mint, общее количество волос для этой руны составляет:
Предварительный майнинг+Сумма*Ограничение
Количество рун — uint128, а не uint256 в Эфириуме или uint64 в Биткойне, поэтому количество рун также может быть очень большим. 1.2 RuneId Идентификатор руныpremine
:Количество премайненных。Если не установлено, это означает отсутствие предварительного майнингаrune
:Имя руны,Кодирование целого числа в модифицированной базе -26.spacers
:Представляет символ-разделитель, отображаемый между символами названия руны.。symbol
:Символ валюты руны。одинUTF8характерterms
:Содержит пункт о приведении,Например, количество, верхняя предел、Начальная и конечная высота блока.
Вам необходимо дополнительно объяснить термины, которые определяются следующим образом:RuneId — уникальный идентификатор текста идентификатора.,Формируется высотой блока и кодированием индекса транзакции.,И сBLOCK:TX
текстовое представление。
Edict представляет собой структуру, используемую для передачи рун и содержит следующие поля:
id
:Вовлеченный Идентификатор руны。amount
:Количество переданных рун。output
:указанный выходной индекс。1.4 Сообщения протокола Runestone называются Runestones и содержат следующие поля:edicts
:один Указколлекция,Используется для передачи Руны.etching
:один Необязательныйиз Офорт,Используется для создания рун.mint
:один НеобязательныйизRuneId,Представляет идентификатор руны, которую нужно отчеканить.pointer
:один Необязательныйизu32,Указывает на выход, на который следует передать Руны, не выделенные Указом. 1.5 Кенотаф надгробиеКенотафы — это структуры, созданные, когда рунные камни не соответствуют правилам протокола. Это представляет собой недопустимую операцию записи и может привести к уничтожению введенных рун. То есть, если мы определяем руну, но она не соответствует спецификациям протокола, то руна будет помечена как надгробие.
Благодаря этим правилам Протокол записи рун обеспечивает уникальность и предсказуемость имен рун, а также предоставляет механизм, предотвращающий несанкционированное использование или злоупотребление именами. Это правило именования не только обеспечивает гибкость протокола Rune Inscription, но также обеспечивает безопасность и стабильность системы.
Сначала мы определяем объект Etching, затем создаем Runestone на основе этого объекта и используем Runestone для его кодирования и получения двоичных данных, необходимых для гравировки. Пример кода выглядит следующим образом:
runeName := "STUDYZY.GMAIL.COM"
symbol := 'всегда'
myRune, err := runestone.SpacedRuneFromString(runeName)
if err != nil {
fmt.Println(err)
return
}
amt := uint128.From64(666666)
ca := uint128.From64(21000000)
etching := &runestone.Etching{ //Определить травление
Rune: &myRune.Rune,
Spacers: &myRune.Spacers,
Symbol: &symbol,
Terms: &runestone.Terms{
Amount: &amt,
Cap: &ca,
},
}
r := runestone.Runestone{Etching: etching} // Построить рунный камень
data, err := r.Encipher() //кодирование двоичное
В протоколе рунических надписей,использовать БиткойнсценарийOP_RETURN
Опкод реализованEtchingтравление Ключевые шаги для загрузки контента。OP_RETURN
позволяет нам передавать определенные данные,То есть вышеуказанное кодирование в двоичную рунную информацию травление,Встроен в транзакции в блокчейне Биткойн. Эти данные постоянно записываются в блокчейн.,нельзя подделать,Каждой руне присвоен уникальный «символ».
существоватьторговляиз ВыводиспользоватьOP_RETURN
код операции,Далее следует MAGIC_NUMBER: OP_13,Затем следуйте рунической информации о травлении. Эта информация обычно включает имя руны, атрибуты и другие соответствующие данные. Этот выход не обязательно должен быть выходом № 0.
Ниже приведен код для создания сценария OP_RETURN:
//build op_return script
builder := txscript.NewScriptBuilder()
// Push OP_RETURN
builder.AddOp(txscript.OP_RETURN)
// Push MAGIC_NUMBER
builder.AddOp(MAGIC_NUMBER)
for len(payload) > 0 {
chunkSize := txscript.MaxScriptElementSize
if len(payload) < chunkSize {
chunkSize = len(payload)
}
chunk := payload[:chunkSize]
builder.AddData(chunk)
payload = payload[chunkSize:]
}
return builder.Script()
В протоколе записи рун, чтобы обеспечить легальность гравировки и предотвратить фронтальные атаки (Front-running), введены понятия TapScript и Commitment. TapScript является частью структуры Taproot Биткойна, обеспечивающей более эффективный и конфиденциальный формат транзакций.
func (r Rune) Commitment() []byte {
bytes := r.Value.Big().Bytes()
// Reverse bytes to get little-endian representation
for i, j := 0, len(bytes)-1; i < j; i, j = i+1, j-1 {
bytes[i], bytes[j] = bytes[j], bytes[i]
}
end := len(bytes)
for end > 0 && bytes[end-1] == 0 {
end--
}
return bytes[:end]
}
Далее мы можем собрать TapScript:
func CreateCommitmentScript(pk \*btcec.PublicKey, commitment []byte) ([]byte, error) {
builder := txscript.NewScriptBuilder()
//push pubkey
pk32 := schnorr.SerializePubKey(pk)
builder.AddData(pk32)
builder.AddOp(txscript.OP\_CHECKSIG)
//Commitment script
builder.AddOp(txscript.OP\_FALSE)
builder.AddOp(txscript.OP\_IF)
builder.AddData(commitment)
builder.AddOp(txscript.OP\_ENDIF)
return builder.Script()
}
Транзакция P2TR (Pay-to-Taproot) — это формат транзакции Биткойн, который использует структуру Taproot для повышения эффективности транзакций и конфиденциальности. Будь то предыдущий протокол Ordinals, BRC20 или текущая Rune Inscription, все они основаны на транзакциях P2TR. На предыдущих шагах 3.1 и 3.2 мы создали TapScript, на котором хотим вытравить надпись. Затем нам нужно перевести определенное количество BTC на адрес, соответствующий этому скрипту (эта транзакция называется Commit). TransactionОтправить транзакцию),Затем подождите, пока отправленная транзакция не будет успешно загружена в цепочку.,Ожидание номера подтверждения>=6,Затем мы можем инициировать Обратный Транзакция раскрывает транзакцию, которая включает только TapScript версии 3.2 и OP_RETURN версии 3.1.
Эта транзакция представляет собой обычную транзакцию перепечатки, переводящую определенное количество BTC на адрес P2TR, соответствующий TapScript. Будьте осторожны, не делайте ее слишком маленькой, иначе комиссии за обработку может не хватить для второй выявленной транзакции.
Детали этого травления не могут быть раскрыты сразу после того, как транзакция фиксации транслируется в сеть и включается в блок.
Вы должны дождаться, пока майнеры добудут как минимум 6 блоков. Этот временной интервал обеспечивает период наблюдения, чтобы гарантировать, что отправленные транзакции травления принимаются сетью и что нет других конфликтующих транзакций.
По истечении периода наблюдения можно создать вторую транзакцию, чтобы раскрыть детали гравировки, включая точное название руны и другие свойства, которые могли не быть раскрыты на этапе отправки.
Транзакция раскрытия также обычно содержит вывод OP_RETURN, кодирующий выгравированные данные в Data Push.
Эти две операции вместе завершают процесс создания и намотки руны. Первая транзакция обеспечивает безопасность и право собственности на имя, а вторая транзакция раскрывает в сети полную информацию о руне.
Таким образом, протокол записи рун не только защищает интересы создателя и предотвращает сквотирование имен, но также гарантирует, что все участники сети смогут проверить и принять вновь созданные руны.
Благодаря этому поэтапному процессу транзакции протокол записи рун обеспечивает безопасный и прозрачный способ добавления новых рун в блокчейн. Этот механизм повышает надежность всей системы и обеспечивает гибкость для будущих расширений и обновлений протокола.
Если руны, которые мы гравируем, позволяют Mint и соответствуют требованиям Mint (не завершены Mint, Mint полностью соответствует требованиям и т. д.), то мы можем отлить выгравированные определенные руны, создав транзакцию Mint.
Гравировка руны загружается в сеть Биткойн в раскрывающей транзакции 3.3. Высота блока в цепочке и значение индекса транзакции блока, в котором находится раскрывающая транзакция, вместе составляют уникальный идентификатор руны: RuneId. мы используем {высота блока}:{показать значение индекса транзакции} Определить руны, которые нужно разыграть, чтобы гарантировать их уникальность. Мы можем использовать Runestone для кодирования идентификатора руны, код:
runeIdStr := "2609649:946" //Вам нужен идентификатор Mint руны
runeId, _ := runestone.RuneIdFromString(runeIdStr)
r := runestone.Runestone{Mint: runeId}
data, err := r.Encipher()
Похоже на: травление,использоватьOP_RETURN
будет бросать(Mint)Запись операциисуществоватьна блокчейне。Различиясуществовать В,Нам больше не нужны транзакции P2TR в Mint,То есть,Нам нужна только обычная транзакция перевода,Вместо построения двух транзакций.
Runesпротоколизизобретательсуществовать发布рунычас也существовать Жесткий кодкодированиепредопределенныйодинруны:UNCOMMON•GOODS,Эту руну может откопать каждый,Что Идентификатор руныда:1:0,Майнинг по одному за транзакцию.
В протоколе Rune Inscription передача рун осуществляется посредством так называемого «Эдикта» — специальной структуры, которая определяет, как руны передаются от одного владельца к другому. Вот подробные шаги и правила процесса передачи рун:
Каждый Указ содержит три основных поля:
id
:Указывает руны, которые будут переданы.ID。amount
:хотеть Количество переданных рун。output
:предназначен для полученияпередача Выходной индекс руны.Конструкция Edict позволяет содержать несколько указов в одном руническом камне, что позволяет одновременно передавать несколько рун в одной транзакции биткойнов.
runeId1, _ := runestone.RuneIdFromString("2755031:186")
runeId2, _ := runestone.RuneIdFromString("2609649:946")
r := runestone.Runestone{Edicts: []runestone.Edict{
{
ID: *runeId1,
Amount: uint128.From64(1000),
Output: 1,
},
{
ID: *runeId2,
Amount: uint128.From64(100),
Output: 1,
},
}}
data, err := r.Encipher() //Deltaкодирование
Подобно травлению и процессу литья, передача руныизуказтакже прошло БиткойнсценарийOP_RETURN
код операции Обмотка。Это гарантирует, что операция передачиизпрозрачность и необратимость,Предоставляет всем участникам сети возможность проверить корректность переводов.
Передача рун соответствует модели вывода неизрасходованных транзакций Биткойна (UTXO). В сети Биткойн выход каждой транзакции (UTXO) представляет собой определенное количество биткойнов, которое может быть использовано в качестве входных данных для следующей транзакции. В протоколе Rune концепция UTXO используется для представления и передачи определенных рун.
Другими словами, я отчеканил руну А в транзакции Mint и занял 1000 сатоши UTXO. Далее я строю обычную транзакцию перевода без OP_RETURN, трачу этот UTXO и передаю пользователю Б, тогда пользователь Б получит эту руну А.
Когда рунные камни выполняются, указы внутри них обрабатываются в том порядке, в котором они появляются. Это означает, что если в руническом камне есть несколько указов, ссылающихся на один и тот же идентификатор руны, они будут обработаны в том порядке, в котором они появляются в рунических камнях.
Все поступающие руны (включая вновь отчеканенные или предварительно добытые руны) не распределяются до тех пор, пока не будет обработан Указ. Каждый указ уменьшает нераспределенный баланс соответствующего идентификатора руны и увеличивает баланс, выделенный для вывода транзакции.
Если указ пытается распределить больше рун, чем текущее нераспределенное количество рун, выделенное количество указа будет уменьшено до текущего нераспределенного количества рун. Это означает, что все нераспределенные руны будут полностью выделены.
amount
Полеравен нулю,означает, что Идентификатор Все остальные единицы руны.output
Поле等Ввывод транзакцииизколичество,означает, что такая же суммаизруны分配приезжатькаждый НетOP_RETURN
извыход。Если какой-либо указатель в Runestones указывает на неверный Идентификатор. руны(Например,Высота блока равна нулю, а индекс транзакции ненулевой),илиoutput
Полеиз值大Ввывод транзакцииизколичество,тогда все Рунные камни будут считаться недействительными,Это становится «надгробие» (Кенотаф).,И все введенные руны будут уничтожены.
Когда Рунные камни в транзакции не соответствуют правилам протокола, например, содержат неузнаваемые теги или логотипы, введенные руны будут уничтожены, что представлено структурой Кенотафа (надгробия).
Механизм уничтожения рун, так называемый «Кенотаф», срабатывает при следующих обстоятельствах:
При срабатывании механизма уничтожения будут выполнены следующие действия:
проходитьTapScript+OP_RETURN:Используйте две транзакции, чтобытравление Контент в цепочке,убеждаться Чтонельзя подделать。而且一定记住两笔торговля之间изблокироватьвысокий差至少хотеть达приезжать6。
А при выполнении таких вещей, как Mint, переводы и т. д.,проходитьOP_RETURN实现了руныторговляиз Обмотка。
Наконец, я также запускаю проект с открытым исходным кодом «Протокол BxE», используя улучшенную версию протокола Ordinals в качестве основы, позволяющей сети Биткойн поддерживать смарт-контракты, полные по Тьюрингу EVM. Этот проект реализован в сети Биткойн первого уровня без необходимости построения сети второго уровня и может обеспечить децентрализованную безопасность на уровне Биткойн. Официальный документ доступен на GitHub, и протокол Runes также будет подключен к проекту, чтобы открыть экосистему. Заинтересованные друзья могут присоединиться к обсуждению вместе.