Mixin 全币种钱包接入指南
欢迎接入 Mixin 全币种钱包!无需申请、轻松集成!立刻享有免费转账、实时到账、安全好用的去中心化数字钱包!
关于 Mixin Network
一个免费、快速的点对点数字资产交易网络,使用侧链、Layer2 Off-Chain 等技术,采用 PoS + Asynchronous BFT 共识,用 DAG 存储交易记录,最终实现秒级确认、零手续费和加强交易隐私的特点。
- 主网已于 2019-02-28 上线,截止到 2019-10-15 共有 31 个全节点稳定运行中
- 现已支持 BTC、ETH、EOS、DASH、XRP、XEM、SC、DOGE、BCH、LTC、ZEC、ETC、ZEN、TRON、XLM、MGD、BTM、ATOM、BSV、DCR、BNB、XMR、BTS 23 条主链,超过 10 万种代币。
Mixin Network 本身不发币,可以简单理解为所有热门区块链的闪电网络
接入
Mixin API 服务器封装了对主网的 RPC 调用,通过了标准的 REST API 供开发者使用,以下是接入指南:
1、准备
- 下载 Mixin Messenger,体验设置 PIN、充值、转账、提现流程
官网下载:https://mixin.one/messenger
应用宝:https://a.app.qq.com/o/simple.jsp?pkgname=one.mixin.messenger
Mixin 畅聊版是 Mixin Messenger 在 App Store 中国区版本,受限于上架规则去掉了钱包功能,可使用 7000101425 机器人小钱包。有需要可以私信 762532 加入 iOS 完整版 TestFlight 外测。
- 阅读官方开发指南:https://developers.mixin.one/guides
2、注册成为 Mixin 的开发者
注册登录 Mixin Messenger ,点首页底部 ⭕️打开摄像头界面扫码登录 https://developers.mixin.one (点右上角)
3、为您的全币种钱包创建一个 Mixin App
点 Create New App 按提示创建就行,通过这个 App 创建的用户都是你的用户,后续可以监听你创建用户的充值、提现和转账信息。
- The home uri. —— 这个一般填你们公司网站首页就行,例如 https://mixin.one,可以为空。
- The OAuth redirect uri. —— OAuth 授权回调,用于 Mixin Messenger 小程序,或者通过 Mixin Messenger 来登录你的应用。一般自己做 Dapp 用不着,但是又是必填项可以随便写一个链接,例如和 home uri 写一样的。
4、生成 Mixin App 相关的 Session
点 Click to generate a new session 生成 keystore.json 文件,内容如下
{
"pin": "123456",
"client_id": "b08dd779-7366-4d48-bf16-a2ce6014e213",
"session_id": "6ef85e29-2dac-48ba-899a-cf64593e6ba8",
"pin_token": "Qc8O7oI0Uw4NZkE1j5xL3I6Iq1iNraF18Y8yOhyGCsZn3n/KaBY66sLbkoLqTvNzwLxxqUYJ12HRaJgyHMql6ezLW5mgfh0wXxH2m3tSvP9qywX0YzuyCUGOrR1h4b8CyOdwm25Rtjdo8OBr6R4V4kJnE8DvY/mBfkpF0WqNLxY=",
"private_key": "-----BEGIN RSA PRIVATE KEY-----\r\nMIICXAIBAAKBgQCRybXjMUn9OZnxxtfuHPHcK2OADKQmejSDVr/i/3GaqljcVv4H\r\nyTiil/WcO1kVSyOSi8XarcikO5rR8ceM0paZs0drk7+cxdVMSJCsjoGZ6WrdtW9L\r\n5RROJ/Z6vnhKDzaqH43K4JKAeFtH11LDaWb8kC2CAy8RpZSUdI69bm2E4QIDAQAB\r\nAoGAAnXW/fiM+RsJwAzNBBW09zQ8P6L2+jdBv52tK1WIQ0XwrfdB3jvFGulZmcNe\r\no39bIFPzHReltS/UUwqzhWrgY7z0AVuR9ZZzfC/3MUkoUzghaepJMJNmgR7rMaHw\r\nfV9PY9ZgYLz9aPODRcwmG8yqEw7V5ER+ivxfAX40zc0XpskCQQDyoddxgoCQjRXV\r\n6ukZwWFSOVyakugsGwnkREFl7MxALhslxrPzTjrPTN8Qg6a81df4jlqKZeJ9sUck\r\nsjtDC4LvAkEAmdHyq2yGH70voYwDQmGyPFAMDaSjeGBhGX8slZ+OhUBOrru4orNj\r\niYZ3uWfkBI2A97Dz/0+N2EQV8Vri8hs1LwJAXR1NMCu0KUVrztfDM3YqYkLPTib4\r\n4QxTZH3pVzNkQ3EuS/YQ01v/Z9UJei38DFZI9wOyrZBiNniVY/jek2FUkwJAAOYg\r\nM+5DbmYNpDUMQ9QMVZvmJiJDLk3p41tB6HHxREgW7aB9OL4xo7kcdAHubDRjf48S\r\nLfjKDGyBcFKmpuGP0wJBANP/qrYroIHugYgJ7RumKlbp7ep0ApBLD8R9+HlHOLoh\r\nao6cSE5BlKeEUQzKIGPG1VqZPpaW2gbezpJbfUC+3ao=\r\n-----END RSA PRIVATE KEY-----\r\n"
}
这些都要记下来后面要用,服务器和浏览器缓存都不会保存这些敏感信息。
5、创建 Mixin Network 用户
参考文档 https://developers.mixin.one/api/alpha-mixin-network/app-user/ 和 https://developers.mixin.one/api/alpha-mixin-network/authentication-token/ ,会用到前面所说的 Session Id。
绝大部分 API 访问都需要在请求的 Header 里设置授权的 Token ,创建用户也需要,相关文档: https://developers.mixin.one/api/alpha-mixin-network/authentication-token/
- Mixin App 本身也是一个 Mixin Network 用户,这里称之为主账号,你可以给这个用户转入、转出资产,而通过主账号创建的用户这里称之为子账号。所以访问 API 之前你要想清楚你是要用哪个账号访问,才能正确的设置 User Id 和 Session Id。
- 如果子账号是由服务器生成的,不要与主账号共用私钥,应该为每一个用户生成一个新的私钥,通过新生成的私钥导出公钥创建子账号。参考 OceanONE 的代码: https://github.com/MixinNetwork/ocean.one/blob/master/example/models/pool_key.go 的 GeneratePoolKey 方法。
- 注意参考文档里的代码和文章末尾的 SDK 、Demo,生成的 Authentication Token 不对访问 API 会返回 401
Authentication Token 出错可能存在的几种情况:
- 复用了 jwt ,每次请求 API 都必须重新生成 jwt,不同的 API path 参数都是不一样的,不能复用
- 私钥不对,搞混了主账号和子账号的私钥,或私钥字符串换行有空格
6、设置 PIN 码
6 位数字 PIN 码是用户转移资产的唯一途径,丢失无法找回,可以理解为自己在 BTC/ETH 链上资产私钥同等作用。强烈建议不要替用户保管 PIN 码,除非特殊用途并且有能力保管好。相关 API : https://developers.mixin.one/api/alpha-mixin-network/create-pin/ 和 https://developers.mixin.one/api/alpha-mixin-network/encrypted-pin/
为了帮助用户安全记住自己的 6 位数字 PIN 码,Mixin Messenger 做了如下提醒:
- 设置初始 PIN 码或修改 PIN 码会让用户反复输入多达 4 - 5 次。
- 设置 PIN 码时会提醒用户不要设置过于简单不安全的 PIN 码,例如 123456。
- 每输入 PIN 码后间隔 24 小时进入钱包首页都会提醒用户输入一次 PIN 码辅助用户记忆。
注意事项:
- 要引导新用户设置自己的 PIN 码
- PIN 丢失无法找回,可以参考 Mixin Messenger 多一些提醒帮助用户记忆
- PIN 输入错误有时间锁,一天输错 5 次就不要再尝试了,建议用户记一下试过的 PIN 码,隔日再试
调用 API 提示 PIN 不对一般就几种情况:
- 私钥不对,搞混了主账号和子账号的私钥,或私钥字符串换行有空格
- PIN 本身不对
- iterator 用错了 —— 加密 PIN 的 iterator 参数必须是递增的,比如第一次加密用的 1 ,第二次必须大于 1 ,用当前系统纳秒时间也可以。
- 重复使用了加密 PIN —— 被加密的 PIN 只能用一次,不能设置完 PIN 后又马上拿上一次的加密 PIN 去转账或者修改 PIN。
关于安全的指纹支付方案 iOS 可以搜索 Secure Enclave 、Android 搜索 isInsideSecureHardware ,也可以直接使用 Mixin Messenger 的源码来实现。
7、获取用户资产
相关 API:https://developers.mixin.one/api/alpha-mixin-network/read-assets/ 和 https://developers.mixin.one/api/alpha-mixin-network/read-asset/
- 有图标的代币说明 Mixin 团队已经人工验证过了 —— 这个代币就是图标所代表的代币类型,防止类似重名币带来的问题。如果需要显示项目代币图标,需要先把项目信息提交到 https://coinmarketcap.com ,然后在 https://github.com/MixinNetwork/asset-profile 提 pr 。
- 注意新用户 GET /assets 默认不会返回任何资产列表,Dapp 自己的服务器可以自定义一个列表返回,例如 OceanONE 的就用一个 json 来配置的 https://github.com/MixinNetwork/ocean.one/blob/master/example/web/src/api/assets.json 。如果想要特定资产 asset id 而接口没有返回,可以充值或转账该类型的代币,到账后再次调用接口就有了。
- 注意 GET /assets 并不会创建充值地址,需要调用 GET /assets/:id 才会为用户创建充值地址(链上地址),有可能需要间隔调用多次才会返回充值地址(创建地址也需要时间,不过一般很快),界面上可以显示一个转圈。
8、充值
强烈建议提醒用户:首次充值请小额尝试!首次充值请小额尝试!首次充值请小额尝试!
https://developers.mixin.one/api/alpha-mixin-network/read-assets/ 会返回充值地址,如果没有返回进入资产详情界面继续调用 https://developers.mixin.one/api/alpha-mixin-network/read-asset/ 来刷新获取充值地址。
- 同一主链的充值地址是相同的,例如可以直接往 BTC 的充值地址充入 Omni USDT,符合 ERC-20 的代币都可以充到 ETH 的充值地址。
- 充值界面根据 destination 和 tag 来显示充值信息,有些资产(例如 EOS、BTS)需要 destination 和 tag 一起使用才能完成充值,可以简单的判断 tag 是否为空来区分处理,需要共同使用的请参考 Mixin Messenger 做足提醒!
- Mixin Network 充值确认数高于一般钱包和交易所两倍以上,充值会慢一些,主要目的是为了安全,可以有效阻止双花等问题。可以通过 confirmations 字段动态获取展示给用户。
- 超过正常充值时间许久还未到账可能是我们的区块数据同步出现了故障,可以查看区块链浏览器 https://mixin.one/network/chains 检查,确认故障请提醒 Mixin 开发团队。
Mixin Network 浏览器
9、转账
相关 API https://developers.mixin.one/api/alpha-mixin-network/transfer/ ,注意 trace_id 非常重要,可以有效的防止重复支付。
-
Mixin Messenger 会在进入转账界面时生成一个 trace id ,这样后续支付出现网络问题重试的时候就不会重复支付
-
有的团队会使用 snapshot_id 来做随机数,这是一个 UUID ,转账成功才会生成,Mixin Network 能确保唯一性
-
/snapshots 可能查看自己的转账记录,参考 API : https://developers.mixin.one/api/alpha-mixin-network/network-snapshots/ ,但是不支持 order 参数(注意不是 /network/snapshots ,没有 network 就只返回自己的转账记录,有的话就是全网转账记录)
10、提现
注意提现需要先添加提现地址(收币地址),并且每次添加、删除地址都需要 PIN。内部充值提现(Mixin Network 的 Dapps 之间充值提现)是免费秒到的,例如从 Mixin Messenger 充值提现到 OceanONE、从 FOX.ONE 充值提现到 Mixin Messenger。
- 添加提现地址的 API https://developers.mixin.one/api/alpha-mixin-network/create-address/。完整的地址包含 label、destination 和 tag ,tag 允许为空,在界面上可以显示一个 No Memo/ No Tag 的复选框。
- 注意不支持修改地址,只支持添加和删除
- 提现有最小限制,可以根据 dust 字段判断,内部提现不受影响
- 有的代币提现需要账户留储备金(不能提空),可以根据 reserve 判断,例如 XRP
- 提现手续费是动态的,可以根据 fee 获取,内部提现一般为 0 ,个别 Dapp 出于业务考虑仍然会收提现手续费
- 注意充值地址和提现地址并不相同,提现可能从一个或多个随机链上资产地址提取,相关细节可以参考 Mixin 的技术白皮书。
11、监听用户充值、提现和转账
如果需要监听所有你 App 创建用户发生的充值、提醒和转账记录,你需要不断的扫描整个 Mixin Network ,是你的用户就会返回 user_id 字段,相关 https://developers.mixin.one/api/alpha-mixin-network/network-snapshots/
- 注意 API 不提供过滤只有自己用户的参数
可以参考一下 OceanONE 的代码 https://github.com/MixinNetwork/ocean.one/blob/master/exchange.go 里的 PollMixinNetwork
- 监听用户充值进度 API : https://developers.mixin.one/api/alpha-mixin-network/external-transactions/ ,这个是全网的充值进度,并不保证 100% 准确性,只是提供一个查询功能,该 API 和 Network Snapshots 是两个独立的服务运行,所有极少数情况下会出现同时返回。注意 API 不提供根据用户来过滤的参数,需要 Dapp 记录一下自己用户的 public key 或者 account tag 和 account name 来过滤自己用户的充值进度
12、转移主账号的资产
- 点 App Id 进入 Update Token 界面,输入步骤 4 保存的 Session Id、Pin Token、Private Key 提交
- 点 App Id 右边的钥匙图标进入资产列表界面(如果没有设置 Token 也会引导至 Update Token 界面)
- 点击具体某个资产进入提现界面即可
给主账号充值需要通过 Mixin Messenger 来完成,先将资产充值到开发者账号(扫描登录 developers.mixin.one 的这个账号),然后在 Mixin Messenger 里搜索主账号的 App Id,进入会话再完成转账操作(可以先小额转账测试一下)。注意只能给开发者自己的主账号转账,你会发现点别人开发的小程序都没有转账这一项。
13、资源
- Golang SDK:https://github.com/MixinNetwork/bot-api-go-client
- Mixin Messager Android:https://github.com/MixinNetwork/android-app
- Mixin Messager iOS:https://github.com/MixinNetwork/ios-app
- Nodejs Demo (非官方): https://github.com/virushuo/mixin-node
- Python Demo(非官方): https://github.com/myrual/mixin_client_demo
- Java Demo(非官方): https://github.com/qige-one/mixin_java_sdk
14、其他
- 注意 Mixin 全币种钱包不支持 EOS、BTS 空投,但用户有可能会收到数量不定的空投币,充值和提现地址不同可以说明这点,这与 Mixin Network 整体设计有关。
- 订阅 7000101498 机器人可收到服务异常的推送,例如提现故障、主网节点故障、某条公链数据同步异常等
- 在 Mixin Messenger 首页顶部搜索 Mixin ID: 762532 找长老申请加开发者群
- 极少数情况下会出现提现失败的情况,可能是因为合约有问题或者有限制导致链上交易失败了,但是手续费已经花了,这种情况下是不会退还手续费的
好消息!现在接入 Mixin 全币种钱包享受 100% 提现费补贴,以 XIN 的形式按月结算!