Node.js E C добавление очков - PullRequest
0 голосов
/ 06 мая 2020

Я пытаюсь воссоздать минимальную функцию bip32 для генерации дочерних publi c ключей из моего главного publi c кода ключа и цепочки.

У меня есть config.json как:

{
  "chainCode": "81eb1b3bd79ed4808abf66120c071274e006b526cc6a2c462a97477f5a1f16b7",
  "publicKey": "02CC7D0A1262304AD75CCA77988D6B192C7278CB9C49315F3A2900D281E746DDC3"
}

Я не сохранил сид (e7add15470feb0c7adcacbe93a89e9d87ba3c91be5e82e1a5ae1bc87998b259b8e90e27419e483410d3824a804b80fb347592fe47923908717cb5a81f1591b92), так как мне нужно получить доступ только к c ключам publi первого уровня (m/i).

Я с использованием двух пакетов:

  • crypto
  • elliptic (для умножения secp256k1 g)

Мой текущий код:

let C = Buffer.from(cofnig.chainCode, 'hex');
let K = Buffer.from(cofnig.publicKey, 'hex');
let i = Buffer.from('1'.padStart(16, '0'), 'hex'); //children padded to 16 digits

let I = crypto
        .createHmac('sha512', C)
        .update(Buffer.concat([K, i]))
        .digest();

let IL = I.slice(0,32);
let IR = I.slice(32,64);

let Ki = new ec('secp256k1').g.mul(IL);

Согласно официальному документу я должен добавить K к new ec('secp256k1').g.mul(IL), но я действительно не знаю, как мне это сделать. Я пытался получить x и y для K и Ki вот так (вероятно, неправильный или, по крайней мере, не самый эффективный способ):

let temp = new ec('secp256k1').curve.decodePoint(K);

let coords = {

    x: (
        (
            BigInt(t.Ki.getX().toString())
            +BigInt(t.K.getX().toString())
        )
        %BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140')
    ).toString(16),

    y: (
        (
            BigInt(t.Ki.getY().toString())
            +BigInt(t.K.getY().toString())
        )
        %BigInt('0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364140')
    ).toString(16)

}

У меня есть несколько вопросов:

  1. Почему обе координаты имеют 31 байт вместо 32?
  2. Как правильно добавить две точки с помощью пакета elliptic?
  3. Как быстро преобразовать K в точку, не передавая это на new ec?
...