主页 > 苹果手机如何下载imtoken > 使用多重签名钱包
使用多重签名钱包
0x01 什么是多重签名钱包
与多签钱包对应的是单签钱包[2]以太坊多签钱包,我们要向区块链发送一笔转账交易,需要用钱包进行签名,我们签上名字并发送交易,而transaction is successful transferred 成功,这是一个典型的单签名钱包,也是我们最常使用的钱包。
多重签名钱包,顾名思义,就是需要多人签名才能执行某项操作的钱包。 使用多重签名钱包转账,往往需要>=1个人签名并发送交易,转账操作才真正完成。 在使用多重签名钱包时,我们可以指定m/n的签名方式,即n个人中有m个人签名来完成操作。 比如2/3签名模式,就是三个人中有两个人可以签名。
在以太坊中,多重签名钱包通常是智能合约。 应该是市场占有率比较高的多重签名钱包。 我大约在 2018 年开始使用它。我使用的是它的第一个版本。 现在最新的版本有更强大的功能。
0x02 什么时候需要使用多重签名钱包
还有很多场景需要使用多重签名钱包。 例如:
资金安全
在单签名钱包中,决定加密货币所有权和管理权的私钥只掌握在一个人手中。 一旦私钥丢失或持有人忘记钱包助记词,就意味着持有人丢失了钱包地址。 与之相关的加密资产的控制权将完全丧失。 多重签名钱包的存在最大限度地降低了单个私钥丢失时资产丢失的风险。 以2/3模式为例,在所有的3个私钥中,只要有2个私钥完成了签名授权操作,就可以进行相关的加密货币交易。 即使丢失了一把私钥,也可以通过剩下的两把私钥完成资产的转移,避免资产丢失。
这种情况下以太坊多签钱包,个人可以创建一个多重签名钱包,然后创建多个钱包地址,分布在多个地方,比如一个metamask,一个在手机上,一个冷钱包,并将这些地址添加到多重签名中钱包。 要使用里面的资产,需要用两个钱包一起签名。 为方便起见,您还可以使用 1/3 模式签名。 这样,如果设备丢失,可以立即从多重签名钱包中删除该设备的钱包地址,确保资产安全。
资产公寓
许多 DeFi 协议/DAO 组织/区块链团队实际上都有自己的金库。 国库里的钱,任何人都不能直接动用。 每次使用都必须经过多数人或社区投票的同意。 这个时候用多重签名钱包来存放国库资产就完美了。
多重签名操作
在目前的发展阶段,很多去中心化协议其实都具有管理员权限,管理员权限往往可以改变协议的一些关键参数。 业内通行的做法是将这个管理员权限分配给一个多重签名钱包或者时间锁。 当需要更改参数时,需要多人共同对相关操作进行签名。
0x03 脚本运行
无论是第一版Gnosis多重签名钱包#/wallets还是最新版本,界面操作其实都相当简单方便,但操作多了就比较繁琐了。
其实脚本操作也挺方便的。 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);
}
参考文献[1]
阿什顿:
[2]
钱包: