🔑 关键词:
合约钱包、EOA vs 合约账户、EIP-1271、isValidSignature、signMessage兼容性、Safe Wallet、合约签名校验
传统钱包(MetaMask)属于 EOA(Externally Owned Account),可以用私钥直接签名;
合约钱包(如 Gnosis Safe)没有私钥,不支持标准签名接口,不能使用
signMessage/signTypedData
为了让 DApp 正确支持这类钱包,我们需要:
合约钱包,在我看来就是合约账户。 那为什么叫“合约钱包”而不是“合约账户”?
合约账户(CA):泛指所有部署在链上的账户,如 ERC20、NFT 合约等
合约钱包(SCW):特指用于用户身份/交易控制的钱包类合约
👉 它可能包含多签、权限系统、Session key、social recovery 等模块
📌 换句话说:
所有合约钱包都是合约账户,但不是所有合约账户都是“钱包”
eth_getCode 检查地址是否为合约const bytecode = await publicClient.getBytecode({ address })
const isContract = !!bytecode && bytecode !== '0x'
📌 原理:EOA 地址没有部署代码,返回 '0x';合约钱包返回实际字节码。
EIP-1271 为合约账户提供了一个合约级签名验证接口:
/**
isValidSignature 是 EIP-1271 标准定义的接口函数
*/
function isValidSignature(bytes32 hash, bytes memory signature) external view returns (bytes4 magicValue);