多签钱包的使用
与多签钱包对应的是单签钱包,我们要往区块链上发送一笔转账交易,需要去用钱包去做一个签名,我们自己签好名把交易发送出去,交易执行成功转账就成功,这就是典型的单签钱包,也是我们平时使用最多的钱包。
多签钱包,顾名思义,就是需要多个人去签名执行某个操作的钱包。使用多签钱包进行转账,往往需要 >= 1 个人去签名发送交易之后,转账操作才真正完成。使用多签钱包时,我们可以指定 m/n 的签名模式,就是 n 个人里面有 m 个人签名即可完成操作。比如 2/3 签名模式,就是 3 个人里面有两个人签名就可以。
在以太坊中,多签钱包往往是一个智能合约。https://gnosis-safe.io/ 应该是市场占有率比较高的一个多签钱包,我大概 2018 年就开始用了,用的是它的第一个版本,现在最新版本功能已经强大很多。
需要用多签钱包的场景还是挺多的。比如:
在单签钱包中,决定加密货币所有权和管理权的私钥仅掌握在单人手中,一旦私钥丢失或持有者遗忘钱包助记词,那就意味着持有者失去了对该钱包地址的控制权,与其相关联的加密资产将完全丢失。而多签钱包的存在,最大程度降低了单个私钥丢失时的资产损失风险。以2/3模式为例,在全部3个私钥中,只要有2个私钥完成了签名授权操作就能进行相关加密货币的交易。即使有1个私钥丢失,还能通过剩下的2个私钥完成对资产的转移,避免资产损失。
这种情况下,个人可以创建一个多签钱包,再创建多个钱包地址,分布在多个地方,比如metamask 一个,手机上一个,冷钱包一个,把这几个地址都加入多签钱包中,动用里面资产需要用其中两个钱包共同签名,为了方便,使用 1/3 模式签名也可以,这样,如果一个设备丢了,可以立马把该设备的钱包地址从多签钱包移出,保证资产安全。
很多DeFi 协议/DAO 组织/区块链团队其实都有自己的金库,金库里的钱是不能由任何一个人直接动用的,每次动用都要经过多数人的同意或社区投票。这时使用多签钱包来保存金库资产是再合适不过了。
在目前这个发展阶段,很多去中心化协议其实都是有个管理员权限的,这个管理员权限往往可以更改协议的某些关键参数。行业普遍做法是把这个管理员权限交给一个多签钱包或时间锁,当需要更改参数时,需要多个人共同签署相关操作。
不管是 Gnosis 多签钱包的第一个版本 https://wallet.gnosis.io/#/wallets 还是当前最新版本 https://gnosis-safe.io/ 界面操作其实都挺简单方便的,但当操作比较多时会比较繁琐。
其实脚本操作也挺方便的,Gnosis 的核心操作就两个:
function submitTransaction(address destination, uint value, bytes calldata data) external returns (uint transactionId);
function confirmTransaction(uint transactionId);
使用 submitTransaction 来提交多签交易,使用 confirmTransaction 来确认交易。 以下是示例代码:
let multisigWalletAddress = "";
let unitrollerAddress = "";
let multisigInstance = await MultisigWallet.at(multisigWalletAddress);
let comptroller = await Comptroller.at(unitrollerAddress);
let allSupportedMarkets = await comptroller.getAllMarkets();
for (market of allSupportedMarkets) {
let cTokenInstance = await CToken.at(market);
let cTokenName = await cTokenInstance.name();
console.log(`cTokenName: ${cTokenName}`)
let acceptAdminEncode = await cTokenInstance.contract.methods._acceptAdmin().encodeABI();
multisigInstance.submitTransaction(cTokenInstance.address, 0, acceptAdminEncode);
console.log(`accept admin to ${multisigWalletAddress} for token ${cTokenName} : ${cTokenInstance.address}`);
}
这段代码执行后会生成很多待确认的多签任务,其它参与多签的人运行类似下面脚本进行确认就好了:
let multisigWalletAddress = "";
let multisigInstance = await MultisigWallet.at(multisigWalletAddress);
for (var transactionId = 0; transactionId <= 10; transactionId++) {
await walletInstance.confirmTransaction(transactionId);
console.log("Done to confirm transaction: ", transactionId);
}
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!