PlatON 正式推出账户抽象钱包 PlaTrust Wallet,BugBounty 计划同步启动

全数字化公共基础设施 PlatON 正式宣布推出全新的PlaTrust Wallet,一款基于 EIP-4337 标准的账户抽象钱包。此次推出标志着 PlatON 继续在区块链世界中推进基础设施建设,为用户带来更安全、自由和高效的数字资产与权限管理体验。

PlaTrust Wallet :下一代数字资产安全管理

作为进入 Web3 世界的第一站,钱包是用户参与区块链生态系统的主要工具之一,它是管理、储存和交换数字资产的关键工具,也是在各种去中心化应用中进行身份验证和交易的桥梁。

但就用户体验而言,现行的钱包绝不能称之为“方便”。想象一下,当你在为喜欢的推文点赞、转发或评论时,每个动作都必须重新登录才能执行操作;而私钥的存在与管理,也在无形中增加了使用门槛,更不用提高昂的 Gas 费,以及资产被盗风险等。

PlaTrust Wallet 是 PlatON 全新推出的 AA(Account Abstract)钱包,开发的初衷即在于满足用户对数字资产安全和管理的需求,最大程度减少用户体验上的摩擦。它是一个基于 EIP-4337 标准的多签合约钱包,不仅可以让用户享受 gasless 的体验,还拥有基于阈值的多签、免多签 session、钱包锁定/恢复/升级、自定义角色控制、自定义模块、账户白名单、抵制审查、多链支持等众多强大的特性。

基于阈值的多重签名 : 基于指定的阈值以多重签名形式管理资产。

免多重签名session: 在特定时间窗口内启用免多重签名操作,为用户钱包操作提供便利。

钱包锁定 : 允许在所有者怀疑其账户(设备)被篡改(丢失、被盗等)时对钱包进行锁定。

钱包恢复 : 通过其他所有者发起的多重签名来替换丢失的私钥,恢复钱包的所有权。

钱包升级 : 当出现新功能或重大漏洞时,可以升级钱包到最新版本。

自定义角色控制 : 用户可以定义不同的角色信息,以控制钱包中的资产操作权限。

自定义模块 : 支持用户定义的模块,可添加到钱包中引入自定义扩展。

无需 gas : 用户可以在无需支付原生代币作为 gas 费用的情况下操作钱包。

账户白名单 : 设置账户白名单,允许某些账户执行跨账户操作或转账而不考虑信任问题。

抵制审查 : 用户完全控制其账户,无需依赖任何第三方服务。

多链支持 : 兼容所有 EVM 兼容的公共区块链,确保在不同 EVM 兼容的区块链上具有相同的钱包地址。

PlaTrust Wallet 介绍文档:PlaTrust钱包 | PlatON

PlaTrust Wallet SDK 使用文档:PlaTrust钱包 js-sdk说明安装及使用说明 | PlatON

Gasless 体验,更安全、自由地管理资产与权限

对于很多人来说,「账户抽象」本身就是一个比较抽象的存在,PlaTrust Wallet 作为一款账户抽象钱包,在此有必要为大家简单介绍一下。

目前,以太坊账户与密钥对紧密耦合,以至于它们本质上是同一件事。即如果你控制了私钥,那么你就控制了一个账户。这种模式有一些限制和不便,例如:

  • 用户必须持有 ETH 才能支付矿工费(Gas Fee),即使他们想要交易其他代币;

  • 用户必须使用特定的签名算法(如 ECDSA)来验证交易,即使他们想要使用更先进或更安全的算法;

  • 用户必须遵循固定的交易格式和验证规则,即使他们想要实现更复杂或更灵活的功能,如多重签名、社交恢复、限额支付等。

账户抽象就是将以太坊账户由智能合约代码而不是私钥控制。这样,用户可以根据自己的需求和偏好来编写智能合约钱包,实现以下功能:

  • 使用多种代币来支付矿工费(Gasless Trading);

  • 使用多种签名算法来验证交易(如 BLS、Schnorr 等);

  • 使用多种交易格式和验证规则来执行交易(如 ERC-20、ERC-721 等)。

换言之,账户抽象的最大目标就是解耦 signer 和账户之间绑定的关系,防止 signer 对钱包资产的绝对控制权。账户抽象在做的事情就是把账户层和密钥层抽象出来,用户可以自定义里面的逻辑,并在抽象之后带来更多维的可拓展性,最终把管理加密钱包将变得像管理电子邮件账户一样简单。

以 PlaTrust Wallet 为例,它与 MPC 钱包、多签钱包、非 AA 合约钱包等的对比如下:

PlaTrust Wallet MPC钱包 多签钱包 非AA合约钱包
账户类型 合约账户 外部账户 合约账户(由外部账户控制) 合约账户(由外部账户控制)
GAS抽象化 可能使用中继器
批量交易
钱包恢复
Session key
私钥管理 要求 要求 要求
签名方案 ECDSA、BLS等 ECDSA ECDSA ECDSA

总结一下,PlaTrust Wallet 是一个创新性的合约钱包,它不仅继承了 EIP-4337 标准的优点,还增加了许多实用的特性,让资产更安全、操作更简便。用户可以享受以下好处:

  1. 无需支付 Gas Fee,节省用户成本;

  2. 可以自由地设置多签阈值和权限,保护用户资产;

  3. 可以随时恢复、锁定、升级钱包,应对各种情况;

  4. 可以开启免多签 session,方便操作;

  5. 可以自定义角色和模块,满足用户需求;

  6. 可以设置白名单,过滤不必要的干扰;

  7. 可以抵制审查,完全控制账户;

  8. 可以在多个链上使用同一个钱包地址,简化管理。

共建数字化未来

PlaTrust Wallet 的推出,是PlatON持续推进全数字化公共基础设施建设的重要一步。我们相信,区块链技术将引领未来的数字经济发展,让用户在更安全、自由的环境下畅享数字资产的便捷和价值。

目前,PlaTrust Wallet 测试版本已经上线,并联合 BugRap 开启了安全漏洞悬赏计划。欢迎全球区块链安全专家和白帽黑客积极参与,共同建设更加安全可信赖的区块链生态系统。

BugBounty 活动链接:https://bugrap.io/bounties/PlatON

3 个赞

冒昧的问一下,LAT的通缩如何查阅!谢谢

1 个赞

哪里下载啊,怎么使用啊

没有通缩,你想啥呢

1 个赞

PlaTrust Wallet 介绍文档:PlaTrust钱包 | PlatON

PlaTrust Wallet SDK 使用文档:PlaTrust钱包 js-sdk说明安装及使用说明 | PlatON

1 个赞

没有直接使用的app或者插件吗?

2 个赞

官网贴出的代码示例,是存在错误的,直接使用无法正常运行,会报若干错误,修正如下并作若干注释中译:

// import { ethers } from "ethers";
// import { Accounts } from "web3-eth-accounts";
// import { UserOpReceipt, BaseWalletLib, UserOperation, packSignatureHash, signMessage, encodeSignature } from 'bonus-wallet-js-sdk';
const platrust = require("platrust-wallet-js-sdk")
const ethers = require("ethers")

async function main() {
    const pks = ['0x......'] //私钥数组
    let owners = ['0x......'] //定义所有者数组

    const walletLib = new platrust.WalletLib(); //引入WalletLib钱包基础模块
    const walletLogic = '0x3b682b956E65b5F5b8150f75F2235f156A8F4b7B'
    const walletFactory = '0x97429FFFdE9223C92Cb00F66D8352B0642f70FA4' // 钱包代理工厂合约地址
    const relayerManagerAddr = '0xD7998fC16185cC619b0918028D9BBc77A844a880'
    // const salt = ethers.utils.formatBytes32String("abc")
    const salt = '0x4aa639acfa86f7d60530bf462efdfdd9f4c4a6526226f5284c0af71240d47f25'
    const initializer = await walletLib.getSetupCode(
        relayerManagerAddr,   // EntryPoint 合约地址
        owners, // <[address]> owner 所有者数组列表
        1,       // <number> 阈值
        "0x......",  // <address> to Address
        '0x',  // <string> 钱包初始化执行数据
        "0x......",  // <string> fallbackHandler 回退处理程序
        86400,      // <number> 锁定周期 24H
    )
    const walletAddress = await walletLib.calculateWalletAddress(
        walletLogic,  // <address> BonusWallet 逻辑合约地址
        initializer,  // <string> 初始化工具人
        salt,     // <string> salt (Hex string)
        walletFactory  // <address> 钱包工厂合约
    );
    const initcode = walletLib.getInitCode(walletFactory, walletLogic, initializer, salt)
    const activateOp = walletLib.activateWalletOp(
        walletLogic,  // <address> BonusWallet 逻辑合约地址
        initializer,  // <string> 初始化工具人
        undefined,   // <bytes> paymaster And Data
        salt,     // <string> salt (Hex string)
        walletFactory,  // <address> Wallet factory Contract Address
        100,      // <number> max Fee Per Gas 100Gwei
        1000,     // <number> max Priority Fee Per Gas 10Gwei
        5000000,  // <number> call Gas Limit
        500000,  // <number> verification gas limit
        50000   // <number> preVerification gas
    );
    const userOpHash = await activateOp.getUserOpHashFromContract(
        relayerManagerAddr,  // <address> EntryPoint 合约地址
        new ethers.providers.JsonRpcProvider( "https://devnet2openapi.platon.network/rpc"),  // 区块链网络RPC
    );
    const signedHash = platrust.packSignatureHash(userOpHash, 0); // 求数据Hash的签名信息
    const sig = platrust.signMessage(signedHash, pks[0]) //用私钥给消息签名
    const pk = platrust.recoverAddress(signedHash, sig) //解析出签名者账户地址

    activateOp.signature = platrust.encodeSignature(0, sig);
    console.log("signature: ", activateOp.signature);
    
    const bundler = new walletLib.Bundler(
        relayerManagerAddr,  // <address> EntryPoint Contract Address
        new ethers.providers.JsonRpcProvider( "https://devnet2openapi.platon.network/rpc"),  // ethers.providers
        'https://testbundler.platon.network' // bundlerApiURL
    );

    const validation = await bundler.simulateValidation(activateOp);
    if (validation.status !== 0) {
        console.log(validation);
    }

    const bundlerEvent = bundler.sendUserOperation(activateOp); //向bundler的User Operation 池提交一个User Operation 对象 (并追加监听)
    bundlerEvent.on('error', (err) => {
        console.log(err);
    });
    bundlerEvent.on('send', (userOpHash) => {
        console.log('send: ' + userOpHash);
    });
    bundlerEvent.on('receipt', (receipt) => {
        console.log('receipt: ' + JSON.stringify(receipt));
    });
    bundlerEvent.on('timeout', () => {
        console.log('timeout');
    });
}

main();

但是我这份修改后的示例也不是全对的,在第64行会抛出异常,通过console.log获取明细内容为:

{
  status: 1,
  result: {
    opIndex: BigNumber { _hex: '0x00', _isBigNumber: true },
    reason: 'AA13 initCode failed or OGG'
  }
}

我表示不清楚reason所代表的意思是什么?请解答。

1 个赞

有的,你再研究一下!

我要直接下载的那种,像aton

通缩?????????每年增发呢,还通缩,哥们你没事吧,套迷糊了?

哈哈,我觉得他是水军