三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

免费教程:使用Dai.js SDK开发自定义钱包插件连接Maker生态

免费教程:使用Dai.js SDK开发自定义钱包插件连接Maker生态

免费教程:使用Dai.js SDK开发自定义钱包插件连接Maker生态

【免费下载链接】developerguidesDeveloper guides to integrate with MakerDAO's smart contracts, SDKs, APIs, products, and partners项目地址: https://gitcode.com/gh_mirrors/de/developerguides

Dai.js SDK是连接MakerDAO生态系统的强大工具,通过它可以轻松开发自定义钱包插件,实现与Maker协议的无缝集成。本教程将为新手开发者提供完整的步骤指南,帮助你快速构建属于自己的Dai.js钱包插件,开启Maker生态开发之旅。

为什么选择Dai.js SDK开发钱包插件?

MakerDAO作为去中心化金融(DeFi)领域的重要项目,其生态系统包含了Oasis.app、治理仪表板等多个应用。Dai.js SDK作为官方开发工具,提供了标准化的接口,使第三方钱包能够轻松接入这些应用。通过开发Dai.js钱包插件,你的钱包将获得与Maker协议交互的能力,支持DAI稳定币的转账、抵押借贷等核心功能。

Maker生态钱包集成的优势

  • 广泛的应用支持:集成后可直接使用Oasis.app等Maker生态应用
  • 标准化接口:遵循Dai.js统一规范,减少开发复杂度
  • 安全可靠:经过MakerDAO官方验证的交互流程,保障资产安全
  • 社区支持:加入活跃的Maker开发者社区,获取技术支持

开发前的准备工作

在开始开发之前,请确保你具备以下知识和工具:

必备知识

  • JavaScript基础及ES6+特性
  • Web3钱包工作原理
  • 以太坊智能合约基本概念

开发环境

  • Node.js(v12+)和npm
  • 代码编辑器(推荐VSCode)
  • Git

项目初始化

首先克隆官方开发指南仓库,获取必要的示例代码和文档:

git clone https://gitcode.com/gh_mirrors/de/developerguides cd developerguides/devtools/Dai.js npm install

Dai.js钱包插件核心架构解析

Dai.js SDK采用插件化架构,允许开发者通过注册自定义账户类型来集成新的钱包 provider。核心原理是通过addAccountType方法向SDK注册钱包处理逻辑,包括子提供者(subprovider)和地址获取等关键功能。

钱包集成基本流程

上图展示了典型的Dai.js钱包集成用户流程,包括创建保险库、存入抵押品、生成DAI等核心操作。你的插件需要实现这些流程中的钱包交互部分。

插件基本结构

一个基础的Dai.js钱包插件结构如下:

export default function(maker) { const WALLET_NAME = 'mywallet'; maker .service('accounts', true) .addAccountType(WALLET_NAME, async settings => { // 1. 初始化钱包子提供者 const subprovider = await initializeWalletSubprovider(settings); // 2. 获取用户钱包地址 const address = await getWalletAddress(subprovider); // 3. 返回给Dai.js SDK return { subprovider, address }; }); }

分步骤开发钱包插件

根据钱包 provider 与Dai.js SDK的兼容性,开发难度可分为三个等级。下面分别介绍不同等级的实现方法。

Tier 1: 兼容Hooked Wallet Provider的钱包

如果你的钱包提供了兼容MetaMask Hooked Wallet Provider的子提供者,集成将非常简单。以WalletConnect为例:

import WalletConnectSubprovider from '@walletconnect/web3-subprovider'; export default function(maker) { const WALLETCONNECT = 'walletconnect'; maker .service('accounts', true) .addAccountType(WALLETCONNECT, async settings => { // 初始化WalletConnect子提供者 const subprovider = new WalletConnectSubprovider({ bridge: 'https://bridge.walletconnect.org' }); // 获取用户地址 const { accounts } = await subprovider.getWalletConnector(); const [address] = accounts; return { subprovider, address }; }); }

这种情况下,钱包自身提供了所有必要的方法,只需简单包装即可。

Tier 2: 需要额外配置的硬件钱包

对于Ledger等硬件钱包,需要处理地址 derivation 等额外逻辑:

import LedgerSubProvider from './vendor/ledger-subprovider'; import Transport from '@ledgerhq/hw-transport-u2f'; export default function(maker) { maker.service('accounts', true).addAccountType('ledger', async settings => { // 初始化Ledger子提供者 const subprovider = LedgerSubProvider(() => Transport.create(), { accountsOffset: settings.accountsOffset || 0, accountsLength: settings.accountsLength || 1, networkId: maker.service('web3').networkId(), path: settings.path || "44'/60'/0'" }); // 获取地址(支持多地址选择) let address; if (settings.accountsLength > 1) { // 多地址处理逻辑 const addresses = await new Promise((resolve, reject) => subprovider.getAccounts((err, addresses) => err ? reject(err) : resolve(addresses) ) ); address = await settings.choose(addresses.map(k => addresses[k])); } else { address = await new Promise((resolve, reject) => subprovider.getAccounts((err, addresses) => err ? reject(err) : resolve(addresses[0]) ) ); } return { subprovider, address }; }); }

Tier 3: 需要适配的非标准钱包

对于不直接兼容的钱包,需要实现setEnginehandleRequest方法:

import WalletLink from 'walletlink'; export default function(maker) { const WALLETLINK = 'walletlink'; maker.service('accounts', true).addAccountType(WALLETLINK, async settings => { // 初始化WalletLink const web3Service = maker.service('web3'); const walletLink = new WalletLink({ appName: 'My Dapp' }); const walletLinkProvider = walletLink.makeWeb3Provider( web3Service.rpcUrl, web3Service.networkId() ); // 获取地址 const accounts = await walletLinkProvider.enable(); const address = accounts[0]; // 实现必要的适配方法 walletLinkProvider.setEngine = function(engine) { // 引擎设置逻辑 }; walletLinkProvider.handleRequest = function(payload, next, end) { // 请求处理逻辑 this.sendAsync(payload, (err, result) => { return result ? end(null, result.result) : end(err); }); }; return { subprovider: walletLinkProvider, address }; }); }

测试与集成到前端应用

开发完成后,需要在前端应用中测试你的插件。以Oasis.app为例,集成步骤如下:

1. 注册插件

在应用的Maker初始化代码中注册你的插件:

import Maker from '@makerdao/dai'; import myWalletPlugin from 'my-daijs-plugin'; const maker = await Maker.create('browser', { plugins: [myWalletPlugin] });

2. 添加账户类型

在应用的常量定义中添加你的钱包类型:

// src/utils/constants.js export const ACCOUNT_TYPES = { // ...其他钱包类型 MYWALLET: 'mywallet' };

3. 添加UI组件

在账户选择界面添加你的钱包选项:

// src/components/AccountSelection.js <WalletOption icon={MyWalletIcon} name="My Wallet" accountType={ACCOUNT_TYPES.MYWALLET} onClick={() => connectToProviderOfType(ACCOUNT_TYPES.MYWALLET)} />

发布与分享你的插件

完成开发和测试后,你可以将插件发布到npm,或提交到MakerDAO官方插件列表。

发布到npm

npm publish --access public

提交到官方文档

可以通过PR将你的插件添加到官方文档中:

  • 文档位置:devtools/Dai.js/How-to-build-dai-js-wallet-plugin.md
  • 示例代码库:makerdao/dai-plugin-template

常见问题与解决方案

1. 钱包连接失败

可能原因:子提供者初始化错误或网络问题。

解决方案

  • 检查钱包是否正确安装和解锁
  • 验证网络配置是否与Maker协议兼容
  • 添加详细的错误处理和日志

2. 交易签名失败

可能原因handleRequest方法实现不正确。

解决方案

  • 确保正确处理交易 payload
  • 检查nonce和gas设置
  • 参考示例实现:Dai Plugin WalletLink

3. 多地址支持问题

解决方案:实现地址选择逻辑,参考Ledger插件的多地址处理方式。

总结

通过本教程,你已经了解了如何使用Dai.js SDK开发自定义钱包插件的完整流程。从项目初始化到不同兼容性级别的实现方法,再到前端集成和测试,每一步都提供了详细的指导。现在,你可以开始开发自己的钱包插件,为用户提供连接Maker生态的新方式。

扩展学习资源

  • 官方文档:devtools/Dai.js/How-to-build-dai-js-wallet-plugin.md
  • Dai.js API参考:makerdao/dai.js
  • 示例插件:
    • WalletConnect: dai-plugin-walletconnect
    • Ledger: dai-plugin-ledger-web

如有任何问题,欢迎加入MakerDAO开发者社区寻求帮助:

  • 开发者聊天室:#dev频道 on chat.makerdao.com

【免费下载链接】developerguidesDeveloper guides to integrate with MakerDAO's smart contracts, SDKs, APIs, products, and partners项目地址: https://gitcode.com/gh_mirrors/de/developerguides

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

← 返回列表