“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)
我们已经翻译了中文版的官方英文文档,供大家参考使用
alcove发起于2023年11月,是亚洲首个由Aptos公链与Alibaba Cloud携手打造的Move on Aptos中文开发者社区。我们致力于通过提供教育、技术、资金等全方位资源的支持,帮助开发者使用Move语言在Aptos构建下一代Web3应用,从而实现个体价值,推动行业的创新与发展。
官方推特:alcove_pro
以上内容均转载自互联网,不代表AptosNews立场,不是投资建议,投资有风险,入市需谨慎,如遇侵权请联系管理员删除。