Biblioteca JS mínima para ordinais e inscrições sobre scure-btc-signer.
Use-o como uma biblioteca em seu código JS ou execute uma ferramenta CLI incluída. As inscrições permitem o upload de arquivos aleatórios no blockchain BTC.
Experimental: pode levar à perda de fundos até ser testado exaustivamente.
npm instala microordinais
Criando inscrição
API TypeScript
CLI
// npm instala micro-ordinais @scure/btc-signer @scure/baseimport * como btc de '@scure/btc-signer';importar * como ordinais de 'micro-ordinais';importar { hex, utf8 } de '@ scure/base';const TESTNET = btc.utils.TEST_NETWORK;const privKey = hex.decode('0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a0a'); // Habilita scripts personalizados fora // Isso se inscreve no primeiro satoshi da primeira entrada (padrão)const inscription = { tags: {contentType: 'application/json', // pode ser qualquer formato (tipo MIME) // ContentEncoding: 'br', // compressão: somente brotli suportado }, corpo: utf8.decode(JSON.stringify({ some: 1, teste: 2, inscrição: true, in: 'json' })), // Pode-se usar scripts js previamente inscritos em html // utf8.decode(`<html><head></head><body><script src="/content/script_inscription_id"></script>test</html>`)};const revelaPayment = btc.p2tr ( indefinido, // internalPubKey ordinals.p2tr_ord_reveal(pubKey, [inscrição]), // TaprootScriptTree TESTNET, // mainnet ou testnet false, //allowUnknownOutputs, recurso de segurança customScripts // como lidar com scripts personalizados);// Precisamos enviar alguns bitcoins para este endereço antes da revelação. // Além disso, deve haver o suficiente para cobrir a revelação tx fee.console.log('Address', reveladoPayment.address) ; // 'tb1p5mykwcq5ly7y2ctph9r2wfgldq94eccm2t83dd58k785p0zqzwkspyjkp5'// Tenha muito cuidado: é possível enviar acidentalmente uma inscrição como uma taxa. // Além disso, a raridade só está disponível com carteira ordinal. // Mas você pode analisar outras inscrições e criar uma comum usando esta. const alterarAddr = revelarPayment.address; // pode ser diferenteconst reveladoAmount = 2000n;const fee = 500n;const tx = new btc.Transaction({ customScripts });tx.addInput({ ...revelPagamento, // Este é o txid do tx com bitcoins que enviamos (substituir) txid: '75ddabb27b8845f5247975c8a5ba7c6f336c4570708ebe230caf6db5217ae858', índice: 0, testemunhaUtxo: { script: revelaPayment.script, valor: revelaAmount },});tx.addOutputAddress(changeAddr, revelaAmount - taxa, TESTNET);tx.sign(privKey, indefinido, novo Uint8Array(32));tx.finalize() ;const txHex = hex.encode(tx.extract());console.log(txHex); // Hex de revelação tx para broadcastconst tx2 = btc.Transaction.fromRaw(hex.decode(txHex)); // Analisando inscriçõesconsole.log('parsed', ordinals.parseWitness(tx2.inputs[0].finalScriptWitness));console.log('vsize', tx2.vsize); // Reveal tx deveria pagar pelo menos esta taxa
importar { Coder } de '@scure/base';importar * como P de 'micro-packed';importar { ScriptType, OptScript, CustomScript } de '@scure/btc-signer';type Bytes = Uint8Array;exportar declarar const InscriptionId : P.Coder<string, Bytes>;type TagRaw = {tag: Bytes;dados: Bytes;};declarar const TagCoders: {ponteiro: P.CoderType<bigint>;contentType: P.CoderType<string>;parent: P.Coder<string, Uint8Array>;metadados: P.CoderType<any>;metaprotocol: P.CoderType<string>;contentEncoding: P.CoderType<string>;delegado: P.Coder<string, Uint8Array>;rune: P.CoderType<bigint>;nota: P.CoderType<string>;};tipo de exportação Tags = Partial<{[K in keyof typeof TagCoders]: P.UnwrapCoder<(typeof TagCoders)[K]>;}> & {desconhecido?: [Bytes, Bytes][ ];};tipo de exportação Inscrição = { tags: Tags; corpo: Bytes; amaldiçoado?: booleano; };type OutOrdinalRevealType = { tipo: 'tr_ord_reveal'; pubkey: Bytes; inscrições: Inscrição[]; };exportar declara const OutOrdinalReveal: Coder<OptScript, OutOrdinalRevealType | indefinido> & CustomScript;export declara função parseInscriptions(script: ScriptType, strict?: boolean): Inscrição[] | indefinido;/** * Analisar inscrições da testemunha de entrada revelada tx (tx.inputs[0].finalScriptWitness) */export declare function parseWitness(witness: Bytes[]): Inscription[] | undefined;/** * Cria transação de revelação. Inscrição criada na saída de gastos deste endereço, * revelando o script da raiz principal. */exportar declarar função p2tr_ord_reveal(pubkey: Bytes, inscrições: Inscrição[]): {tipo: string;script: Uint8Array;};
npm install -g micro-ordinais ord file.jpg
Uso: ord [--net mainnet|testnet] [--priv key] [--recovery key] [--compress=on|off] [--fee 10.1] [--addr address]
rede: rede bitcoin
priv: chave privada taproot no formato WIF, será usada para revelar a transação. Não use sua carteira, priv deve ser uma nova. Geramos uma chave temporária, se nenhuma for fornecida
recuperação: chave privada taproot em formato WIF, pode ser usada para recuperar quaisquer bitcoins enviados acidentalmente para o endereço de inscrição, sem pagar a taxa de inscrição integral.
comprimir: inscrições comprimidas com brotli. Compatível com exploradores. padrão = ativado
taxa: taxa de rede bitcoin em satoshis
endereço: endereço para onde será enviada a inscrição após a revelação. Importante: o primeiro sat é sempre inscrito. Inscrições em lote não são suportadas.
Não há código de rede. Torna o pacote mais seguro, mas diminui a experiência do desenvolvedor.
Provavelmente podemos buscar taxas automaticamente, mas a seleção do utxo se tornaria mais complexa. Por exemplo, se o usuário inscreveu algo anteriormente ou possui ordinais raros, precisamos de acesso ao nó ordinal para saber isso. Além disso, não sabemos nada sobre saídas congeladas na carteira: elas estão apenas dentro da carteira.
Casos extremos a serem lembrados:
o usuário adicionou txid/índice errado ou saiu do aplicativo após enviar
imprimimos a chave privada temporária, o usuário pode reiniciar fornecendo '--priv'
desde que a taxa/rede/caminho seja a mesma, você pode reiniciar o processo
o usuário enviou menos que uma quantia ou vários UTXO.
na verdade, isso é mais difícil, porque qualquer gasto exigirá taxa de inscrição integral
para isso adicionamos recovery
Use mempool e ordinalsbot.
Existem várias torneiras: uo1, eu, bomba
Para usar o pardal no Mac:
open /Applications/Sparrow.app --args -n testnet
MIT (c) Paul Miller (https://paulmillr.com), consulte o arquivo LICENSE.