所有渠道

Monero

你运行自己的 Monero 节点,付款直接进入你的钱包。没有公司夹在中间,连我们也没有。

你需要什么

字段它做什么
铸址端点 URL你节点的公开铸址路由。我们调用它为每个订单获取一个新地址。非机密。
Webhook secret一个你的监听程序用以签名、我们用以校验的共享密钥。它永远碰不到你的钱包。机密。

这个选项面向想运行自己节点的人。你还会在自己的机器上运行一个 Monero 节点、一个只读钱包,以及一个常驻的小型监听程序。本指南会把这一切都走一遍。如果你宁愿什么都不运行,那就改连一个托管的加密货币服务。

Money flow

Money

  1. Buyer

    Taps your Coin Moebius Buy Button and pays from their own wallet.

  2. Your product page

    Your Coin Moebius Buy Button asks Coin Moebius to start a checkout.

  3. Coin Moebius Messages only

    Gets a fresh address from your server and shows it to the buyer.

  4. Blockchain

    Carries the coins from the buyer straight to you.

    • Monero
    • Zano
    • Freedom Dollar
    • Bitcoin
    • Bitcoin Cash
  5. Your wallet

    Receives the coins.

  6. Your server

    Sees the payment land in your wallet and tells Coin Moebius the sale is paid. Your keys and balance never leave your server.

    Coin Moebius dashboardSale shows as paid.
  • No buyer data

    Card numbers never reach us. Buyer names, addresses and contact details are stripped before a sale is saved.

  • Where our bill comes in

    The payment goes to you. Our bill comes separately. On Flex, that bill is based on the sales you’ve made, at 2% + 20¢ each. Pro starts at $24 a month with 500 sales included, then a few cents for each extra sale. Business is $99 a month for unlimited sales. Your provider’s fees are separate from ours.

我们为什么要每个字段

铸址端点 URL

当买家点击购买时,我们向你的节点要一个新地址显示给他们。那个请求发往这一条公开路由。它只返回一个地址、别无其他;你的钱包安然隐于其后。

Webhook secret

你的监听程序通过发送一条签名消息告诉我们“这个订单已付款”。这个共享密钥让我们能确认那条消息真的来自你的监听程序,于是没人能伪造一个已付款事件。它什么都读不了,也什么都动不了。

设置

  1. 你将要运行什么

    三样东西,全在你自己的机器上。除了公开的铸址 URL 和那个共享密钥,这里没有任何东西交给我们。

    • 一个 Monero 节点(monerod)和一个只读钱包(monero-wallet-rpc),保持私有。
    • 一个铸址端点:一条为每个订单分发新地址的小型公开路由。
    • 一个监听程序:一个常驻的小程序,监视你的钱包,并在一笔付款到账时告诉我们。
  2. 创建一个只读钱包

    一个只读钱包能看到入账付款并铸造新的收款地址,但它不能花费。你只用你真实钱包的地址和它的私有 view key 来构建它,别无其他。正是这一点让你的节点能检测付款,却永远不掌握动用它们的权力。

    monero-wallet-cli --generate-from-view-key ~/monero/view-only

    它会提示你输入主地址和私有 view key。绝不要输入你的种子或 spend key,把那些放在另一台机器上。它会写出 view-only 和 view-only.keys;设一个密码并把它存进一个文件(wallet.password,放在钱包旁边)以备下一步。

  3. 运行你的 Monero 节点

    守护进程负责同步并持有区块链。把它作为一个服务(systemd 或 Docker)运行,好让它自行重启。它的 RPC 监听在 127.0.0.1:18081。

    monerod --data-dir ~/.bitmonero --prune-blockchain --restricted-rpc

    一个裁剪过的节点让磁盘占用保持很小,同时仍能看到每一笔入账付款。该节点连得上网络,但不对外暴露任何东西。

  4. 运行 wallet RPC

    第二个服务,它打开只读钱包并回应铸址端点和监听程序。把它指向你的节点,并绑定到 localhost。也把它作为一个服务运行。

    monero-wallet-rpc \
      --wallet-file ~/monero/view-only \
      --password-file ~/monero/wallet.password \
      --rpc-bind-ip 127.0.0.1 --rpc-bind-port 18083 \
      --daemon-address 127.0.0.1:18081 --trusted-daemon \
      --disable-rpc-login

    绝不要把 wallet RPC 暴露到公网;把它绑定到 localhost 或一个私有网络。--disable-rpc-login 之所以可以,只因为它仅限 localhost;如果它能从别处访问,请用 --rpc-login。只有下面的铸址端点是公开的。

  5. 安装 Coin Moebius Monero 软件包

    它提供地址铸造器、webhook 签名器和监听程序,于是你几乎不用写代码。最快的路径是下面这个开箱即跑的示例:复制文件夹,填入四个值,然后启动它。

    npm install @aquarian-metals/coin-moebius-monero
  6. 生成你的 webhook secret

    一个用以签名和校验 webhook 的强随机值。两种生成方式,由你选择:在后台里添加该渠道时点击“生成”(它在你的浏览器里运行,从不在我们的服务器上),或自己运行下面的命令。无论哪种,都把同一个值粘进你的监听程序和后台两处。

    openssl rand -hex 32
  7. 架起铸址端点

    一条挡在你钱包前面的公开 POST 路由。它用软件包的 createMoneroCreator 为每个订单铸造一个新地址。这是你唯一向互联网暴露的东西,而且暴露它是安全的:它返回一个收款地址,不移动任何钱。

    // POST /coin-moebius/monero/mint
    import { createMoneroCreator } from '@aquarian-metals/coin-moebius-monero/server';
    
    const mint = createMoneroCreator({
      walletRpcUrl: 'http://127.0.0.1:18083/json_rpc',
      store: myStore,
      xmrPerUnit: async (cur) => (cur === 'XMR' ? 1 : await myPriceFeed(cur)),
    });
    // return mint({ productId, amount, currency, metadata }) as JSON

    价格从哪来由你决定。Coin Moebius 从不调用价格预言机。

  8. 运行监听程序并把它指向我们

    监听程序是那个常驻的程序,每隔几秒检查一次你的钱包,并在一笔付款确认时向我们签发一条消息。把它的 webhook URL 设为你的项目地址(见下),它的密钥设为你生成的那个值。把它跑在你的钱包旁边,置于 systemd 或 Docker 之下。

    import { createMoneroIndexer } from '@aquarian-metals/coin-moebius-monero/server';
    
    const watcher = createMoneroIndexer({
      walletRpcUrl: 'http://127.0.0.1:18083/json_rpc',
      store: myStore,
      webhookUrl: process.env.MONERO_WEBHOOK_URL,   // your Coin Moebius URL, below
      hmacSecret: process.env.MONERO_HMAC_SECRET,   // the secret you generated
      requiredConfirmations: 10,
    });
    watcher.start();

    它的设计就是追赶式的。如果它离线了一段时间,下一次运行会看到它错过的那些付款并在那时告诉我们。一台家用服务器就够了;你不需要完美的正常运行时间。

  9. 你的 webhook URL

    把监听程序的 webhookUrl 设为你的项目地址。你的项目 id 在后台的项目设置里。

    https://api.coinmoebius.com/webhook/monero/<your project id>
  10. 在后台里连接

    添加渠道,选择“做你自己的渠道”,然后选 Monero。粘上你的铸址端点 URL 和 webhook secret。这就是我们存储的全部,而这两个值都碰不到你的钱包。

连接之后

自托管节点没有沙盒,所以你第一笔真实的小额付款就是测试:

  1. 创建一个商品,并把买按钮放到一个页面上(本地 HTML 文件也行),指向你的项目。
  2. 从你自己的钱包付一笔小额 Monero。
  3. 等待确认。Monero 完全确认大约要二十分钟,这是设计使然。
  4. 打开“交易”标签。当新行到达 succeeded 时,你的铸址端点、监听程序和密钥就都端到端工作了。

问题排查

结账马上失败。

我们够不到你的铸址端点。确认它是一个公开的 https URL,且你的节点在线。保存时后台会把这显示为一条可达性消息。

买家付了款,但订单仍停在待处理。

要么监听程序没在运行,要么它的密钥不匹配。确认监听进程是起着的,且它的 MONERO_HMAC_SECRET 与你粘进后台的值完全一致。

付款过了一会儿才显示出来。

那是正常的。Monero 经过若干区块才确认;监听程序在报告成功前会等待十次确认(约二十分钟)。

值得了解

在联网机器上保留一个只读钱包. 监听程序只需看到入账付款。把你的 spend key 放在一台独立的离线机器上,并从那里归集资金。

绝不暴露 wallet RPC. 只有铸址端点是公开的。始终把 wallet RPC 绑定到 localhost 或一个私有网络。

停机代价很低. 监听程序在中断后会追赶上来,并报告它错过的那些付款。什么都不会丢。

轮换密钥. 随时生成一个新密钥,然后把它粘进监听程序和后台两处。

Monero circular economy

有问题? Join our Discord

准备好连接一个渠道了吗?

挑你已在用的渠道。买家通过你的账户付款,而你只保留一个买按钮。