资讯专栏INFORMATION COLUMN

Nodejs 比特币开发教程: 创建比特币钱包

caozhijian / 2638人阅读

摘要:下面的代码,可以读取比特币钱包余额网内免手续费的,并且即时确认任何币在内部的交易,都是无手续费的,并且立刻到账。

基于Mixin Network的 Nodejs 比特币开发教程: 创建比特币钱包


我们已经创建过一个回复消息的机器人和一个能自动支付比特币的机器人.

通过本教程的学习,你可以学到如下内容

如何创建一个比特币钱包.

如何读取比特币钱包的余额.

如何支付比特币并即时确认.

如何将Mixin Network的比特币提现到你的冷钱包或第三方交易所.

前期准备:你要有一个Mixin Network账户。下面的代码创建一个帐号,并写到csv文件里。

console.log("create wallet ....");
const { generateKeyPairSync } = require("crypto");
const { publicKey, privateKey } = generateKeyPairSync("rsa",
{   modulusLength: 1024,  // the length of your key in bits
    publicKeyEncoding: {
      type: "spki",       // recommended to be "spki" by the Node.js docs
      format: "pem"
    },
    privateKeyEncoding: {
      type: "pkcs1",      // recommended to be "pkcs8" by the Node.js docs
      format: "pem",
      //cipher: "aes-256-cbc",   // *optional*
      //passphrase: "top secret" // *optional*
  }
});
publicKey1 = publicKey.replace("-----BEGIN PUBLIC KEY-----","");
publicKey2 = publicKey1.replace("-----END PUBLIC KEY-----","");
publicKey3 = publicKey2.replace(/
?
|
/g, "");

console.log(publicKey);
console.log(publicKey3);
(async () => {
  const info = await clientBot.createUser({full_name : "nodejs bitcoin wallet",
                                        session_secret: publicKey3,
                                      });

上面的语句会在本地创建一个RSA密钥对,然后调用Mixin Network来创建帐号,最后保存帐号信息到csv文件.

  let aesKey = "";
  const privateKeyBytes = pem.decode(Buffer.from(privateKey));
  const aesKeyBuffer = await oaepDecrypt(
    Buffer.from(info.pin_token, "base64"),
    privateKeyBytes,
    "SHA-256",
    Buffer.from(info.session_id)
  );
  aesKey = Buffer.from(aesKeyBuffer).toString("base64");
  console.log(aesKey);

  var csvStream = csv.createWriteStream({headers: false, ignoreEmpty: true}),
      writableStream = fs.createWriteStream(WalletName, {flags: "a"});

  writableStream.on("finish", function(){
    console.log("Bitcoin wallet DONE!");
  });
  csvStream.pipe(writableStream);
  csvStream.write({a: privateKey, b: info.pin_token,
                   c: info.session_id, d: info.user_id,
                   e: "123456"}
                 );
  csvStream.end();
  fs.appendFile(WalletName, require("os").EOL, function(){});

  const newUserConfig = {clientId: info.user_id, aesKey: aesKey,
                         privateKey: privateKey, sessionId: info.session_id,
                         clientSecret: "do not need", assetPin: "123456"};
  console.log(newUserConfig);
  const newUserClient = new HttpClient(newUserConfig);
  var info2 = await newUserClient.updatePin({oldPin : "",
                                             newPin: "123456",
                                           });
  console.log(info2);

  const verifyPin = await newUserClient.verifyPin("123456");
  console.log({ verifyPin });

现在你需要小心保管好你的帐号信息,在读取该账户的比特币资产余额或者进行其他操作时,将需要用到这些信息.

给新建的帐号创建一个比特币钱包

新账号并不默认内置比特币钱包, 现在读一下比特币余额就可以创建一个比特币钱包。

  const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID);
  console.log("Bitcoin address is ", assetInfo.public_key);
  console.log("Bitcoin balance is ", assetInfo.balance);
  console.log("Bitcoin price is (USD) ", assetInfo.price_usd);

创建的帐号的比特币资产详细信息如下,其中public key就是比特币的存币地址:

  Make your choose(select the uuid for open the specified wallet): 0b10471b-1aed-3944-9eda-5ab947562761
   You select the : 0b10471b-1aed-3944-9eda-5ab947562761
  You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761
  ?
  Make your choose 1: Read Bitcoin Balance & Address
  You choice to : { type: "1: Read Bitcoin Balance & Address" }
  You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761
  Bitcoin address is  15MySY7UnA827TRMQWuCKGiogCYXUmt21M
  Bitcoin balance is  0
  Bitcoin price is (USD)  5029.59915767
   You select the : 0b10471b-1aed-3944-9eda-5ab947562761
  You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761

这个API能够提供若干与比特币有关的信息:

存币地址:[public_key]

Logo: [icon_url]

资产名字:[name]

资产在Mixin Network的uuid: [asset_key]

对美元的价格(Coinmarketcap.com提供): [price_usd]

存币时确认的区块数量:[confirmations]

比特币私钥呢?

比特币的私钥呢?这个私钥被Mixin Network通过多重签名保护,所以对用户来说是不可见的,比特币资产的提现和转账都需要用户提供正确的的RSA签名,PIN代码与会话密钥才能完成.

不只是比特币,还有以太坊,EOS等

这个帐号不只支持比特币,还支持以太坊,EOS等, 完整的区块链支持列表. 这个账户同时也支持所有的 ERC20 代币与 EOS 代币.

创建其它的币的钱包与创建比特币钱包过程一样,读对应的资产余额就可以.

Mixin Network 当前支持的加密货币 (2019-02-19)
crypto uuid in Mixin Network
EOS 6cfe566e-4aad-470b-8c9a-2fd35b49c68d
CNB 965e5c6e-434c-3fa9-b780-c50f43cd955c
BTC c6d0c728-2624-429b-8e0d-d9d19b6592fa
ETC 2204c1ee-0ea2-4add-bb9a-b3719cfff93a
XRP 23dfb5a5-5d7b-48b6-905f-3970e3176e27
XEM 27921032-f73e-434e-955f-43d55672ee31
ETH 43d61dcd-e413-450d-80b8-101d5e903357
DASH 6472e7e3-75fd-48b6-b1dc-28d294ee1476
DOGE 6770a1e5-6086-44d5-b60f-545f9d9e8ffd
LTC 76c802a2-7c88-447f-a93e-c29c9e5dd9c8
SC 990c4c29-57e9-48f6-9819-7d986ea44985
ZEN a2c5d22b-62a2-4c13-b3f0-013290dbac60
ZEC c996abc9-d94e-4494-b1cf-2a3fd3ac5714
BCH fd11b6e3-0b87-41f1-a41f-f0e9b49e5bf0

EOS的存币地址与其它的币有些不同,它由两部分组成: account_name and account tag, 如果你向Mixin Network存入EOS,你需要填两项数据: account name 是eoswithmixin,备注里输入你的account_tag,比如0aa2b00fad2c69059ca1b50de2b45569.

EOS的资产余额返回结果如下:

  Make your choose 3: Read EOS Balance & Address
  You choice to : { type: "3: Read EOS Balance & Address" }
  You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761
  EOS account name is  eoswithmixin  tag is  30f0c36057b9b22151173b309bd0d79c
  EOS balance is  0
  EOS price is (USD)  5.26225922
   You select the : 0b10471b-1aed-3944-9eda-5ab947562761
  You select the wallet 0b10471b-1aed-3944-9eda-5ab947562761
存入比特币与读取比特币余额

现在,你可以向比特币的钱包存币了。

当然,在比特币网络里转币,手续费是相当贵的,费用的中位数在0.001BTC,按当前4000美元的价格,在4美元左右,有一个方便的办法,如果你有Mixin Messenger帐号,里面并且有比特币的话,可以直接提现比特币到新创建的帐号的比特币充值地址,它们在同一个Mixin Network网络内,手续费为0,而且1秒到账。

下面的代码,可以读取比特币钱包余额.

  const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID);
  console.log("Bitcoin address is ", assetInfo.public_key);
  console.log("Bitcoin balance is ", assetInfo.balance);
  console.log("Bitcoin price is (USD) ", assetInfo.price_usd);
Mixin Network网内免手续费的,并且即时确认

任何币在Mixin Network内部的交易,都是无手续费的,并且立刻到账。
前期准备: 账户设置了PIN

对于新创建的帐号,我们通过updatePin来设置新PIN码, 代码如下:

  var info2 = await newUserClient.updatePin({oldPin : "",
                                             newPin: "123456",
                                           });
  console.log(info2);

  const verifyPin = await newUserClient.verifyPin("123456");
  console.log({ verifyPin });
Mixin Network帐号之间的比特币支付

通过Mixin Messenger,我们可以先转比特币给机器人,然后让机器人转币给新用户。

  const assetInfo = await newUserClient.getUserAsset(EOS_ASSET_ID);
  console.log("The Wallet "s EOS balance is ", assetInfo.balance);
  if ( assetInfo.balance > 0 ) {
    const Obj = {
      assetId: BTC_ASSET_ID,
      recipientId: MASTER_UUID,
        traceId: newUserClient.getUUID(),
        amount: assetInfo.balance,
        memo: "",
    };
    console.log(Obj);
    newUserClient.transferFromBot(Obj);
  }

读取Bitcoin的余额,来确认比特币是不是转成功了! 注意newUserClient是新用户的。

  const assetInfo = await newUserClient.getUserAsset(BTC_ASSET_ID);
  console.log("Bitcoin address is ", assetInfo.public_key);
  console.log("Bitcoin balance is ", assetInfo.balance);
如何将比特币存入你的冷钱包或者第三方交易所

如果你希望将币存入你的冷钱包或者第三方交易所, 先要得到冷钱包或者你在第三方交易所的钱包地址,然后将钱包地址提交到Mixin Network.

要点提示: 提现是需要支付收续费的,准备好比特币包地址!

增加目的钱包地址到Mixin Network

调用createAddress API, 将会返回一个address_id,下一步的提现操作会用到这个id。

  const withdrawAddress = await newUserClient.createWithdrawAddress({
    assetId: BTC_ASSET_ID,
    label: "BTC withdraw",
    publicKey: BTC_WALLET_ADDR,
  });

这里的 14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C 就是一个比特币钱包地址, 如下所示,提现费用是0.0025738 BTC, address_id 是"345855b5-56a5-4f3b-ba9e-d99601ef86c1".

Make your choose 9: BTC withdraw
You choice to : { type: "9: BTC withdraw" }
You wallet is : 0b10471b-1aed-3944-9eda-5ab947562761
{ type: "address",
  address_id: "a513da38-a18a-4536-abe4-d1c29ca3a1a8",
  asset_id: "c6d0c728-2624-429b-8e0d-d9d19b6592fa",
  public_key: "14T129GTbXXPGXXvZzVaNLRFPeHXD1C25C",
  label: "BTC withdraw",
  account_name: "",
  account_tag: "",
  fee: "0.00212232",
  reserve: "0",
  dust: "0.0001",
  updated_at: "2019-04-04T02:20:42.552274992Z" }
? Input you BTC amount:
创建提现地址成功后,你可以用readAddress读取最新的提现费。
  const addressList = await newUserClient.getWithdrawAddress(BTC_ASSET_ID);
  console.log(addressList);
提交提现请求,Mixin Network会即时处理提现请求.

提交提现请求到 Mixin Network, withdrawAddress.address_id 就是createAddress创建的。

  console.log(withdrawAddress);
  const prompts = [
    {
      name: "amount",
      type: "input",
      message: "Input you BTC amount: ",
    },
  ];
  const answers = await inquirer.prompt(prompts);
  console.log(answers);
  const withdrawResult = await newUserClient.withdraw({
    addressId: withdrawAddress.address_id,
    assetId: BTC_ASSET_ID,
    amount: answers.amount,
    memo: "withdraw by nodejs",
  });
  console.log(withdrawResult);
可以通过blockchain explore来查看进度.

完整的代码在这儿

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/24638.html

相关文章

  • Java开发区块链的三大sdk库

    摘要:是企业与区块链相遇的地方。的框架旨在成为开发区块链解决方案的支柱。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 如果你想将区块链合并到一个Java项目中,现在我们来看看就是这个细分领域中三个最大的OSS玩家。 好的伙计们,我们都听说过比特币,以太坊或其他加密货币,其中有一些时髦的名字围绕着我们常见的新闻,但我们作为Java开发人员知道如何轻松地与这些区块链技术进行交互吗?以...

    iKcamp 评论0 收藏0
  • 区块链开发中使用的最流行的编程语言

    摘要:我们目前正处于一个新兴的区块链开发行业中。,一种在以太坊开发人员中流行的新的简单编程语言,因为它是用于开发以太坊智能合约的语言。它是全球至少万开发人员使用的世界上最流行的编程语言之一。以太坊,主要是针对工程师使用进行区块链以太坊开发的详解。 我们目前正处于一个新兴的区块链开发行业中。区块链技术处于初期阶段,然而这种颠覆性技术已经成功地风靡全球,并且最近经历了一场与众不同的繁荣。由于许多...

    2shou 评论0 收藏0
  • 一个比特交易的完整流程。

    摘要:本文解释了比特币交易的内容,目的和结果。本文底部的信息图提供了从钱包到区块链的整个比特币交易流程的全面说明。在文本中使用的任何地方是比特币交易的缩写。目的比特币交易的目的是将一定数量的比特币的所有权转移到比特币地址。 本文解释了比特币交易的内容,目的和结果。下面的解释适用于新手和中级比特币用户。 作为加密货币用户,你需要熟悉交易雏形——为了你对这种不断发展的创新有信心,以及作为理解新兴...

    My_Oh_My 评论0 收藏0
  • Node.js买卖比特 教程

    摘要:完整的步骤如下检查比特币或的余额,钱包地址。比特币的到帐时间是个区块的高度,约分钟。 通过 Nodejs 买卖Bitcoin showImg(https://segmentfault.com/img/remote/1460000018771566?w=1200&h=659); Github Repo 方案一: 通过ExinCore API进行币币交易 Exincore 提供了基于Mix...

    Airy 评论0 收藏0
  • 如何理解比特和区块链?

    摘要:比特币区块链无疑是当今业界的最热门的。目前,每个成功的矿工获得可能每年更换一次或通过比特币社区决策作为成功向区块链添加一块交易的奖励。填写其他详细信息,例如比特币金额和可选说明。 比特币区块链无疑是当今业界的最热门的。通过这篇博客,我将尽力向大家介绍加密货币比特币的概念,以及它如何创造我们称之为区块链的革命性技术。 这个问题经常引起混淆。这篇文章可以快速解释和清理这方面的混乱! 什么是...

    Kosmos 评论0 收藏0

发表评论

0条评论

caozhijian

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<