Quras マルチシグ
マルチシグとは
マルチシグネチャ(multisig)では、1つのキーから1つの署名を行うのではなく、複数のキーを使用してQurasのトランザクションを認証する必要があります。複数のキーが必要です。
- Qurasのコインを複数の人に所持させ、責任を分担すること。
- 単一障害点を回避することで、ウォレットのセキュリティ侵害を実質的に困難にします。
- 1つのシードを失ってもウォレットの損失につながらないM-of-Nバックアップ。 Qurasのmultisigモード:m =フロア(n/2) + 1は、n個のキーの間で、より多くのm個のキーがトランザクションを署名した場合、トランザクションが有効と見ていることを意味します。
マルチシグアドレスの作成とプッシュ
マルチシグアドレスは公開鍵によって生成されます。マルチシグアドレスを生成した後、それをQurasブロックチェーンにプッシュするかどうかを選択することができます。
var tx = Quras.tx.Transaction.createRegisterMultiSignTx('03e969e677c8049a04d814ba72759a77fa4fa79d24e84cc145b178b0976dfeb503'); tx = Quras.tx.Transaction.joinMultiSignWallet(tx, '03b6c601a4b4528abf2a05d9f40b81482498058c1f9da034e1f241eceb557d23eb'); const scriptHash = Quras.tx.Transaction.getMultiSignScriptHash(tx); const multisigAddress = Quras.wallet.getAddressFromScriptHash(scriptHash); tx.sign('bb0e2a6e667dd396c77d13398e4886fed7d31c14e48fc471896a7200ba2e6358'); // Sign the transaction using private key const rpcServer = new Quras.rpc.RPCClient(Quras.CONST.QURAS_NETWORK.MAIN); rpcServer.sendRawTransaction(tx.serialize()) // Send the transaction to RPC Server. .then((data) => { console.log(data); }) .catch ((error) => { console.log("error"); });
マルチシグアドレスからのXQC/XQGの転送
マルチシグアドレスからのコインの転送は、通常のQurasアドレスからのコインの転送に似ています。違いは、マルチシグトランザクションは、少なくともm = floor(n/2) + 1個のキーを必要とすることです。
Quras.api.qurasDB.getBalance(Quras.CONST.QURAS_NETWORK.DEV, 'DWrtupLj3fTsx19Zp5PjVneSrsvKdDdstS') // Get the balance of from address. .then((data) => { const balance = new Quras.wallet.Balance(data) var scriptHash = Quras.wallet.getScriptHashFromAddress('DWiDEG5kfyQC9gt7kJT86qXL5fp2TA5B4M'); // To address. const outputs = [{assetId: Quras.CONST.ASSET_ID["XQC"], // The type of coins that you want to send. value: 100 , // Coin amount to send. fee: 0.5, // fee. scriptHash: scriptHash}] // The scripthash of "To address". var testTx = Quras.tx.Transaction.createContractTx(balance, outputs) // create a transaction. Quras.api.qurasDB.getMyMultiSignMemberPubkeys(Quras.CONST.QURAS_NETWORK.DEV, 'DWrtupLj3fTsx19Zp5PjVneSrsvKdDdstS') .then((data) => { if (data.length < 1) throw new Error("There is no members"); testTx.createMultiSign(data, 'f6647ec531c4938ea477aa5c99f367820fdefdcff6f24c96aa83cfa2ab1b9e97'); // Sign the transaction using private key testTx = new Quras.tx.Transaction(JSON.parse(JSON.stringify(testTx))); testTx.joinMultiSign('7ed1aef02e9259fa81081ac2850a1e3363bbae5b5c3ac84e9ed2548848620e5f'); // Sign the transaction using private key testTx.joinMultiSign('3af2373286901af9aa9a76087800109d0b63fb8e96be447f1fafcf98db21fe84'); // Sign the transaction using private key testTx.joinMultiSign('bb0e2a6e667dd396c77d13398e4886fed7d31c14e48fc471896a7200ba2e6358'); // Sign the transaction using private key console.log(testTx.isCompletedMultiSign()); testTx = testTx.completeMultiSignTx(); const rpcServer = new Quras.rpc.RPCClient(Quras.CONST.QURAS_NETWORK.MAIN); rpcServer.sendRawTransaction(testTx.serialize()) // Send the transaction to RPC Server. .then((data) => { }).catch ((error) => {}); }).catch((error) => {}); }).catch((error) => {});
マルチシグアドレスからのXQG請求
マルチシグアドレスがXQCを保有している場合、通常のQurasアドレスと同様にXQGをステーキング報酬として請求することができます;
Quras.api.qurasDB.getClaimInfo(Quras.CONST.QURAS_NETWORK.DEV, 'DWrtupLj3fTsx19Zp5PjVneSrsvKdDdstS') .then((data) => { var testTx = Quras.tx.Transaction.createClaimTxWithQurasDB('DWrtupLj3fTsx19Zp5PjVneSrsvKdDdstS', data['available']); Quras.api.qurasDB.getMyMultiSignMemberPubkeys(Quras.CONST.QURAS_NETWORK.DEV, 'DWrtupLj3fTsx19Zp5PjVneSrsvKdDdstS') .then((data) => { if (data.length < 1) throw new Error("There is no members"); testTx.createMultiSign(data, 'f6647ec531c4938ea477aa5c99f367820fdefdcff6f24c96aa83cfa2ab1b9e97'); // Sign the transaction using private key console.log(testTx.isCompletedMultiSign()); testTx = new Quras.tx.Transaction(JSON.parse(JSON.stringify(testTx))); testTx.joinMultiSign('7ed1aef02e9259fa81081ac2850a1e3363bbae5b5c3ac84e9ed2548848620e5f'); // Sign the transaction using private key console.log(testTx.isCompletedMultiSign()); testTx.joinMultiSign('3af2373286901af9aa9a76087800109d0b63fb8e96be447f1fafcf98db21fe84'); // Sign the transaction using private key console.log(testTx.isCompletedMultiSign()); testTx.joinMultiSign('bb0e2a6e667dd396c77d13398e4886fed7d31c14e48fc471896a7200ba2e6358'); // Sign the transaction using private key console.log(testTx.isCompletedMultiSign()); testTx = testTx.completeMultiSignTx(); const rpcServer = new Quras.rpc.RPCClient(Quras.CONST.QURAS_NETWORK.MAIN); rpcServer.sendRawTransaction(testTx.serialize()) // Send the transaction to RPC Server. .then((data) => {}).catch ((error) => {}); }).catch((error) => {}); }).catch((error) => {});