在 ethers.js 中,Provider 和 Signer 分别扮演什么角色?二者在功能和用途上有何不同?
考察说明
考查对 ethers.js 核心抽象的理解,以及区分只读操作与账户操作的能力。
回答思路
- 【回答框架 1】Provider 是用于只读操作的连接抽象,负责与区块链网络交互,如查询区块、交易、余额和合约状态。Signer 则代表一个能够签署交易的账户,可以发送交易并持有私钥。
- 【回答框架 2】Provider 不管理密钥,只读写区块链数据;Signer 具备签名能力,例如发起转账、调用合约写操作。常用的 Provider 包括 JsonRpcProvider 和 InfuraProvider,Signer 常见于 Wallet 或连接钱包的实例。
- 【回答框架 3】在实际开发中,获取只读数据通常使用 Provider,而需要写入数据时必须依赖 Signer,例如通过 Wallet 或钱包插件获取签名者。Signer 可以关联 Provider 以广播交易。
- 【回答框架 4】安全性方面,Provider 不涉及私钥,风险较低;Signer 必须保护私钥,避免泄露。在构建去中心化应用时,通常会先通过 Provider 读取状态,再在用户操作时切换至 Signer。
- 【关键点 1】Provider 用于查询区块链状态,Signer 用于签署并广播交易。
- 【关键点 2】Signer 持有私钥,Provider 不持有私钥。
- 【关键点 3】Signer 可以关联 Provider 执行交易,但 Provider 不能替代 Signer。
- 【关键点 4】读取合约状态使用 Provider,写入合约使用 Signer。
- 【易错点 1】误以为 Signer 只能通过 Wallet 创建,其实可通过浏览器钱包获取。
- 【易错点 2】忽略 Signer 与 Provider 的关联,直接调用签名方法可能因无网络而失败。
- 【易错点 3】将 Provider 用于写操作,导致只能构建交易但无法广播。