Вопрос относительно автоматического вывода адресов с использованием xpub и path для Zcash - PullRequest
0 голосов
/ 22 апреля 2020

В настоящее время я разрабатываю API для своей компании, который использует xpub и path для генерации адреса.

Дело в том, что мне удалось сделать это для всех криптовалют, которые нам требуются, за исключением Zca sh. Мы используем аппаратный кошелек Trezor, и Trezor connect у нас не работает, так как нам необходимо отключить поток от самого устройства.

Обычно я использую библиотеку bitcoinjs для всех другие монеты, но я не смог найти правильный формат адреса для zca sh. Потратил довольно много времени на поиск в github проблемах, но не повезло. Слово помощи было бы действительно здорово, спасибо, ребята! Мой код в настоящее время выглядит так:

xpub = process.env.ZEC_PUB_KEY;
network = {
messagePrefix: '\x18ZCash Signed Message:\n',
bech32: 't1',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x1cb8,
scriptHash: 0x1cbd,
wif: 0x80
};
p2wpkh = bjs.payments.p2wpkh({ pubkey: bjs.bip32.fromBase58(xpub, network).derive(0).derive(pathNumber).publicKey, network });
payment = bjs.payments.p2sh({ redeem: p2wpkh, network });
address = payment.address;

1 Ответ

0 голосов
/ 23 апреля 2020

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

Во-первых, zca sh не совместим с SegWit, поэтому функция p2wpkh для этого не подойдет, вам следует использовать p2pkh. Вызов метода p2 sh здесь также избыточен, поэтому код будет выглядеть примерно так:

network = {
messagePrefix: '\x18ZCash Signed Message:\n',
bech32: 't1',
bip32: {
public: 0x0488b21e,
private: 0x0488ade4
},
pubKeyHash: 0x1cb8,
scriptHash: 0x1cbd,
wif: 0x80
};
payment= bjs.payments.p2pkh({ pubkey: bjs.bip32.fromBase58(xpub, network).derive(0).derive(pathNumber).publicKey, network });
address = payment.address;

Кроме того, библиотека bitcoinjs -lib не поддерживает альткойны в некоторых отношениях. В этом случае функция p2pkh использует toUint8 в своем ядре, так что вы можете в основном разветвить репо и обновить этот метод, чтобы использовать тип данных с более широкими границами, toUint16LE.

После этого функция вернет bitcoin адрес, но нам нужно zca sh. Мы можем легко преобразовать его, используя следующую функцию:

function baddrToTaddr(baddr_str) {
var baddr = bs58check.decode(baddr_str).slice(1);  // discard type byte
var taddr = new Uint8Array(22);
taddr.set(baddr, 2);
taddr.set([0x1c,0xb8], 0);  // set zcash type bytes
return bs58check.encode(Buffer.from(taddr));
}

Вот и все.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...