卡尔达诺(ADA)的私钥和签名密钥是什么?

8

我正尝试使用nodejs和@emurgo/cardano-serialization-lib-nodejs库(CardanoWasm)生成地址和创建交易。 根据文档,我正在尝试以下操作:

const rootkey = CardanoWasm.Bip32PrivateKey.from_bip39_entropy(
  Buffer.from(someEntropy, 'hex'), // entropy is generated from mnemonic
  Buffer.from('')
);

const account = rootkey
  .derive(harden(1852)) // harden is a function returning 0x80000000+arg
  .derive(harden(1815))
  .derive(harden(0));

const utxokey = account
  .derive(0)
  .derive(0)
  .to_public();

const stake1 = account
  .derive(2)
  .derive(0)
  .to_public();

const address = CardanoWasm.BaseAddress.new(
   CardanoWasm.NetworkInfo.mainnet().network_id(),
   CardanoWasm.StakeCredential.from_keyhash(utxokey.to_raw_key().hash()),
   CardanoWasm.StakeCredential.from_keyhash(stakekey.to_raw_key().hash())
);

const addressBech32 = address.to_address().to_bech32();

所以,我的例子中addressBech32是一个真实的钱包公共地址。当我通过助记词将钱包导入到Guarda(例如)时,它可以正常工作。 但实际上什么是rootkey和account?在我的示例中,私钥和签名密钥是什么?我应该使用哪个密钥来签署交易并如何使用Cardano Wasm获取该密钥?如果我不想使用助记词,我应该使用哪个私钥来导入钱包?

3个回答

9
当我使用助记词将钱包导入到 Guarda(例如)时,它可以正常工作。但实际上什么是根密钥和账户? rootKey是您的xpriv的表现形式,即从中生成所有投票和支出、私钥和公钥的主私钥。
生成投票和签名密钥的过程在CIP-0003中有描述,基本上是依靠比特币BIP32和 BIP44标准来进行操作。
简而言之,该方案允许使用主密钥生成多个独立的钱包 "账户"。在您的例子中:
const account = rootkey
  .derive(harden(1852)) // harden is a function returning 0x80000000+arg
  .derive(harden(1815))
  .derive(harden(0));

生成 Cardano 帐户零的私钥。
更进一步:
account
  .derive(0)     # external chain (designated for receive addresses)
  .derive(0);    # index (the first address)

该示例会为该账户的接收地址零生成私钥。

在我的例子中,什么是私钥和签名密钥?我应该使用哪个密钥来签署交易,并如何使用Cardano wasm获取该密钥?

您的示例创建了一个(Cardano账户0)接收地址0的bech32地址。 因此,要从此地址进行支出的私钥与上述相同:

const utxo_privkey = account
  .derive(0)
  .derive(0); 

如果我不想使用助记词,应该使用哪个私钥来导入钱包?

您可以像在示例中的rootKey一样提供字节形式的熵,或者您可以使用Bech32编码的私钥来进行操作:

const rootKey = CardanoWasm.BIP32PrivateKey.from_bech32("xprv17qx9vxm6060qjn5fgazfue9nwyf448w7upk60c3epln82vumg9r9kxzsud9uv5rfscxp382j2aku254zj3qfx9fx39t6hjwtmwq85uunsd8x0st3j66lzf5yn30hwq5n75zeuplepx8vxc502txx09ygjgx06n0p");


0

@soccer193,你是不是需要为每个地址都生成一个新的质押密钥?

const utxoPubKey = accountKey .derive(0) // 外部 .derive(0) .to_public();

const stakeKey = accountKey .derive(2) // 混合型 .derive(0) .to_public();


这并不是对问题的答案。一旦您有足够的声望,您将能够评论任何帖子;相反,提供不需要询问者澄清的答案 - Tyler2P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接