#钱包 #交易 #守护进程 #themelio #逻辑 #水龙头

应用 melwalletd

官方themelio钱包守护进程

32个版本

0.6.3 2023年3月10日
0.5.0 2022年10月30日
0.4.1 2022年7月26日
0.3.9 2022年3月31日

#1862 in 魔法豆

Download history 6/week @ 2024-03-10 201/week @ 2024-03-31

80 每月下载量

MPL-2.0 许可证

93KB
2K SLoC

melwalletd:Themelio钱包守护进程

与其他缺乏“账户”抽象的基于UTXO的区块链(如比特币)一样,Themelio需要一些复杂的逻辑来处理钱包 —— 软件管理链上资产并提供类似于银行账户的接口。

In Themelio, the "canonical" wallet software is melwalletd, a headless program that internally manages wallets and exposes a local REST API for operations on the wallets. Although you can use it directly as a Themelio wallet, melwalletd is intended more as a backend to wallet apps, such as melwallet-cli, the official CLI wallet.


启动melwalletd

通过cargo install --locked melwalletd安装melwalletd后,通过指定存储钱包的目录和要连接的网络来启动它

$ melwalletd --wallet-dir ~/.themelio-wallets --network testnet
May 18 16:20:43.583  INFO melwalletd: opened wallet directory: []

如果目录不存在,将会被创建。默认情况下,melwalletd将监听在localhost:11773


管理钱包

创建钱包

端点 PUT /wallets/[wallet name]

正文字段

  • password: 可选字段;用于加密私钥的密码。警告:如果不提供,私钥将以明文形式存储!
  • secret: 可选字段;用于导入现有钱包的密钥

响应

示例

$ curl -s 'localhost:11773/wallets/alice' -X PUT --data '{"password": "password"}'

列出所有钱包

端点 GET /wallets

响应

  • 哈希表,将钱包名称映射到具有以下字段的类型 WalletSummary
    • total_micromel:钱包的总体 µMEL 余额
    • detailed_balance:将特定代币面额与金额关联的映射
    • staked_microsym:网络中抵押的 µSYM 金额
    • network:1 表示测试网,255 表示主网
    • address:地址编码的契约哈希
    • locked:布尔值,表示钱包是否被锁定。

示例

$ curl -s localhost:11773/wallets | jq
{
  "alice": {
    "total_micromel": 0,
    "network": 1,
    "address": "t607gqktd3njqewnjcvzxv2m4ta6epbcv1sdjkp0qkmztaq3wxn350",
    "detailed_balance": {
		"73": 9871,
        "6d": 32131,
        "64": 314159265
      },
    "staked_microsym": 2500000000,

    "locked": true
  },
  "labooyah": {
    "total_micromel": 0,
    "network": 255,
    "address": "t1jhtj4ex1n069xr8w6mbkgrt25jgzw0pam1a25redg9ykpsykbq70",
    "detailed_balance": {
		"6d": 202220,
    },
    "staked_microsym": 0,
    "locked": true
  },
  "testnet": {
    "total_micromel": 17322999920,
    "network": 1,
    "address": "t6zf5m662ge2hwax4hcs5kzqmr1a5214fa9sj2rbtassw04n6jffr0",
    "detailed_balance": {
		"64": 10111,
    },
    "staked_microsym": 0,
    "locked": true
  }
}

导出钱包

端点 GET /wallets/[钱包名称]

响应

  • 哈希表,将钱包名称映射到类型 WalletSummary,具有以下字段
    • total_micromel:钱包的总体 µMEL 余额
    • detailed_balance:将特定代币面额与金额关联的映射
    • staked_microsym:网络中抵押的 µSYM 金额
    • network:1 表示测试网,255 表示主网
    • address:地址编码的契约哈希
    • locked:布尔值,表示钱包是否被锁定。

示例

$ curl -s localhost:11773/wallets/alice | jq
{
  "alice": {
    "total_micromel": 0,
    "network": 1,
    "address": "t607gqktd3njqewnjcvzxv2m4ta6epbcv1sdjkp0qkmztaq3wxn350",
    "detailed_balance": {
		"73": 9871,
        "6d": 32131,
        "64": 314159265
      },
    "staked_microsym": 2500000000,

    "locked": true
  }
}

使用单个钱包

解锁钱包

端点 POST /wallets/[名称]/unlock

正文字段

  • password:密码

响应

锁定钱包

端点 POST /wallets/[名称]/lock

正文字段

响应

发送水龙头交易

这个动词发送一个水龙头交易,向钱包添加固定的 1001 MEL。 注意:显然,这仅在 测试网 钱包中有效!

端点 POST /wallets/[名称]/send-faucet

正文字段

无。

响应

正在发送的交易引用的十六进制交易哈希。

示例

$ curl -s localhost:11773/wallets/alice/send-faucet -X POST
"86588da7863b39152105e4f78c04e07a5d3f3ebf61d799f95293372dabdb06a1"

列出所有交易

端点 GET /wallets/[名称]/transactions/

响应

包含类型 (TxHash, Option<BlockHeight>) 元素列表的 JSON 对象

  • TxHash:与给定钱包相关联的特定交易的哈希
  • Option<BlockHeight>:如果未确认,则为 null,否则为确认交易所在的区块的整数高度

示例

$ curl -s localhost:11773/wallets/bar/transactions | jq
[
  [
    "d23b4240f7e02a38e8deb8a111d0ec8650a8912df50d15ec43992e3085b4ca98",
    null
  ],


    [
      "5b4ca98d23b4240f7e02a38e8deb8a111d0ec8650a8912df50d15ec43992e308",
      48113
    ]

]

检查交易

端点 GET /wallets/[名称]/transactions/[txhash]

响应

包含以下字段的类型 TransactionStatus 的 JSON

  • raw:实际的 JSON 格式交易
  • confirmed_height:如果未确认,则为 null,否则为确认交易的高度。
  • outputs:一组 AnnCoinID 对象的数组,例如
    • coin_data:CoinData 对象
    • is_change:这是否是我自己的更改输出?
    • coin_id:以字符串表示的 CoinID(txhash-index)

示例

$ curl -s localhost:11773/wallets/alice/transactions/
442bdc353b773b8949c59cee8061545a9a89e27a2e6638fcc1d065583bb170b8  | jq
{
  "raw": {
    "kind": 255,
    "inputs": [],
    "outputs": [
      {
        "covhash": "t4xn73csvjxp0dvh0gs6ehpgfq0ht0akr9g6tkxywv7xvfp09cy6x0",
        "value": 1001000000,
        "denom": "MEL",
        "additional_data": ""
      }
    ],
    "fee": 1001000000,
    "covenants": [],
    "data": "72a1aba97ada3d1958932244836b0c72aaedeef7f6b032c1877c83ae05e28469",
    "sigs": []
  },
  "confirmed_height": 42633,
  "outputs": [
    {
      "coin_data": {
        "covhash": "t4xn73csvjxp0dvh0gs6ehpgfq0ht0akr9g6tkxywv7xvfp09cy6x0",
        "value": 1001000000,
        "denom": "MEL",
        "additional_data": ""
      },
      "is_change": true,
      "coin_id": "442bdc353b773b8949c59cee8061545a9a89e27a2e6638fcc1d065583bb170b8-0"
    }
  ]
}

准备交易

注意:这 准备 从钱包发送的交易,创建一个填写完整、有效的交易,但 不会 改变钱包状态。如果您实际上想发送交易,必须使用 send-tx 调用。

请注意,此端点对更高级的合约部署没有用。请检查send-tx

端点 POST /wallets/[name]/prepare-tx

正文字段

  • outputs:一个CoinData数组,表示交易所需的输出。添加的任何变动输出都保证在这些输出之后添加。

  • kind:交易的可选TxKind(默认为Normal)

  • inputs:可选,一个表示必须由本交易使用的输入的CoinID数组。这对于构建契约链等很有用。

  • data:可选,交易的其他数据(默认为空)

  • 契约:

  • nobalance:可选,在平衡(检查交易产生的硬币数量与消耗的硬币数量是否完全相同)时不进行检查的Denom向量。通常,这用于在准备DOSC铸造交易时免除ERG余额检查。

  • signing_key:可选,与钱包的契约对应的ed25519签名密钥。警告:仅用于高级用例,如果使用不当可能会导致资金损失

响应

  • JSON编码的Transaction

示例

$ curl -s localhost:11773/wallets/alice/prepare-tx -X POST --data '{
    "outputs": [
        {
            "covhash": "57df1dd5b067f77a177127cbe4d69aa10fe8fcac3b2f9718cb8263d5a6216ab0",
            "value": 1000,
            "denom": "6d",
            "additional_data": ""
        }
    ],
    "signing_key": "4239e79eab9b39c49de990363197a64e1a54f0f9a0d12a936e85e69ea7fb05b006425dfe7967003e2a5362e36231730f2faaa6068979afc52784f916466e05b6"
}'


{
    "kind": 0,
    "inputs": [
        {
            "txhash": "4950f3af9da569e1a99a7e738026a581d6e96caaf02d94b02efcd645540a2d2f",
            "index": 0
        }
    ],
    "outputs": [
        {
            "covhash": "57df1dd5b067f77a177127cbe4d69aa10fe8fcac3b2f9718cb8263d5a6216ab0",
            "value": 1000,
            "denom": "6d",
            "additional_data": ""
        },
        {
            "covhash": "41d04b65a010aaa3404e1a109c53e3190a393d7ff920fa5644969a879547d0aa",
            "value": 1000998977,
            "denom": "6d",
            "additional_data": ""
        }
    ],
    "fee": 23,
    "scripts": [
        "420009f100000000000000000000000000000000000000000000000000000000000000064200005050f02006425dfe7967003e2a5362e36231730f2faaa6068979afc52784f916466e05b6420001320020"
    ],
    "data": "",
    "sigs": [
        "df3cc2795d3c9576b85c4c960501af3e44bbc490c9dc51c8422f18a3a0fa1150c2f745440206748c8205971ba0cff32b87c9797a4d1098ce3bd677db62e8560c"
    ]
}

发送交易

注意:此端点将拒绝任何格式不正确或不属于钱包的交易。对于个人使用,建议使用[melwallet-cli]({{< ref my-first-tx.md>}})代替。如果必须使用此端点,请考虑使用/prepare-tx来准备此交易的正文。

端点 POST /wallets/[name]/send-tx

正文

带有字段的JSON编码的Transaction

  • kind:此交易的TXKind
  • inputs:一个CoinID数组
  • outputs:一个CoinData数组
  • feeCoinValue

响应

  • 引用的交易哈希

依赖关系

~57–98MB
~2M SLoC