ledger-wallet-api, 用于分类帐钱包 Chrome 应用程序的高级 API

分享于 

16分钟阅读

GitHub

  繁體 雙語
High level API to the Ledger Wallet Chrome app
  • 源代码名称:ledger-wallet-api
  • 源代码网址:http://www.github.com/LedgerHQ/ledger-wallet-api
  • ledger-wallet-api源代码文档
  • ledger-wallet-api源代码下载
  • Git URL:
    git://www.github.com/LedgerHQ/ledger-wallet-api.git
    Git Clone代码到本地:
    git clone http://www.github.com/LedgerHQ/ledger-wallet-api
    Subversion代码到本地:
    $ svn co --depth empty http://www.github.com/LedgerHQ/ledger-wallet-api
    Checked out revision 1.
    $ cd repo
    $ svn up trunk
    
    高级API到分类帐钱包 Chrome 应用程序

    这是 Ledger钱包 Chrome 应用程序的高级 JS API。 使用这个 API,你可以直接与 Chrome 应用程序通信并使用嵌入式特性,比如请求地址接收比特币,或者发送比特币交易。

    每个对API的调用将触发对 Chrome 应用程序的UI响应,用户将能够验证该请求。

    演示

    这里有一个非常简单的API调用演示
    https://www.ledgerwallet.com/api/demo.html

    用法

    首先,你需要在页面中插入 ledger.js 文件:

    <head>
     <scriptsrc="ledger.js"></script>
    </head>

    Ledger 对象的初始化如下所示:

    functioncallback(event) {
     console.log(event.response);
    };Ledger.init({ callback: callback });

    这将在 ledgerwallet.com 域上创建一个不可见的iframe,作为你的网页和分类帐 Chrome 应用程序之间的代理。 每次请求API调用时,将向 Chrome 应用程序发送一条消息,并将响应发送到 callback 函数。

    所有调用都是异步的,并且你不是garanteed来获取回调( 例如如果用户杀死 Chrome 应用程序)。 如果使用按钮触发调用,建议将动作按钮停用几秒钟,使用实例。 setTimeout(enableButtonFunction, 4000)

    API调用

    == =

    Ledger.isAppAvailable()

    检查分类帐 Chrome 应用程序是否已经安装。

    functioncallback(event) {
     if (!event) {
     console.log("Chrome app not available");
     } else {
     response =event.response;
     if (response.command=="ping") {
     console.log("Chrome app is available.");
     }
     }
    };Ledger.init({ callback: callback });Ledger.isAppAvailable();

    如果分类帐 Chrome 应用程序不可用,则返回的event 将为 undefined。 如果它可用,它将返回以下 event.response:

    { 
     "command":"ping",
     "result":true}

    如果未安装分类帐 Chrome 应用程序,所有下列API调用都将返回 undefined。 在下一个例子中,我们被认为已经安装了 Chrome 应用程序,因这里我们不检查 event.response的存在。

    == =

    Ledger.launchApp()

    启动分类帐 Chrome 应用程序。

    functioncallback(event) {
     response =event.response;
     if (response.command=="launch") {
     console.log("Chrome app has been launched.");
     }
    };Ledger.init({ callback: callback });Ledger.launchApp();

    启动应用程序后,它将始终返回以下响应:

    { 
     "command":"launch",
     "result":true}

    你通常不必使用这里调用,因为它将被其他调用自动使用。

    == =

    Ledger.hasSession()

    检查钱包是否已经初始化并准备好( Nano已经插入,输入正确的PIN,钱包同步)。

    functioncallback(event) {
     response =event.response;
     if (response.command=="has_session") {
     if (response.result) {
     console.log("Wallet is ready");
     } else {
     console.log("Wallet is NOT ready");
     }
     }
    };Ledger.init({ callback: callback });Ledger.hasSession();

    如果会话已经准备好:

    { 
     "command":"has_session",
     "result":true}

    如果会话还没有准备好:

    { 
     "command":"has_session",
     "result":false}

    通常不需要使用这里调用。 所有以下API调用都要求钱包就绪。 因此他们会自动检查应用程序是否已经启动,并等待会话通过加入 hasSession() 调用来准备。

    == =

    Ledger.getAccounts()

    请求导出你的帐户列表( 一个帐户是一个HD钱包帐户,包括 public 地址包)。

    functioncallback(event) {
     response =event.response;
     if (response.command=="get_accounts") {
     console.log(response);
     }
    };Ledger.init({ callback: callback });Ledger.getAccounts();

    如果用户取消该请求:

    {
     "command":"get_accounts",
     "success":false,
     "message":"Request cancelled by the user"}

    如果用户授予请求:

    {
     "command":"get_accounts",
     "success":true,
     "accounts":[
     {
     "index":0,
     "name":"My account",
     "hidden":false,
     "color":"#FF5254",
     "wallet_id":1,
     "total_balance":0,
     "root_path":"44'/0'/0'" }
     ]
    }

    getOperations 中使用 indexaccount_id 值。

    所有余额均在satoshis中。

    == =

    Ledger.getOperations(account_id)

    请求导出所有操作( 传入和传出事务) 帐户 account_id

    functioncallback(event) {
     response =event.response;
     if (response.command=="get_operations") {
     console.log(response);
     }
    };Ledger.init({ callback: callback });Ledger.getOperations(1);

    如果用户取消该请求:

    {
     "command":"get_operations",
     "success":false,
     "message":"Request cancelled by the user"}

    如果用户授予请求:

    { 
     "command":"get_operations",
     "success":true,
     "operations":[ 
     { 
     "hash":"f5263795501685d5f10ec08a37f3caceb4e215d8632f5cfd325faaa271675cde",
     "fees":50000,
     "time":1429643779892,
     "type":"reception",
     "value":150000,
     "confirmations":333,
     "senders":[ 
     "3882TpSheaxuHESqNyMW8L3BA33qirEPYt",
     "3PQhX99dAH2rowwMYfPP1KWKRbdCn55cjJ" ],
     "recipients":[ 
     "15Tc1vFcBQJD5vCs5sZM3s5cAZewLs8sM5" ],
     "id":81,
     "account_id":1 },
     { }
     ]
    }

    == =

    Ledger.getNewAddresses(account_id, count)

    请求导出帐户 account_idcount 新地址。

    functioncallback(event) {
     response =event.response;
     if (response.command=="get_new_addresses") {
     console.log(response);
     }
    };Ledger.init({ callback: callback });Ledger.getOperations(1,5);

    如果用户取消该请求:

    {
     "command":"get_new_addresses",
     "success":false,
     "message":"Request cancelled by the user"}

    如果用户授予请求:

    { 
     "command":"get_new_addresses",
     "success":true,
     "addresses":{ 
     "44'/0'/0'/0/36":"1633oRHv5jPwtZW2bASbS4geWKQd5ENR6F",
     "44'/0'/0'/0/37":"1rvTbWuwEuwDCWbMCgqyKTWUK69jqNXwkv",
     "44'/0'/0'/0/38":"1ewd4XZ8tbNSwGZ6e8fxNKdvFEwaQxVULn",
     "44'/0'/0'/0/39":"1cTyUnyCFfXwShaVMZmL6uMpArEUrKnanj",
     "44'/0'/0'/0/40":"185UpphCFnxowehNarFZnxp9FGFsLJsz6D" },
     "account_id":1}

    == =

    Ledger.sendPayment(address, amount, data)

    请求 Chrome 应用程序将 amount BTC的付款发送到 address。 设置数据后,将添加一个附加的OP_RETURN输出,其中包含数据( 必须是十六进制格式的最大 80字节)。

    functioncallback(event) {
     response =event.response;
     if (response.command=="send_payment") {
     console.log(response);
     }
    };Ledger.init({ callback: callback });Ledger.sendPayment('19QM7ToSsi7N9zsZRdRTLcGZVspXQjQUY5',0.001);

    如果用户取消该请求:

    { 
     "command":"send_payment",
     "success":false,
     "message":"Payment cancelled"}

    如果用户确认付款:

    {
     "command":"send_payment",
     "success":true,
     "transaction":{
     "amount":100000,
     "fee":10000,
     "hash":"d4b9377db50380aef6c7ba43316ed4c4573c9969cff726a2460febc789c635dc",
     "raw":"01000000025bca73777be5366d8a92226be8da32a4657ff80a80ac5dc33d42bf43e2d63929000000006a473044022004d695816488a4ebd733a45f24fc56bda675c61be65dc4b854f182baa4693e4802206e99b1bd3b40cd06fc7bae67a8c6fcd13f0eb92f3ce02b48e39aca9dbe7e5411012102109fe1ef60221ca9296a43bd3c9306b103c1588c5e413aab39e43e73bb9ce4c5ffffffffd373960e9a2569bf62451eaabc7ddb1bc16fa4088da2a7eb4dd4f626b3f40230000000006a47304402204f6e0e5935226aa235d6a21fe7ea4933447d57668c33d44837e66f4994fe871102201e09c162ffa03af5aa292bc630ab892a60cd07f330032fdb2b1e0bc45f2969c601210234277b06506b5aa8433cf5fa2df36cc252a9b5292a1c3e58a0ce737641ba13eeffffffff02a0860100000000001976a9145c2b5c8ee43ecc2f2b1141ec6924f53fdb0d009d88ac101e3402000000001976a91414baa4000d841e6e4a19a57efa2eeebdff3ce9b788ac00000000" }
    }

    没有必要将原始事务推送到比币网络,因为它已经由 Chrome 应用程序完成。

    == =

    Ledger.getXPubKey(path)

    path 请求扩展的public 密钥。

    functioncallback(event) {
     response =event.response;
     if (response.command=="get_xpubkey") {
     console.log(response);
     }
    };Ledger.init({ callback: callback });Ledger.getXPubKey("44'/0'/0'");

    如果用户取消该请求:

    { 
     "command":"get_xpubkey",
     "success":false,
     "message":"Export request cancelled"}

    如果用户确认导出请求:

    { 
     "command":"get_xpubkey",
     "success":true,
     "xpubkey":"xpub6D52jcEfKA4cGeGcVC9pwG37Ju8pUMQrhptw82QVHRSAGBELE5uCee7Qq8RJUqQVyxfJfwbJKYyqyFhc2Xg8cJyN11kRvnAaWcACXP6K0zv"}

    == =

    Ledger.signP2SH(inputs, scripts, outputs_number, outputs_script, paths)

    请求分类帐Nano签署签名交易。

    • inputs 是以前tx哈希( 人类可读)的array,输入索引( 在 4字节上,大尾数编码)
    • scripts 是一个包含兑换脚本的array
    • outputs_number 是输出的数量
    • outputs_script 是序列化的输出脚本
    • paths 是一个 array,包含与每个输入关联的键的路径

    示例 below 显示了参数的期望格式。

    functioncallback(event) {
     response =event.response;
     if (response.command=="sign_p2sh") {
     console.log(response);
     }
    };Ledger.init({ callback: callback });var inputs = [
     [ "71f97fa2a21486ecd99674a8ae068d92acd2e9db49c199473be39984e6cbe0f6", "00000000" ],
     [ "171e6a969ff196a2cfaaba4780c292e33fc297672a065cc5c5c684727cf9e3ba", "00000001" ]
    ];var scripts = [ 
     "52210289b4a3ad52a919abd2bdd6920d8a6879b1e788c38aa76f0440a6f32a9f1996d02103a3393b1439d1693b063482c04bd40142db97bdf139eedd1b51ffb7070a37eac321030b9a409a1e476b0d5d17b804fcdb81cf30f9b99c6f3ae1178206e08bc500639853ae",
     "522102afe2165371442437b86089a17e8d1c26d127e3723b19f568e9c11e326946111521032d139518b16c112d5f1a52157f1468c0b7a570c41673debee8cd2e53eb084df12103b13fe78b0320ceb77795c87ed72069f12edf64169d15f8f9827f0bb4fdbe760f53ae"]; var paths = [
     "44'/0'/0'/0/0/0/1",
     "44'/0'/0'/0/0/0/2",
    ];var outputs_number =2var outputs_script ="40420f00000000001976a91496986c2703c6b311c884bf916d28621bc61e8b7a88acdc0c03000000000017a914ddf0a9f3e0c9822feef702d36dee6c0bd2bf7c6d87"Ledger.signP2SH(inputs, scripts, outputs_number, outputs_script, paths);

    如果用户取消了签名请求:

    { 
     "command":"p2sh",
     "success":false,
     "message":"Signature request declined"}

    如果用户确认了签名请求:

    { 
     "command":"sign_p2sh",
     "success":true,
     "signatures":[ 
     "3044022012affaf1b44b4bd365a6ab45f0911ea0825cd621a3adef135f5877af013628ae0220745c106a9823e0b3fdcede7129605420213491b32b40abf2b9934a33614d296301",
     "304502210087f7c10e1f3390558e25dd2ed6c6d4cf6e0f86b2cdd065136b5ed4e3c3c36a3202200ce27357a2b36f7b3b102eeb4eb5b4937c5a84ecc4337f25c46e3704667a930a01" ]
    }

    比特币网络上什么都没有。

    因为它是P2SH签名,所以分类帐Nano不会要求第二个因素确认。

    == =

    Ledger.bitid(uri, silent)

    请求 BitID 登录到 uri。 如果 silenttrue,Chrome 应用程序将不会将签名发送到主机( 你必须在你的JS应用程序中自己做)。

    functioncallback(event) {
     response =event.response;
     if (response.command=="bitid") {
     console.log(response);
     }
    };Ledger.init({ callback: callback });Ledger.bitid('bitid://bitid.bitcoin.blue/callback?x=5f38d0fb45b25015&u=1');

    如果用户取消身份验证请求:

    { 
     "command":"bitid",
     "success":false,
     "message":"Authentication cancelled"}

    如果用户确认身份验证请求:

    { 
     "command":"bitid",
     "success":true,
     "address":"1M7gUz4NRLBty5WUuNQPNNG5GE2x5t6Wbp",
     "signature":"H5/DFfbXP6tX9bNn/74l/HGC7jhInL5cKCFtLLUQ4nt6C1dB6hepuAlHSI5tG2TsLG6p6ox1qk1EUiMnFikDrEg=",
     "uri":"bitid://bitid.bitcoin.blue/callback?x=5f38d0fb45b25015&u=1"}

    路线图

    如果你想查看它的他API调用,请打开一个问题说明,我们将讨论在路线图中添加这个功能。


    API  CHR  HIG  chrome  Level  wal