概要
catapultでapostilleしてみる
Apostilleとは
Whitepaper
Apostille Whitepaper
https://nem.io/ApostilleWhitePaper.pdf
おすすめQiita記事
@44uk_i3 さんの記事
https://qiita.com/44uk_i3/items/82a5446e48aea23e054b
@daoka さんの記事
https://qiita.com/daoka/items/a548c2f8108e3ee81e9a
https://qiita.com/daoka/items/2ed21444b406b91fb240
図解
まちがっていたらごめんなさい
Public Apostille
ファイルからハッシュを計算する。
アポスティーユハッシュをメッセージに入れて、決められた公証アカウント宛に送信する。
Private Apostille
ファイルからハッシュを計算し署名する。
ファイル名からハッシュを計算し、アポスティーユアカウントの秘密鍵とする。
アポスティーユハッシュをメッセージに入れて、アポスティーユアカウント宛に送信する。
やってみる
まちがっていたらごめんなさい
Public Apostille
やること
- アポスティーユするファイルを作る
- ハッシュ値を求める
- 公証アカウントにハッシュ値をメッセージとして送る
コード
Public公証アカウントはSDICZ5EAOD5W6YCAJL33OS5B4Y6FUOWOUOOLCZAL
(勝手に決めた)
以下の部分で、SHA256を計算しています。
const cryptoJS = require("crypto-js");
const hash = cryptoJS.SHA256(text);
const apostilleHash = apostilleHashPrefix + hash.toString(cryptoJS.enc.Hex);
ぜんぶ
const nem2Sdk = require("nem2-sdk");
const cryptoJS = require("crypto-js");
const Address = nem2Sdk.Address,
Deadline = nem2Sdk.Deadline,
Account = nem2Sdk.Account,
UInt64 = nem2Sdk.UInt64,
NetworkType = nem2Sdk.NetworkType,
PlainMessage = nem2Sdk.PlainMessage,
TransferTransaction = nem2Sdk.TransferTransaction,
TransactionHttp = nem2Sdk.TransactionHttp,
XEM = nem2Sdk.XEM;
/*
sender:
private: 7808B5B53ECF24E40BE17B8EC3D0EB5F7C3F3D938E0D95A415F855AD4C27B2A4
public: 5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
address: SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK
sink:
address: SDICZ5EAOD5W6YCAJL33OS5B4Y6FUOWOUOOLCZAL
*/
const text = '999988887777';
const title = '4433221100.txt';
const tags = ['eeeeeeee'];
const apostilleHashPrefix = 'fe4e545903';
const hash = cryptoJS.SHA256(text);
const apostilleHash = apostilleHashPrefix + hash.toString(cryptoJS.enc.Hex);
const sinkAddress = 'SDICZ5EAOD5W6YCAJL33OS5B4Y6FUOWOUOOLCZAL';
const privateKey = '7808B5B53ECF24E40BE17B8EC3D0EB5F7C3F3D938E0D95A415F855AD4C27B2A4';
const account = Account.createFromPrivateKey(privateKey,NetworkType.MIJIN_TEST);
const transferTransaction = TransferTransaction.create(
Deadline.create(),
Address.createFromRawAddress(sinkAddress),
[XEM.createRelative(0)],
PlainMessage.create(apostilleHash),
NetworkType.MIJIN_TEST,
);
transferTransaction.fee = UInt64.fromUint(150000);
const signedTransaction = account.sign(transferTransaction);
const transactionHttp = new TransactionHttp('http://localhost:3000');
transactionHttp.announce(signedTransaction).subscribe(x => console.log(x),
err => console.error(err));
console.log('hash: ' + signedTransaction.hash);
console.log('signer: ' + signedTransaction.signer);
console.log('payload: ' + signedTransaction.payload);
const date = new Date();
const nty = { "data": [
{
"filename": title,
"tags": tags.join(' '),
"fileHash": apostilleHash,
"owner": account.address.address,
"fromMultisig": account.address.address,
"dedicatedAccount": sinkAddress,
"dedicatedPrivateKey": "None (public sink)",
"txHash": signedTransaction.hash.toLowerCase(),
"txMultisigHash": "",
"timeStamp": date.toUTCString()
}
]};
const apostilleFilename = title.slice(0, title.lastIndexOf('.')).concat(
' -- Apostille TX ',
signedTransaction.hash.toLowerCase(),
' -- Date ',
date.getFullYear(),
'-',
("00" + (date.getMonth() + 1)).slice(-2),
'-',
("00" + (date.getDate())).slice(-2),
title.slice(title.lastIndexOf('.'))
);
console.log(apostilleFilename);
console.log(JSON.stringify(nty));
実行
$ node publicApostille.js
hash: 4E83B8510F493533A72A876B120B4D95AA8859AFF79D4E7E12CF7B417ED6D0A7
signer: 5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
payload: EF000000EC12D0609C3CB339C8965AE1D2F9394B1973DDC3E1FEE96EB9786E18B851803A614F9A8048F726A5937C2BB35BB0E931833527A817017CAB8D1E9EAA0C4024095D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C03905441F04902000000000071866F911000000090D02CF48070FB6F60404AF7B74BA1E63C5A3ACEA39CB1640B4B000100666534653534353930333837663132393332373264616236393539313433306663633465656439623830383836363538376163616631373438336135663665373733653264386333656529CF5FD941AD25D50000000000000000
TransactionAnnounceResponse {
message: 'packet 9 was pushed to the network via /transaction' }
ファイル名
4433221100 -- Apostille TX 4e83b8510f493533a72a876b120b4d95aa8859aff79d4e7e12cf7b417ed6d0a7 -- Date 2018-07-03.txt
nfyファイル
Apostilleハッシュはfe4e54590387f1293272dab69591430fcc4eed9b808866587acaf17483a5f6e773e2d8c3ee
{
"data": [
{
"filename": "4433221100.txt",
"tags": "eeeeeeee",
"fileHash": "fe4e54590387f1293272dab69591430fcc4eed9b808866587acaf17483a5f6e773e2d8c3ee",
"owner": "SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK",
"fromMultisig": "SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK",
"dedicatedAccount": "SDICZ5EAOD5W6YCAJL33OS5B4Y6FUOWOUOOLCZAL",
"dedicatedPrivateKey": "None (public sink)",
"txHash": "4e83b8510f493533a72a876b120b4d95aa8859aff79d4e7e12cf7b417ed6d0a7",
"txMultisigHash": "",
"timeStamp": "Tue, 03 Jul 2018 12:31:21 GMT"
}
]
}
Private Apostille
やること
- アポスティーユするファイルを作る
- ファイル内容のハッシュ値に署名する
- これをアポスティーユハッシュとする
- ファイル名のハッシュ値に署名する
- これを公証アカウントにする
- 公証アカウントに、アポスティーユハッシュをメッセージとして送る
コード
アポスティーユハッシュの計算が少し変わります。ファイルのハッシュ値に対して、署名をしたものになります。
const cryptoJS = require("crypto-js");
const contentHash = cryptoJS.SHA256(text);
const contentHashSig = nem2lib.KeyPair.sign(ownerKeypair, contentHash.toString(cryptoJS.enc.Hex));
const apostilleHash = apostilleHashPrefix + nem2lib.convert.uint8ToHex(contentHashSig).toLowerCase();
また、プライベート公証アカウントは、ファイル名のハッシュに署名したものを秘密鍵として使います。
const filenameHash = cryptoJS.SHA256(title);
const filenameHashSig = nem2lib.KeyPair.sign(ownerKeypair, filenameHash.toString(cryptoJS.enc.Hex));
const dedicatedPrivateKey = nem2lib.convert.uint8ToHex(filenameHashSig.slice(0, 32));
ぜんぶ
const nem2Sdk = require("nem2-sdk");
const cryptoJS = require("crypto-js");
const nem2lib = require("nem2-library");
const Address = nem2Sdk.Address,
Deadline = nem2Sdk.Deadline,
Account = nem2Sdk.Account,
UInt64 = nem2Sdk.UInt64,
NetworkType = nem2Sdk.NetworkType,
PlainMessage = nem2Sdk.PlainMessage,
TransferTransaction = nem2Sdk.TransferTransaction,
TransactionHttp = nem2Sdk.TransactionHttp,
XEM = nem2Sdk.XEM;
/*
sender:
private: 7808B5B53ECF24E40BE17B8EC3D0EB5F7C3F3D938E0D95A415F855AD4C27B2A4
public: 5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
address: SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK
*/
const text = '999988887777';
const title = '4433221100.txt';
const tags = ['eeeeeeee'];
const apostilleHashPrefix = 'fe4e545983';
const ownerPrivateKey = '7808B5B53ECF24E40BE17B8EC3D0EB5F7C3F3D938E0D95A415F855AD4C27B2A4';
const ownerAccount = Account.createFromPrivateKey(ownerPrivateKey,NetworkType.MIJIN_TEST);
const ownerKeypair = nem2lib.KeyPair.createKeyPairFromPrivateKeyString(ownerPrivateKey);
const contentHash = cryptoJS.SHA256(text);
const contentHashSig = nem2lib.KeyPair.sign(ownerKeypair, contentHash.toString(cryptoJS.enc.Hex));
const apostilleHash = apostilleHashPrefix + nem2lib.convert.uint8ToHex(contentHashSig).toLowerCase();
const filenameHash = cryptoJS.SHA256(title);
const filenameHashSig = nem2lib.KeyPair.sign(ownerKeypair, filenameHash.toString(cryptoJS.enc.Hex));
const dedicatedPrivateKey = nem2lib.convert.uint8ToHex(filenameHashSig.slice(0, 32));
const dedicatedAccount = Account.createFromPrivateKey(dedicatedPrivateKey,NetworkType.MIJIN_TEST);
const transferTransaction = TransferTransaction.create(
Deadline.create(),
dedicatedAccount.address,
[XEM.createRelative(0)],
PlainMessage.create(apostilleHash),
NetworkType.MIJIN_TEST,
);
transferTransaction.fee = UInt64.fromUint(150000);
const signedTransaction = ownerAccount.sign(transferTransaction);
const transactionHttp = new TransactionHttp('http://localhost:3000');
transactionHttp.announce(signedTransaction).subscribe(x => console.log(x),
err => console.error(err));
console.log('hash: ' + signedTransaction.hash);
console.log('signer: ' + signedTransaction.signer);
console.log('payload: ' + signedTransaction.payload);
const date = new Date();
const nty = { "data": [
{
"filename": title,
"tags": tags.join(' '),
"fileHash": apostilleHash,
"owner": ownerAccount.address.address,
"fromMultisig": ownerAccount.address.address,
"dedicatedAccount": dedicatedAccount.address.address,
"dedicatedPrivateKey": dedicatedAccount.privateKey.toLowerCase(),
"txHash": signedTransaction.hash.toLowerCase(),
"txMultisigHash": "",
"timeStamp": date.toUTCString()
}
]};
const apostilleFilename = title.slice(0, title.lastIndexOf('.')).concat(
' -- Apostille TX ',
signedTransaction.hash.toLowerCase(),
' -- Date ',
date.getFullYear(),
'-',
("00" + (date.getMonth() + 1)).slice(-2),
'-',
("00" + (date.getDate())).slice(-2),
title.slice(title.lastIndexOf('.'))
);
console.log(apostilleFilename);
console.log(JSON.stringify(nty));
実行
$ node privateApostille.js
hash: 76260851C0C248711E91A3EBA66BE891FD69925FB8E7AECF40B411EDAD6D5B29
signer: 5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
payload: 2F0100008D35106BF210B2A43799229E0378650DCBFD392FA8930320704913E4CAA948D7DFEA101DCF00C042F8CF580CC1580528C0F15F2153EA829C0BDAB731FA3677015D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C03905441F049020000000000F8C89C911000000090EB5853DFC0F044C11308285076178B70FBBAA48FB3CFB3278B00010066653465353435393833623333356235643235336637396662376634663939363664616135643963393831386362373537643734313132336238663333363639346261373064663763353939646234646432323232636435366139363134336236653634653066376430633664626634373033393236303764386534663061386432633864306333306529CF5FD941AD25D50000000000000000
TransactionAnnounceResponse {
message: 'packet 9 was pushed to the network via /transaction' }
ファイル名
4433221100 -- Apostille TX 76260851c0c248711e91a3eba66be891fd69925fb8e7aecf40b411edad6d5b29 -- Date 2018-07-03.txt
ntyファイル
Apostilleハッシュはfe4e545983b335b5d253f79fb7f4f9966daa5d9c9818cb757d741123b8f336694ba70df7c599db4dd2222cd56a96143b6e64e0f7d0c6dbf470392607d8e4f0a8d2c8d0c30e
署名データがハッシュの2倍のサイズなので、長くなってます。
{
"data": [
{
"filename": "4433221100.txt",
"tags": "eeeeeeee",
"fileHash": "fe4e545983b335b5d253f79fb7f4f9966daa5d9c9818cb757d741123b8f336694ba70df7c599db4dd2222cd56a96143b6e64e0f7d0c6dbf470392607d8e4f0a8d2c8d0c30e",
"owner": "SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK",
"fromMultisig": "SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK",
"dedicatedAccount": "SDVVQU67YDYEJQITBAUFA5QXRNYPXOVER6Z47MZH",
"dedicatedPrivateKey": "7673d19743dcbb2344f84158f28f39754bce5b44a966043116c700d687cd75d6",
"txHash": "76260851c0c248711e91a3eba66be891fd69925fb8e7aecf40b411edad6d5b29",
"txMultisigHash": "",
"timeStamp": "Tue, 03 Jul 2018 13:20:48 GMT"
}
]
}
Private Apostilleの移譲
やること
- 公証アカウントをマルチシグ化する
- 連署者に、新しいオーナーを追加し、古いオーナーを削除する
コード
まずは、公証アカウントをマルチシグ化します。
ぜんぶ
const nem2Sdk = require("nem2-sdk");
const jssha3 = require('js-sha3');
const Deadline = nem2Sdk.Deadline,
Account = nem2Sdk.Account,
NetworkType = nem2Sdk.NetworkType,
TransactionHttp = nem2Sdk.TransactionHttp,
AccountHttp = nem2Sdk.AccountHttp,
PublicAccount = nem2Sdk.PublicAccount,
ModifyMultisigAccountTransaction = nem2Sdk.ModifyMultisigAccountTransaction,
MultisigCosignatoryModificationType = nem2Sdk.MultisigCosignatoryModificationType,
MultisigCosignatoryModification = nem2Sdk.MultisigCosignatoryModification;
/*
owner:
private: 7808B5B53ECF24E40BE17B8EC3D0EB5F7C3F3D938E0D95A415F855AD4C27B2A4
public: 5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
address: SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK
dedicated:
private: 7673d19743dcbb2344f84158f28f39754bce5b44a966043116c700d687cd75d6
public: B2762457C2373191C83018E9C4B556C24C44D857003A795CEE1550EB9593012C
address: SDVVQU67YDYEJQITBAUFA5QXRNYPXOVER6Z47MZH
*/
const dedicatedPrivateKey = '7673d19743dcbb2344f84158f28f39754bce5b44a966043116c700d687cd75d6';
const ownerPublicKey = '5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C';
const dedicatedAccount = Account.createFromPrivateKey(dedicatedPrivateKey, NetworkType.MIJIN_TEST);
const cosignatory = PublicAccount.createFromPublicKey(ownerPublicKey, NetworkType.MIJIN_TEST);
const convertIntoMultisigTransaction = ModifyMultisigAccountTransaction.create(
Deadline.create(),
1,
1,
[
new MultisigCosignatoryModification(
MultisigCosignatoryModificationType.Add,
cosignatory,
)
],
NetworkType.MIJIN_TEST
);
const signedTransaction = dedicatedAccount.sign(convertIntoMultisigTransaction);
const transactionHttp = new TransactionHttp('http://localhost:3000');
transactionHttp.announce(signedTransaction).subscribe(
x => console.log(x),
err => console.error(err)
);
console.log('hash : ' + signedTransaction.hash);
console.log('signer : ' + signedTransaction.signer);
console.log('payload: ' + signedTransaction.payload);
const accountHttp = new AccountHttp('http://localhost:3000');
setTimeout(() => {
accountHttp.getMultisigAccountInfo(dedicatedAccount.address).subscribe(
accountInfo => console.log(accountInfo),
err => console.error(err)
);
},20000);
次に、5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
から3390BF02D2BB59C8722297FF998CE89183D0906E469873284C091A5CDC22FD57
に連署者を変更します。
const changeOwnershipTransaction = ModifyMultisigAccountTransaction.create(
Deadline.create(),
0, // minApprovalDelta
0, // minRemovalDelta
[
new MultisigCosignatoryModification(
MultisigCosignatoryModificationType.Add,
newownerAccount
),
new MultisigCosignatoryModification(
MultisigCosignatoryModificationType.Remove,
ownerAccount.publicAccount
)
],
NetworkType.MIJIN_TEST
);
なお、ModifyMultisigAccountTransaction
のminApprovalDelta
とminRemovalDelta
について、対象のアカウントがすでにマルチシグだった場合、相対的な変化量を指定することになっているので、今回はどちらも0
です。
ぜんぶ
const nem2Sdk = require("nem2-sdk");
const cryptoJS = require("crypto-js");
const jssha3 = require('js-sha3');
const nem2lib = require("nem2-library");
const Deadline = nem2Sdk.Deadline,
Account = nem2Sdk.Account,
NetworkType = nem2Sdk.NetworkType,
TransactionHttp = nem2Sdk.TransactionHttp,
AccountHttp = nem2Sdk.AccountHttp,
AggregateTransaction = nem2Sdk.AggregateTransaction,
PublicAccount = nem2Sdk.PublicAccount,
ModifyMultisigAccountTransaction = nem2Sdk.ModifyMultisigAccountTransaction,
MultisigCosignatoryModificationType = nem2Sdk.MultisigCosignatoryModificationType,
MultisigCosignatoryModification = nem2Sdk.MultisigCosignatoryModification;
/*
owner:
private: 7808B5B53ECF24E40BE17B8EC3D0EB5F7C3F3D938E0D95A415F855AD4C27B2A4
public: 5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
address: SBWEUWON6IBHCW5IC4EI6V6SMTVJGCJWGLF57UGK
newowner:
private: 31B96EEB0C7FD6F8FB6B4ED09A9EB142A42B194AFBEB9EB52F0B79889F22326E
public: 3390BF02D2BB59C8722297FF998CE89183D0906E469873284C091A5CDC22FD57
address: SB2Y5ND4FDLBIO5KHXTKRWODDG2QHIN73DTYT2PC
dedicated:
private: 7673d19743dcbb2344f84158f28f39754bce5b44a966043116c700d687cd75d6
public: B2762457C2373191C83018E9C4B556C24C44D857003A795CEE1550EB9593012C
address: SDVVQU67YDYEJQITBAUFA5QXRNYPXOVER6Z47MZH
*/
const dedicatedPublicKey = 'B2762457C2373191C83018E9C4B556C24C44D857003A795CEE1550EB9593012C';
const ownerPrivateKey = '7808B5B53ECF24E40BE17B8EC3D0EB5F7C3F3D938E0D95A415F855AD4C27B2A4';
const newownerPublicKey = '3390BF02D2BB59C8722297FF998CE89183D0906E469873284C091A5CDC22FD57';
const dedicatedAccount = PublicAccount.createFromPublicKey(dedicatedPublicKey, NetworkType.MIJIN_TEST);
const ownerAccount = Account.createFromPrivateKey(ownerPrivateKey, NetworkType.MIJIN_TEST);
const newownerAccount = PublicAccount.createFromPublicKey(newownerPublicKey, NetworkType.MIJIN_TEST);
const changeOwnershipTransaction = ModifyMultisigAccountTransaction.create(
Deadline.create(),
0, // minApprovalDelta
0, // minRemovalDelta
[
new MultisigCosignatoryModification(
MultisigCosignatoryModificationType.Add,
newownerAccount
),
new MultisigCosignatoryModification(
MultisigCosignatoryModificationType.Remove,
ownerAccount.publicAccount
)
],
NetworkType.MIJIN_TEST
);
const aggregateTransaction = AggregateTransaction.createComplete(
Deadline.create(),
[
changeOwnershipTransaction.toAggregate(dedicatedAccount),
],
NetworkType.MIJIN_TEST,
[]
);
const signedTransaction = ownerAccount.sign(aggregateTransaction);
console.log('hash : ' + signedTransaction.hash);
console.log('signer : ' + signedTransaction.signer);
console.log('payload: ' + signedTransaction.payload);
const transactionHttp = new TransactionHttp('http://localhost:3000');
transactionHttp.announce(signedTransaction).subscribe(
x => console.log(x),
err => console.error(err)
);
const accountHttp = new AccountHttp('http://localhost:3000');
setTimeout(() => {
accountHttp.getMultisigAccountInfo(dedicatedAccount.address).subscribe(
accountInfo => console.log(accountInfo),
err => console.error(err)
);
},20000);
実行
マルチシグ化
$ node privateApostilleMultisig.js
hash : F7B80B9D7544A30354B10BFE58EEA88F6C61D7A3944CBCEF324699707E0D1B87
signer : B2762457C2373191C83018E9C4B556C24C44D857003A795CEE1550EB9593012C
payload: 9C0000004C2F6336E71134CC965EE9FFE77B916DF5C93522D065E7751EE146299CD029A0B4DAB2CA8E680FE05CB40AAE9073D001EE49BF7A8A853FC4B6139E078BE58508B2762457C2373191C83018E9C4B556C24C44D857003A795CEE1550EB9593012C0390554100000000000000004ED9329C10000000010101005D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
トランザクション
$ curl http://loclahost:3000/transaction/F7B80B9D7544A30354B10BFE58EEA88F6C61D7A3944CBCEF324699707E0D1B87/status{
"group": "confirmed",
"status": "Success",
"hash": "F7B80B9D7544A30354B10BFE58EEA88F6C61D7A3944CBCEF324699707E0D1B87",
"deadline": [
2620578126,
16
],
"height": [
224962,
0
]
}
公証アカウント
連署者は5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
$ curl http://localhost:3000/account/SDVVQU67YDYEJQITBAUFA5QXRNYPXOVER6Z47MZH/multisig
{
"multisig": {
"account": "B2762457C2373191C83018E9C4B556C24C44D857003A795CEE1550EB9593012C",
"accountAddress": "90EB5853DFC0F044C11308285076178B70FBBAA48FB3CFB327",
"minApproval": 1,
"minRemoval": 1,
"cosignatories": [
"5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C"
],
"multisigAccounts": []
}
}
公証アカウントの移譲
$ node privateApostilleTransfer.js
hash: F145EA789CB5A22487D6049BBBEE4E091096A090A78ECBA2DC7FAC082AA56DDF
signer: 5D9513282B65A12A1B68DCB67DB64245721F7AE7822BE441FE813173803C512C
payload:
TransactionAnnounceResponse {
message: 'packet 9 was pushed to the network via /transaction' }
トランザクション
$ curl http://localhost:3000/transaction/F145EA789CB5A22487D6049BBBEE4E091096A090A78ECBA2DC7FAC082AA56DDF/status
{
"group": "confirmed",
"status": "Success",
"hash": "F145EA789CB5A22487D6049BBBEE4E091096A090A78ECBA2DC7FAC082AA56DDF",
"deadline": [
2737386662,
16
],
"height": [
232542,
0
]
}
公証アカウント
連署者が3390BF02D2BB59C8722297FF998CE89183D0906E469873284C091A5CDC22FD57
になっているのがわかります。
$ curl http://localhost:3000/account/SDVVQU67YDYEJQITBAUFA5QXRNYPXOVER6Z47MZH/multisig
{
"multisig": {
"account": "B2762457C2373191C83018E9C4B556C24C44D857003A795CEE1550EB9593012C",
"accountAddress": "90EB5853DFC0F044C11308285076178B70FBBAA48FB3CFB327",
"minApproval": 1,
"minRemoval": 1,
"cosignatories": [
"3390BF02D2BB59C8722297FF998CE89183D0906E469873284C091A5CDC22FD57"
],
"multisigAccounts": []
}
}
感想
- アポスティーユの基本は、メッセージにファイルのハッシュ値を入れてトランザクションを作っていること。
- 公証は、作成と検証の機能が提供されて、初めて公証として使えるのかなと思った。
- その仕組みを実装さえすれば、オレオレ公証もできそう。
- NEMでは、マルチシグアカウントの連署者を、所有者とみなすことができる。
- また、アカウントを何かのアセットとしてみなすこともできる。
参考情報
NanoWalletを使ってテストネットでアポスティーユして、どんなファイルが出来上がるのかを見てみた。
Public Apostille
Nty-file-2018-07-01.nty
{
"data": [
{
"filename": "4433221100.txt",
"tags": "eeeeeeee",
"fileHash": "fe4e54590387f1293272dab69591430fcc4eed9b808866587acaf17483a5f6e773e2d8c3ee",
"owner": "TD2RQSMRAXP5DPO33NPURM3UNFNP7AGZPQ5P5XOG",
"fromMultisig": "TD2RQSMRAXP5DPO33NPURM3UNFNP7AGZPQ5P5XOG",
"dedicatedAccount": "TC7MCY5AGJQXZQ4BN3BOPNXUVIGDJCOHBPGUM2GE",
"dedicatedPrivateKey": "None (public sink)",
"txHash": "eabeb0250cd38dd5fa7643e1d7b930002c934d77d7e5d71f8f2dd0990eaf9afc",
"txMultisigHash": "",
"timeStamp": "Sun, 01 Jul 2018 09:17:13 GMT"
}
]
}
ファイル名
4433221100 – Apostille TX eabeb0250cd38dd5fa7643e1d7b930002c934d77d7e5d71f8f2dd0990eaf9afc – Date 2018-07-01.txt
ファイルの中身
999988887777
transaction
$ curl http://104.128.226.60:7890/transaction/get?hash=eabeb0250cd38dd5fa7643e1d7b930002c934d77d7e5d71f8f2dd0990eaf9afc
{
"meta": {
"innerHash": {},
"id": 238362,
"hash": {
"data": "eabeb0250cd38dd5fa7643e1d7b930002c934d77d7e5d71f8f2dd0990eaf9afc"
},
"height": 1531583
},
"transaction": {
"timeStamp": 102849012,
"amount": 0,
"signature": "3034327d476a52f9b2e069b54309c8ed5782a7ded510283c9a3c78ccbe8352c8c288d58eb43c2330328bfdb131ba316502a6dca60dd073baf92ee1e72dd0c50a",
"fee": 150000,
"recipient": "TC7MCY5AGJQXZQ4BN3BOPNXUVIGDJCOHBPGUM2GE",
"type": 257,
"deadline": 102852612,
"message": {
"payload": "fe4e54590387f1293272dab69591430fcc4eed9b808866587acaf17483a5f6e773e2d8c3ee",
"type": 1
},
"version": -1744830463,
"signer": "f15340a3f2face40afa4dd7425d646c4698fabcc9b0e73b98bcfcf3f24aebf27"
}
}
Private Apostille
Nty-file-2018-07-03.nty
{
"data": [
{
"filename": "8877331155.txt",
"tags": "cccccccc",
"fileHash": "fe4e54598369cd9e5aad3215a3ad61fd1d94a144f5b254e5c7937b0c407977998bb2349101c8982fc1f9732278210829f929f4842163347c5db078dd40cc795d904fdca508",
"owner": "TD2RQSMRAXP5DPO33NPURM3UNFNP7AGZPQ5P5XOG",
"fromMultisig": "TD2RQSMRAXP5DPO33NPURM3UNFNP7AGZPQ5P5XOG",
"dedicatedAccount": "TAVVHQCRWFBWR32QC5DCJMX7AWPLGK3FRR3HFO7U",
"dedicatedPrivateKey": "16969ba95686aa333c1bed8f7e912cf775da6d2df892add6e5cbd47ef5bfed07",
"txHash": "9a468252ec1dfc23280b796afbe0085d2a713d4b3932e2c51293609b8f5f4bd4",
"txMultisigHash": "",
"timeStamp": "Tue, 03 Jul 2018 13:38:59 GMT"
}
]
}
ファイル名
8877331155 -- Apostille TX 9a468252ec1dfc23280b796afbe0085d2a713d4b3932e2c51293609b8f5f4bd4 -- Date 2018-07-03.txt
ファイルの中身
3333555522221111
transaction
$ curl http://104.128.226.60:7890/transaction/get?hash=9a468252ec1dfc23280b796afbe0085d2a713d4b3932e2c51293609b8f5f4bd4
{
"meta": {
"innerHash": {},
"id": 239916,
"hash": {
"data": "9a468252ec1dfc23280b796afbe0085d2a713d4b3932e2c51293609b8f5f4bd4"
},
"height": 1534707
},
"transaction": {
"timeStamp": 103037518,
"amount": 0,
"signature": "271f4b85f9c5d289d14852c33c039cfc2e9654382a4dbf3fb069b741c9b66c2a1441991a650ef341072eafd2c0842b93a8d19008a103a1a33d80cddb6d061f0b",
"fee": 200000,
"recipient": "TAVVHQCRWFBWR32QC5DCJMX7AWPLGK3FRR3HFO7U",
"type": 257,
"deadline": 103041118,
"message": {
"payload": "fe4e54598369cd9e5aad3215a3ad61fd1d94a144f5b254e5c7937b0c407977998bb2349101c8982fc1f9732278210829f929f4842163347c5db078dd40cc795d904fdca508",
"type": 1
},
"version": -1744830463,
"signer": "f15340a3f2face40afa4dd7425d646c4698fabcc9b0e73b98bcfcf3f24aebf27"
}
}