0

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

问题是,我设法为我们需要的所有加密货币做到了这一点,除了 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;
4

1 回答 1

1

所以,事实证明我找到了答案,需要阅读一些奇怪的资源。希望这会帮助你。

首先,zcash 不兼容 SegWit,因此 p2wpkh 函数对此不起作用,您应该使用 p2pkh。p2sh 方法调用在这里也是多余的,所以代码看起来像这样:

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。

之后,该函数将返回一个比特币地址,但我们需要 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));
}

而已。

于 2020-04-23T12:06:51.403 回答