Javascript 关于使用xpub和Zcash路径自动派生地址的问题

Javascript 关于使用xpub和Zcash路径自动派生地址的问题,javascript,cryptography,zcash,trezor,bitcoinjs-lib,Javascript,Cryptography,Zcash,Trezor,Bitcoinjs Lib,我目前正在为我的公司开发一个API,它利用xpub和path生成地址 问题是,除了Zcash之外,我设法为我们需要的所有加密货币做到了这一点。我们使用的是trezor硬件钱包,trezor connect不适用于我们,因为我们需要将流量与设备本身分离 通常,我对所有其他硬币都使用bitcoinjs库,但我无法为zcash导出正确的地址格式。花了很多时间搜索github问题,但运气不佳。一句话的帮助会非常好,谢谢大家!我的代码当前如下所示: xpub = process.env.ZEC_PUB_K

我目前正在为我的公司开发一个API,它利用xpub和path生成地址

问题是,除了Zcash之外,我设法为我们需要的所有加密货币做到了这一点。我们使用的是trezor硬件钱包,trezor connect不适用于我们,因为我们需要将流量与设备本身分离

通常,我对所有其他硬币都使用bitcoinjs库,但我无法为zcash导出正确的地址格式。花了很多时间搜索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;
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;

所以,我发现了答案,需要阅读一些奇怪的资源。希望这对你有帮助

首先,zcash与SegWit不兼容,因此p2wpkh函数对此不起作用,您应该使用p2pkh。p2sh方法调用在这里也是冗余的,因此代码如下所示:

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;
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库在某些方面不支持altcoins。在本例中,p2pkh函数在其核心中使用了toUint8,因此您基本上可以分叉repo并更新该方法以使用更宽边界的数据类型toUint16LE

之后,该函数将返回比特币地址,但我们需要zcash。我们可以使用以下功能轻松地将其转换:

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));
}
就这样