Assinando uma transação offline na Blurt Blockchain

in blurt-183318 •  2 days ago 

Ontem lendo postagens aqui no Blurt, me deparei com uma postagem que levava para uma do Hive e nele informava que um usuário lá tinha site hackeado, alguém conseguiu acessar a Master Key dele e o roubou. Isso me deixou preocupado, uma vez que todo mundo de um jeito ou outro já expôs a Master Key online, na verdade muitas vezes a senha é exposta diariamente...

Dai eu pensei, e se for possível criar a senha offline e ainda assinar transações offline sendo normal ou multisig? Assim seria possível usar um celular velho, deixa-lo offline e usar como uma carteira segura.

Primeiro essa parte tem que ter acesso a internet, pois é necessario refBlockNum , refBlockPrefix e expiration data

var blurt = require('@blurtfoundation/blurtjs');

// Aqui você modifica para o nome de sua conta e para quem vai receber e a quantidade
const from = 'bgo'; // Conta que envia
const to = 'bgo'; // Conta que recebe
const amount = '1.000 BLURT'; // Valor a enviar (ou "1.000 HBD")
const memo = 'Transferência via multisig'; // Mensagem opcional

const transOP = ['transfer', { from, to, amount, memo }];

// Criar a transação sem assinar
blurt.api.getDynamicGlobalProperties((err, result) => {
    if (err) return console.error("Erro ao buscar propriedades globais:", err);

    const refBlockNum = result.head_block_number & 0xFFFF;
    const refBlockPrefix = Buffer.from(result.head_block_id, 'hex').readUInt32LE(4);

    const tx = {
        ref_block_num: refBlockNum,
        ref_block_prefix: refBlockPrefix,
        expiration: new Date(Date.now() + 10 * 60 * 1000).toISOString().slice(0, -5), // 5 minuto para assinar
        operations: [transOP],
        extensions: []
    };

    console.log("Transação criada sem assinar:", JSON.stringify(tx));

});

O que você precisa para prosseguir é o a tx, que deve ser algo parecido com isso:

{"ref_block_num":28155,"ref_block_prefix":3795265299,"expiration":"2025-02-19T03:02:41","operations":[["transfer",{"from":"bgo","to":"bgo","amount":"1.000 BLURT","memo":"Transferência via multisig"}]],"extensions":[]}


Agora você pode rodar esse código em aparelho offline, modificando somente o conteudo da const tx com o resultado do tx anterior, talvez usar algum sistema de QR code e usar sua privateKey, que no caso de transferir tem que ser a active key.


var blurt = require('@blurtfoundation/blurtjs');

const privateKey1 = '';

const tx = {"ref_block_num":28155,"ref_block_prefix":3795265299,"expiration":"2025-02-19T03:02:41","operations":[["transfer",{"from":"bgo","to":"bgo","amount":"1.000 BLURT","memo":"Transferência via multisig"}]],"extensions":[]};

const signedTx1 = blurt.auth.signTransaction(tx, [privateKey1]);
console.log("1ª assinatura adicionada:", JSON.stringify(signedTx1));


Você vai ganhar a assinatura, o resultado é algo assim:

{"ref_block_num":28335,"ref_block_prefix":1172389946,"expiration":"2025-02-19T03:11:56","operations":[["transfer",{"from":"bgo","to":"bgo","amount":"1.000 BLURT","memo":"Transferência via multisig"}]],"extensions":[],"signatures":["1f273fb403f401496a75cbeb382760e9e0adcdb7a63269927b09549efd6fd715f36c5f9784f42f8ad8081a3976949693962417afb224f16b0827a6e0db87c79412"]}

Se você notar a unica diferença é que agora tem a assinatura, se você tentar mudar qualquer coisa da transação a assinatura não irá funcionar, (se estiver fazendo uma transação multisig repita o passo de cima usando a sua outra private key, com a assinatura incluída, caso contrario não)


Agora você tem que levar as assinatura para um dispositivo online e transmitir para a blockchain.

var blurt = require('@blurtfoundation/blurtjs');

const signedTx2 = {"ref_block_num":28335,"ref_block_prefix":1172389946,"expiration":"2025-02-19T03:11:56","operations":[["transfer",{"from":"bgo","to":"bgo","amount":"1.000 BLURT","memo":"Transferência via multisig"}]],"extensions":[],"signatures":["1f273fb403f401496a75cbeb382760e9e0adcdb7a63269927b09549efd6fd715f36c5f9784f42f8ad8081a3976949693962417afb224f16b0827a6e0db87c79412"]};

blurt.api.broadcastTransactionSynchronous(signedTx2, (err, result) => {
        if (err) console.error("Erro ao transmitir:", err);
        else console.log("Voto transmitido com sucesso!", result);
});


Pronto, você acaba de transferir sem expor sua senha online.


Outras operações possível:

Mecher na autoridade da conta, aonde está indefinido não irá mudar, mas nesse exemplo a posting key esta sendo mudada, estão se não quiser perder sua chave atual, coloque sua atual chave publica e adicione outra se quiser, se não quiser é só deletar, todas owner, active, e posting é mesmo tipo de template de codigo, então se quiser mudar a active é só copiar o que está na frente do posting entre {} e alterar as chaves. Cuidado com a owner key, para muda-la é necessário sua owner key, não deixe vazio assim [], pois isso é mesmo que perder o acesso a conta, quando não quiser modificar uma chave, a deixe em undefined.

E cuidado mexer com o weight_threshold, isso é usado para multisig, se tiver mais que 1, então você terá que usar duas chaves com o peso de 1, ou se uma chave sua tiver o peso mais alto, o peso da chave é o que esta do lado da chave publica ['suapostingpublica', 1] esse 1 é o peso da chave.

const accountUp = [ 'account_update', { account: 'account',owner: undefined, active: undefined, posting: { weight_threshold: 1, account_auths: [], key_auths: [['suapostingpublica', 1],['novapostingkeypublica', 1]] }, memo_key: 'memopublico', json_metadata: '', posting_json_metadata: "" }];

Votando

Não é necessário deixar a chave posting offline, pois apresenta pouco perigo, mas aqui na Blurt se você tiver saldo, se algum descobrir sua posting ele pode gastar tudo com transações.

const voteOp = ['vote', { voter, author, permlink, weight }];

Power Up

const powerUp = [
    'transfer_to_vesting',
    {
        from: 'sua_conta',
        to: 'sua_conta', // Pode ser sua própria conta ou outra
        amount: '10.000 BLURT' // Valor em BLURT (com 3 casas decimais)
    }
];

Power Down

const powerDown = [
    'withdraw_vesting',
    {
        account: 'sua_conta',
        vesting_shares: '100.000000 VESTS' // Quantidade de VESTS (não BLURT Power diretamente)
    }
];

Votar em Witness

const voteWitness = [
    'account_witness_vote',
    {
        account: 'sua_conta',
        witness: 'nome_do_witness', // Nome do witness que você deseja apoiar
        approve: true // true para votar, false para remover o voto
    }
];

Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE BLURT!