Создание биткойн-кошелька с softHSM

Я пытаюсь реализовать биткойн-кошелек от softHSM с помощью javascript. Я могу сделать то же самое для эфириума с помощью приведенного ниже кода с помощью ethereumjs, softhsm2 и graphene.

var lib = "C:/SoftHSM2/lib/softhsm2-x64.dll";

var mod = Module.load(lib, "SoftHSM");
mod.initialize();

var slot = mod.getSlots(0);
var session
if (slot.flags & graphene.SlotFlag.TOKEN_PRESENT) {
    session = slot.open(graphene.SessionFlag.RW_SESSION | graphene.SessionFlag.SERIAL_SESSION);
    session.login("******");
    
     // generate ECDSA key pair
     var keys = session.generateKeyPair(graphene.KeyGenMechanism.ECDSA, {
        label: "publickey",
        id: Buffer.from([1, 2, 3, 4, 5]),
        keyType: graphene.KeyType.ECDSA,
        token: true,
        verify: true,
        paramsECDSA: graphene.NamedCurve.getByName("secp256k1").value,
        
    }, {
        keyType: graphene.KeyType.ECDSA,
        label: "privateKey",
        id: Buffer.from([1, 2, 3, 4, 5]),        
        token: true,
        sign: true
    }); 

    ///////////////////////////////////////////////////////////////////////////////////////////
    // Extract Public Key and calculate Ethereum Address
    ////////////////////////////////////////////////////////////////////////////////////////////
    
    /// the first 3 byte for uncompressed key 
    // https://tools.ietf.org/html/rfc5480#section-2.2
    puplicKey = decodeECPointToPublicKey(keys.publicKey.getAttribute({pointEC: null}).pointEC)
    const address = keccak256(puplicKey) // keccak256 hash of publicKey     
    const buf2 = Buffer.from(address, 'hex');
    const EthAddr="0x"+buf2.slice(-20).toString('hex') // take lat 20 bytes as ethereum adress
    console.log("Generated Ethreum address:" + EthAddr) 
}

Если я использую bitcoinjs или bitcore-lib, есть два способа создать биткойн-кошелек: один — создать случайную пару открытого и закрытого ключей из библиотеки (не из hsm) или другой импортирует строку WIF закрытого ключа, которую я не могу получить от softHSM. Я также пытался использовать открытый ключ, сгенерированный вышеприведенным методом decodeECPointToPublicKey для биткойнов, но я получаю открытый ключ длиной 62 байта в буфере. Ссылаясь на этот разговор, я должен иметь 32 или 64 байта один.

//////////////////////////////////////////////////////////////////
// Generate Random KeyPair
/////////////////////////////////////////////////////////////////
const keypair = bitcoin.ECPair.makeRandom({ network })

const pubkey = keypair.publicKey

const addressObject = bitcoin.payments.p2pkh({ pubkey, network })
const wif = keypair.toWIF();
console.log("address: "+addressObject.address);

////////////////////////////////////////////////////////////////////
// ReGenerate From WIF
////////////////////////////////////////////////////////////////////
const keyPair = bitcoin.ECPair.fromWIF(
    wif , bitcoin.networks.testnet
  );
const { address } = bitcoin.payments.p2pkh({ pubkey: keyPair.publicKey , network: bitcoin.networks.testnet});
console.log("regenerated address: "+address);

Я немного запутался в этом вопросе и очень открыт для новых мнений, предложений или решений.

Заранее спасибо.


person Salih Cemil Cetin    schedule 05.07.2021    source источник