#javascript #blockchain
#javascript #блокчейн
Вопрос:
У меня есть программа, которая генерирует публичный адрес биткойна из случайно сгенерированного закрытого ключа. Однако, когда я проверяю действительность публичного адреса на blockchain.info он сообщает мне, что адрес недействителен. Где в коде я ошибся?
//modules
const secureRandom = require("secure-random");
const elliptic = require("elliptic");
const ecdsa = new elliptic.ec('secp256k1');
const sha256 = require('js-sha256');
const ripemd160 = require('ripemd160');
const base58 = require('bs58');
//variable that caps the address possiblities due to elliptic curve limitations
const max = Buffer.from("FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140","hex");
//generates a key that does not exceed 'max'
function createWalletAddress(){
var foundPrivateKey = false;
var privateKey;
while(!foundPrivateKey){
privateKey=secureRandom.randomBuffer(32);
if(Buffer.compare(max,privateKey)){
foundPrivateKey=true
}
}
//prints the private key generated
console.log("Private: " privateKey.toString("hex"))
//turns private key into public and prints it
var keys = ecdsa.keyFromPrivate(privateKey);
var publicKey = keys.getPublic("hex");
console.log("Public: " publicKey);
//getting the public key hash
const hashBeforePKH = sha256(Buffer.from(publicKey, "hex"));
const publicKeyHash = new ripemd160().update(Buffer.from(hashBeforePKH,"hex")).digest();
console.log("PKH " publicKeyHash.toString("hex"));
return publicKeyHash;
}
function createPublicAddress(publicKeyHash){
const addPrefix="00" publicKeyHash.toString('hex');
const hashAddress=sha256(addPrefix);
const hashAgain = sha256(Buffer.from(hashAddress,"hex"));
const checkSum = hashAgain.substring(0,8);
const combine = addPrefix.toString("hex") checkSum;
const address= base58.encode(Buffer.from(combine,"hex"));
console.log("address " address);
}
Ответ №1:
Контрольная сумма была рассчитана неправильно, она должна быть 0xf38580e3
Попробуйте хешировать буфер вместо строки:
function createPublicAddress(publicKeyHash){
const addPrefix="00" publicKeyHash.toString('hex');
const hashAddress=sha256(Buffer.from(addPrefix, 'hex'));
...
}
Вы также могли бы использовать что-то вроде bs58check
вместо вычисления контрольной суммы вручную.