Se você está pensando em se tornar um desenvolvedor de blockchain, é um bom momento para começar.
Afinal, de acordo com dados do Zip Recruiter , um salário médio de blockchain é de cerca de US $ 154.550/ano.
No entanto, com este artigo, você não precisa de nenhum conhecimento de criptografia para acompanhar. Se você conhece JavaScript, está pronto para começar.
No final deste tutorial, você deve ter uma compreensão geral de como as transações de bitcoin funcionam e deve ser capaz de enviar Bitcoin para qualquer pessoa de sua carteira usando JavaScript.
Pré-requisitos
Para acompanhar, você deve ter:
- Node.js instalado
- Uma compreensão básica de JavaScript
Aqui está um diagrama de fluxo de trabalho simples de todo o processo de transação de bitcoin.
Este é o fluxo de trabalho da transação:
- Obtenha os resultados das transações não gastas
- Adicione as entradas para obter uma nova entrada de transação
- Calcule a taxa de transação
- Verifique se você tem saldo suficiente para cobrir a transação
- Definir entradas de transação
- Definir endereço de mudança
- Definir taxa de transação
- Assinar transação
- Serializar a transação
- Transmissão de transação
O que é um blockchain?
Primeiro, vamos definir dois termos-chave que você notará ao longo deste tutorial: o blockchain e uma transação de bitcoin.
O blockchain pode ser descrito como um banco de dados distribuído imutável de um log global de transações. Um bloco no blockchain pode ser comparado a um registro em bancos de dados tradicionais.
O que é uma transação de bitcoin?
Uma transação é a transferência de valor de uma carteira de bitcoin para outra que é incluída no blockchain.
Usando bitcoin Testnet blockchain e mainnet blockchain
Normalmente, você precisará instalar e executar seu nó bitcoin (sua cópia do blockchain) em seu servidor para poder brincar com o desenvolvimento do blockchain. No entanto, não faremos isso neste tutorial.
Em vez disso, usaremos serviços de terceiros que já estão executando um nó de bitcoin.
Existe o bitcoin Blockchain Testnet e blockchain Mainnet . O Testnet é um blockchain de bitcoin projetado para ser usado em testes. É isso que usaremos neste tutorial.
Nota: Não use bitcoin real no desenvolvimento. As transações de Bitcoin não são reversíveis. Uma vez perdidos, eles não são recuperáveis, exceto se você tiver a chave privada dos endereços de recebimento.
Configurando uma carteira Testnet com bitcoin
Para começar, precisamos de alguns bitcoins para enviar, certo? Então, vamos criar uma carteira Testnet e carregá-la com alguns bitcoins. Você pode usar rapidamente o site do gerador de carteira para gerar carteiras Testnet.
Aqui está o que acabei de gerar no site.
- privateKey=
93F2mUJPKbXW8Q9cMNz4ZmpsjgTbNjrMeCaUesTPE7k1DFhSmnk
(no mundo real, esta chave privada não deve ser mostrada a ninguém, mas é um Testnet, então seja o que for ) - endereço=
mtVE8anM63kQcgKUC6oQQD9K6xiV4wsr7q
Vamos enviar bitcoins para ele usando um site de torneiras Bitcoin Testnet. Vou enviar 0,00 bitcoin para este endereço ( mtVE8anM63kQcgKUC6oQQD9K6xiV4wsr7q
) de este Testnet site .
Agora que temos algum bitcoin em nossa carteira, vamos criar um aplicativo Node.js simples que nos permitirá enviar bitcoin.
Configure seu aplicativo de nó com npm init
e instale a biblioteca de código aberto Bitcore-usaremos o Biblioteca Bitcore e Axios para fazer interface com o blockchain.
npm install axios, bitcore-lib
Crie um arquivo index.js e importe a biblioteca Bitcore e Axios.
const axios=require ("axios"); const bitcore=require ("bitcore-lib");
Em seguida, crie a função sendBitcoin
que realmente enviará o bitcoin.
Usaremos a API SoChain para nos conectar ao blockchain Testnet.
O código abaixo é o bloco de construção da definição da função que usaremos para enviar bitcoin. É muito comentado para ajudar na compreensão.
/** @receiverAddress-Endereço da pessoa para a qual você deseja enviar bitcoin @amountToSend-Esta é a quantidade de bitcoin que você deseja enviar de sua carteira para alguém. Este valor será debitado da sua carteira e enviado para este endereço. */ deixe sendBitcoin=(recieverAddress, amountToSend)=> { const sochain_network="BTCTEST";//a rede Testnet para sochain const privateKey=`93F2mUJPKbXW8Q9cMNz4ZmpsjgTbNjrMeCaUesTPE7k1DFhSmnk`;//sua privateKey-aquela que acabamos de gerar /* seu endereço bitcoin. Aquele de quem você deseja enviar fundos-aquele que acabamos de gerar */ const sourceAddress=`mtVE8anM63kQcgKUC6oQQD9K6xiV4wsr7q`; /** como as saídas vêm em satoshis, e 1 Bitcoin é igual a 100.000.000 satoshies, multiplicaremos a quantidade de bitcoin por 100.000.000 para obter o valor em satoshis. */ const satoshiToSend=amountToSend * 100000000; deixe taxa=0; deixe inputCount=0; deixe outputCount=2;//vamos usar 2 como a contagem de saída porque só enviaremos o bitcoin para 2 endereços do endereço do receptor e nosso endereço de alteração. }
Recebendo saídas não gastas
Saídas não gastas são as transações que você recebeu em sua carteira bitcoin que não foram gastas. Supondo que você receba $ 100 USD em bitcoins em cinco transações diferentes, você terá cinco saídas não gastas.
Vamos usar o explorador de blocos SoChain para descobrir quantas saídas temos até agora em nosso carteira. Se você passar a rede e o endereço para o URL abaixo em uma solicitação get, ele retornará um resultado que contém nossas saídas não utilizadas.
https://sochain.com/api/v2/get tx não gasto/{Rede}/{Endereço}
Por exemplo, se passarmos nosso endereço para ele, da seguinte forma:
https://sochain.com/api/v2/get tx não gasto/BTCTEST/mtVE8anM63kQcgKUC6oQQD9K6xiV4wsr7q
Aqui está o resultado que obteremos:
A parte txs
é uma matriz de todas as saídas não gastas.
Essa é apenas uma saída não gasta que temos lá. Porque eu enviei Bitcoin uma vez para aquele endereço e não foi gasto.
Para usar esses dados em nosso código, vamos Axios pegar esses dados:
const utxos=await axios.get ( `https://sochain.com/api/v2/get_tx_unspent/$ {sochain_network}/$ {sourceAddress}` );
Em seguida, inicialize uma nova transação usando a API Bitcore lib.
transação
const=new bitcore.Transaction ();
Daqui em diante, usaremos essa instância de transação para concluir todo o processo.
Construindo novos insumos
A partir das saídas não gastas, precisamos construir uma nova entrada. Nossa entrada será igual às saídas não gastas.
Vamos pegar os elementos essenciais das saídas de que precisamos para criar novas entradas a partir da matriz de saída não gasta:
- satoshis: o valor da saída não gasta em satoshi
- script: uma instrução que define como gastar a Saída não gasta
- endereço: endereço de sua carteira
- ID de transação (txid): este é um ID único para identificar sua transação no blockchain
- outputIndex: o índice de cada saída em uma transação
utxo.satoshis=Math.floor (Number (element.value) * 100000000); utxo.script=element.script_hex; utxo.address=utxos.data.data.address; utxo.txId=element.txid; utxo.outputIndex=element.output_no;
Pegue os dados da matriz de saída não gasta e crie as novas entradas:
let totalAmountAvailable=0; deixe entradas=[]; utxos.data.data.txs.forEach (async (element)=> { deixe utxo={}; utxo.satoshis=Math.floor (Number (element.value) * 100000000); utxo.script=element.script_hex; utxo.address=utxos.data.data.address; utxo.txId=element.txid; utxo.outputIndex=element.output_no; totalAmountAvailable +=utxo.satoshis; inputCount +=1; inputs.push (utxo); });
Agora que temos as entradas em uma matriz, vamos definir as entradas da transação.
transação.de (entradas);
Lidando com taxas de transação de bitcoin
Se você já brincou com bitcoin, notará que às vezes as taxas são altas e outras vezes, podem estar próximas de zero. Bem, isso é porque realmente não há taxa. Parece contra-intuitivo, certo?
Sim, você pode decidir enviar bitcoin sem uma taxa, mas pode levar muito tempo antes que ele seja selecionado e adicionado ao blockchain pelos mineiros. A taxa é um conceito que permite que os mineiros sejam compensados por seus esforços e mantenham a rede segura.
Além disso, como o tamanho máximo do bloco em uma transação de bitcoin é 1 MB, os mineradores tendem a dar prioridade às transações com as taxas mais altas. No momento em que este livro foi escrito, a taxa média de prioridade era de cerca de 108 Satoshis/byte.
Então, como você determina a taxa?
Como a taxa não depende da quantidade de bitcoin que você está enviando, e sim do tamanho da transação, você precisa primeiro determinar o tamanho da transação. Curiosamente, o tamanho da transação depende da entrada e saída da transação.
Esta fórmula pode ser usada para determinar o tamanho:
transactionSize=inputCount * 180 + outputCount * 34 + 10-inputCount;
Em cada transação de bitcoin, as entradas contribuem com 180 bytes cada para a transação, enquanto a saída contribui com 34 bytes cada para a transação. Então, há 10 bytes extras que você adiciona ou subtrai da transação também.
Supondo que você tenha uma transação com duas entradas e duas saídas, o tamanho da transação será 2180+ 2 34 + 10-2=436 bytes.
Então, se você quiser pagar 20 satoshis por byte, a taxa será:
Taxa=20 * 436
Taxa=8720 satoshis
Como 100.000.000 satos são iguais a 1 bitcoin, devemos dividir 8.720/100.000.000.
Isso resulta em uma taxa de 0,0000872 bitcoin, que era de aproximadamente $ 3,03 USD no momento da redação deste artigo.
É assim que você determina sua taxa de bitcoin.
Agora que você sabe a taxa da transação, pode verificar facilmente se o seu saldo é suficiente para cobrir a transação, incluindo as taxas.
//Verifique se temos fundos suficientes para cobrir a transação e as taxas if (totalAmountAvailable-satoshiToSend-taxa <0) { lançar um novo erro ("Saldo muito baixo para esta transação"); }
Definir o endereço do receptor bitcoin, valor a enviar e taxas
Agora que você calculou suas taxas e verificou que tem saldo suficiente para cobrir suas taxas e toda a transação, pode ir em frente e definir o endereço de recebimento e as taxas com a API Bitcore.
transaction.to (recieverAddress, satoshiToSend);//endereço de recebimento e quantidade de satoshis a enviar. //definir taxas de transação manualmente: 20 satoshis por byte transação.fee (taxa * 20);
Configurando o endereço de mudança de bitcoin
Você não pode enviar apenas parte de seu saldo de bitcoins para outro endereço. Não, você retira tudo e envia a quantia desejada para o endereço de recebimento e, em seguida, devolve o troco para você mesmo.
Portanto, o endereço de alteração é o seu endereço-o endereço para o qual você deseja obter o saldo pago após o envio ao destinatário.
Portanto, usaremos a função Bitcore transaction.change
para definir o endereço:
transaction.change (sourceAddress);
Assinando a transação
Antes de gastarmos bitcoins em uma carteira, devemos ter a chave privada dessa carteira. Sua chave privada é sua senha para desbloquear os fundos em qualquer carteira bitcoin.
//Assine a transação com sua chave privada transaction.sign (privateKey);
Serializando a transação bitcoin
Para transmitir a transação, precisamos serializar a transação para obter o hex da transação:
const serializedTransaction=transaction.serialize ();
É esse hex de transação que vamos transmitir para o blockchain.
Transmitindo a transação bitcoin
Vamos transmitir a transação para o blockchain por meio do nó SoChain com uma pós-solicitação da API.
//transmissão de transação const result=await axios ({ método:"POST", url: `https://sochain.com/api/v2/send_tx/$ {sochain_network}`, dados: { tx_hex: serializedTX, }, }); return result.data.data
Aqui está o código completo para tudo que construímos até agora:
const sendBitcoin=async (recieverAddress, amountToSend)=> { const sochain_network="BTCTEST"; const privateKey=""; const sourceAddress=""; const satoshiToSend=amountToSend * 100000000; deixe taxa=0; deixe inputCount=0; deixe outputCount=2; const utxos=await axios.get ( `https://sochain.com/api/v2/get_tx_unspent/$ {sochain_network}/$ {sourceAddress}` ); transação const=novo bitcore.Transaction (); deixe totalAmountAvailable=0; deixe entradas=[]; utxos.data.data.txs.forEach (async (element)=> { deixe utxo={}; utxo.satoshis=Math.floor (Number (element.value) * 100000000); utxo.script=element.script_hex; utxo.address=utxos.data.data.address; utxo.txId=element.txid; utxo.outputIndex=element.output_no; totalAmountAvailable +=utxo.satoshis; inputCount +=1; inputs.push (utxo); }); transactionSize=inputCount * 146 + outputCount * 34 + 10-inputCount; //Verifique se temos fundos suficientes para cobrir a transação e as taxas assumindo que queremos pagar 20 satoshis por byte taxa=tamanho da transação * 20 if (totalAmountAvailable-satoshiToSend-taxa <0) { lançar um novo erro ("Saldo muito baixo para esta transação"); } //Definir entrada de transação transação.de (entradas); //definir o endereço de recebimento e a quantia a enviar transaction.to (recieverAddress, satoshiToSend); //Definir endereço de mudança-Endereço para receber os fundos restantes após a transferência transaction.change (sourceAddress); //definir taxas de transação manualmente: 20 satoshis por byte transação.fee (taxa * 20); //Assine a transação com sua chave privada transaction.sign (privateKey); //serializar transações const serializedTransaction=transaction.serialize (); //Enviar transação const result=await axios ({ método:"POST", url: `https://sochain.com/api/v2/send_tx/$ {sochain_network}`, dados: { tx_hex: serializedTX, }, }); return result.data.data; };
Parabéns, você criou com sucesso uma função JavaScript simples para enviar bitcoin para seu amigo usando 62 linhas de código.
Você pode simplesmente chamar a função sendBitcoin
e, em seguida, passar o endereço bitcoin do destinatário e a quantia que deseja enviar conforme mostrado abaixo para enviar bitcoin a qualquer pessoa.
sendBitcoin ("mtVE8anM63kQcgKUC6oQQD9K6xiV4wsryq", 0,0003)
A resposta desta API conterá seu ID de transação, que você pode usar para verificar a transação em qualquer explorador de bitcoin-em nosso caso, qualquer explorador de bitcoin Testnet.
Para enviar bitcoins reais, você precisará alterar a rede de BTCTEST
para BTC
e usar a chave privada e o endereço de sua carteira bitcoin real.
Conclusão
Há muito mais para aprender sobre blockchain, criptomoedas e como trabalhar com eles. Acredito que isso deve dar uma ideia e permitir que você adquira conhecimento a partir daí.
Se você deseja saber mais, recomendo a leitura do livro, Programando o Blockchain . É um livro gratuito e tem muitas informações para você começar a trabalhar.
Se você gostou desta postagem, por favor, compartilhe. Feliz hacking!
A postagem Envie bitcoin de sua carteira usando JavaScript apareceu primeiro em LogRocket Blog .