Aptos Wallet Standard 介绍

Aptos Wallet Standard 介绍

Wallet Standard” 是 Aptos 生态系统设计的新钱包互操作标准,它通过基于事件的通讯模式简化了钱包与 dapp 之间的交互,同时减少了资源消耗、维护压力和供应链攻击风险。”

由于其通用性,支持此标准的钱包可以轻松地从一个区块链迁移到另一个区块链,并与多链的 dApps 实现无缝集成。集成和实施过程简便,大多数情况下只需使用提供的方法完成注册和检测流程。任何未来的新功能或改进都应避免导入破坏性更改,因为每个钱包都运行其私有的插件代码,并且在独立的上下文中实现各项功能。

新钱包标准的影响:

Dapp 开发者需:

1、了解并熟悉新钱包标准

2、将自身代码迁移到新的 TypeScript SDK

3、实装钱包可发现功能,以屏蔽非 Aptos 钱包

钱包开发者需要:

1、了解并熟悉新钱包标

2、根据需要迁移到新的 TypeScript SDK 或维护从新 SDK 到旧 SDK 的类型转换层

3、注册自己的钱包,确保其能够被 dapp 正确发现

4、按照新标准实施符合 Aptos 钱包协议的 AptosWallet 类

规范详情

(一)标准化的功能规范

以下列出了钱包需遵循的标准化功能,包括必须与建议实现的方法。查阅建议的 Aptos 功能清单

标有 * 的功能为可选实现

aptos:connect 方法旨在建立 dapp 与钱包的连接关系。

// `silent?: boolean` - 允许在不引起用户注意的情况下触发连接(如用于自动连接功能)
// `networkInfo?: NetworkInfo` - 指定 dapp 所选的网络信息(方便连接和切换网络操作)

connect(silent?: boolean, networkInfo?: NetworkInfo): Promise<UserResponse<AccountInfo>>;

aptos:disconnect 方法用于断开 dapp 和钱包之间建立的连接

disconnect(): Promise<void>;
aptos:getAccount 用于获取钱包中当前连接的账户

getAccount():Promise<UserResponse<AccountInfo>>
aptos:getNetwork 用于获取钱包中的当前网络

getNetwork(): Promise<UserResponse<NetworkInfo>>;

aptos:signTransaction 用于当前连接的账户在钱包中签署消息。

// `transaction: AnyRawTransaction` - a generated raw transaction created with Aptos’ TS SDK

signTransaction(transaction: AnyRawTransaction):AccountAuthenticator

aptos:signMessage 用于当前连接的账户在钱包中签署消息。

// `message: AptosSignMessageInput` - a message to sign

signMessage(message: AptosSignMessageInput):Promise<UserResponse<AptosSignMessageOutput>>;

aptos:onAccountChange 事件,当钱包中的账户发生变化时,钱包触发。

// `newAccount: AccountInfo` - The new connected account

onAccountChange(newAccount: AccountInfo): Promise<void>

aptos:onNetworkChange 事件,当钱包中的网络发生变化时,钱包触发。

// `newNetwork: NetworkInfo` - The new wallet current network

onNetworkChange(newNetwork: NetworkInfo):Promise<void>

aptos:signAndSubmitTransaction* 方法,使用钱包中当前连接的账户签署并提交交易。

// `transaction: AnyRawTransaction` - a generated raw transaction created with Aptos’ TS SDK

signAndSubmitTransaction(transaction: AnyRawTransaction): Promise<UserResponse<PendingTransactionResponse>>;

aptos:changeNetwork* 事件,dapp 发送给钱包,以更改钱包的当前网络

// `network:NetworkInfo` - The network for the wallet to change to

changeNetwork(network:NetworkInfo):Promise<UserResponse<{success: boolean,reason?: string}>>

aptos:openInMobileApp* 函数,支持将用户从移动设备的网络浏览器重定向到原生移动应用。钱包插件应添加钱包应在应用内浏览器打开的位置 URL。

openInMobileApp(): void

(二)类型

注意:UserResponse 类型用于用户拒绝可拒绝的请求。例如,当用户想要连接但却关闭了窗口弹出时。

export enum UserResponseStatus {
  APPROVED = 'Approved',
  REJECTED = 'Rejected'
}

export interface UserApproval<TResponseArgs> {
 status: UserResponseStatus.APPROVED
 args: TResponseArgs
}

export interface UserRejection {
 status: UserResponseStatus.REJECTED
}

export type UserResponse<TResponseArgs> = UserApproval<TResponseArgs> | UserRejection;

export interface AccountInfo = { account: Account, ansName?: string }

export interface NetworkInfo {
  name: Network
  chainId: number
  url?: string
}

export type AptosSignMessageInput = {
  address?: boolean
  application?: boolean
  chainId?: boolean
  message: string
  nonce: string
}

export type AptosSignMessageOutput = {
  address?: string
  application?: string
  chainId?: number
  fullMessage: string
  message: string
  nonce: string
  prefix: 'APTOS'
  signature: Signature
}

(三)错误

钱包必须抛出一个 AptosWalletError。标准要求支持 Unauthorized 和 InternalError,但钱包可以抛出一个自定义的 AptosWalletError 错误

使用默认消息

if (error) {
  throw new AptosWalletError(AptosWalletErrorCode.Unauthorized);
}

使用自定义消息

if (error) {
  throw new AptosWalletError(
    AptosWalletErrorCode.Unauthorized,
    "My custom unauthorized message"
  );
}

使用自定义错误

if (error) {
  throw new AptosWalletError(-32000, "Invalid Input");
}

参考实现

该标准公开了一个 detect 功能,通过验证钱包中是否存在必需的函数来检测现有的钱包是否符合 Aptos 标准。这些函数被称为 features。每个特性应以 aptos 命名空间、colon 和 {method} 名称定义,即 aptos:connect。

(一)钱包提供者

AptosWallet 接口实现

钱包必须实现一个 AptosWallet 接口,并提供钱包提供者的信息和特性:

class MyWallet implements AptosWallet {
  url: string;
  version: "1.0.0";
  name: string;
  icon:
    | `data:image/svg+xml;base64,${string}`
    | `data:image/webp;base64,${string}`
    | `data:image/png;base64,${string}`
    | `data:image/gif;base64,${string}`;
  chains: AptosChain;
  features: AptosFeatures;
  accounts: readonly AptosWalletAccount[];
}

AptosWalletAccount 接口实现

钱包必须实现一个 AptosWalletAccount 接口 ,该接口代表了已被 dapp 授权的账户。

enum AptosAccountVariant {
  Ed25519,
  MultiEd25519,
  SingleKey,
  MultiKey,
}

class AptosWalletAccount implements WalletAccount {
  address: string;

  publicKey: Uint8Array;

  chains: AptosChain;

  features: AptosFeatures;

  variant: AptosAccountVariant;

  label?: string;

  icon?:
    | `data:image/svg+xml;base64,${string}`
    | `data:image/webp;base64,${string}`
    | `data:image/png;base64,${string}`
    | `data:image/gif;base64,${string}`
    | undefined;
}

注册钱包

为了通知 dapp 其已准备就绪,钱包通过使用 registerWallet 方法来注册自身。

const myWallet = new MyWallet();

registerWallet(myWallet);

(二)Dapp

获取钱包

Dapp 使用 getAptosWallets() 函数,该函数获取所有符合 Aptos 标准的钱包。

import { getAptosWallets } from "@aptos-labs/wallet-standard";

let { aptosWallets, on } = getAptosWallets();

注册事件

在初次加载与 dapp 启动之前,系统将获取所有已注册的钱包信息。为了在此时间点之后继续监测新注册的钱包,dapp 需使用事件监听器来订阅新钱包的注册,该监听器提供了一个取消订阅的函数,可用于之后撤销该监听器。

const removeRegisterListener = on("register", function () {
  // Dapp可以将新注册的aptos钱包添加到其自身的状态上下文中。
  let { aptosWallets } = getAptosWallets();
});

const removeUnregisterListener = on("unregister", function () {
  let { aptosWallets } = getAptosWallets();
});

Dapp 现在有了一个事件监听器,所以它可以立即看到新的钱包,不需要再次轮询或列出它们。如果 dapp 在任何钱包加载之前加载,这也是有效的(它将初始化,但看不到任何钱包,然后在它们加载时看到钱包)。

钱包请求

Dapp 通过调用与所需操作相对应的特性名称来发出钱包请求。

const onConnect = () => {
  this.wallet.features["aptos:connect"].connect();
};

更多详细信息,请参考 AIP-62 (https://github.com/ALCOVE-LAB/Aptos-Docs/blob/main/AIP/aip-62.md) 

我们已经翻译了中文版的官方英文文档,供大家参考使用

Aptos Wallet Standard 介绍

alcove发起于2023年11月,是亚洲首个由Aptos公链与Alibaba Cloud携手打造的Move on Aptos中文开发者社区。我们致力于通过提供教育、技术、资金等全方位资源的支持,帮助开发者使用Move语言在Aptos构建下一代Web3应用,从而实现个体价值,推动行业的创新与发展。

官方推特:alcove_pro

以上内容均转载自互联网,不代表AptosNews立场,不是投资建议,投资有风险,入市需谨慎,如遇侵权请联系管理员删除。

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2024年5月6日 下午4:48
下一篇 2024年5月10日 上午12:22

相关文章

发表回复

登录后才能评论
微信扫一扫
百度扫一扫

订阅AptosNews

订阅AptosNews,掌握Aptos一手资讯。


窗口将关闭与 0

本站没有投资建议,投资有风险,入市需谨慎。