Я пытаюсь воссоздать минимальную функцию 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)
}
У меня есть несколько вопросов:
- Почему обе координаты имеют 31 байт вместо 32?
- Как правильно добавить две точки с помощью пакета
elliptic
? - Как быстро преобразовать K в точку, не передавая это на
new ec
?