Skip to content

Instantly share code, notes, and snippets.

@abmushi
Last active June 9, 2018 18:40
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save abmushi/314ef5507465c9419b3107f88fe6b291 to your computer and use it in GitHub Desktop.
Save abmushi/314ef5507465c9419b3107f88fe6b291 to your computer and use it in GitHub Desktop.

IOTA:Underlying Concept and Implementation of Multisig.  MAMの記事と合わせて、Tangleの柔軟性が伝わって欲しい。

Prerequisite

 今まで書いた記事の中でもIOTAの基礎部分は以下の3つで説明した。

IOTA:【入門】トランザクション大解剖!ウォレットは裏で何をやっているか。 IOTA:【技術解説】送金APIから紐解くBundleの全容。 IOTA【技術解説】署名と承認。 - 改訂版

Multisig

 Thinking of transfering large amount of money, especially the ones that imvolve exchange level of transactions, it is a risk to have one seed be responsible for the transfers. Multisig is used to initiate higher secure transfers by asking severail co-signers. Even though multisig transfers are created in a way different than ordinary individual transfers, when attached to tangle, is appears to be no different, and people cannot distingish multisigly attached transfer from others.

Address generation in depth

 The most essential idea in creating multisig transfer comes from the very basic of address generation mechanism. Especially, 'security' parameter is closely related and applied to multisig. Below is instannt overview of generating address. address_gen2.png  Address is only the final product that comes from Seed、Private Key、through digests.

Private Key

 Seed is arbitrary 81 tryte length string that users freely can choose. But, Private Key is not. It's just a result gotten after hashing Seed. Following is a simple experiment that generates different private key with different security from the same seed.

var Signing = require('../lib/crypto/signing/signing');
var Converter = require('../lib/crypto/converter/converter');

var seed = 'ABMUSHI9TEST';

// index is fixed, in this example.
var index = 0;

//  return Private Key
var getKey = function(seed,index,security){
    var key_trits = Signing.key(Converter.trits(seed),index,security);  // private key
    var key = Converter.trytes(key_trits);    // convert to tryte
    return key;
}

// show different private key with different security level(1,2, and 3)
for(var s=1;s<4;s++){
    var key = getKey(seed,index,s);
    console.log('- - - - - - - - - - - - - - - - - - - - -');
    console.log('security: ',s);
    console.log('private key length: ',key.length);
    console.log('private key: ',key);
}
- - - - - - - - - - - - - - - - - - - - -
security:  1
private key length:  2187
private key:  XUXGEZIDZJNUTRGHLXZLMTHQZIPGVCEDYZCYZPCGSXRRZTPFOCFFOC9W9ALKIQCVGZNVZJKNVKIEYHPWBIANTSWGFXQBIMBQLXNTGXKH9MSZYQUMDRNVWZVDBWLJZCMLAWJHUTJZARVELQEXIDCTLTSFYMVVLMNXFYUUGB9TVVEOPV9FFKQZTQONILV9FJCWZDRRITITAPTSOXRXCPWYJKNFONXJLFOIHKJWBWGKYYNUTKC9DWAMXSLFRBGMWKUIDD9CTJFKXEKEXMHWSWAR9GNGKAMHYQNOPLJORZFWHIXEGBBILATMSKHGN99ERIMNHQDZPBMOJOGNWCEBTQPABBRKOPXPYKFHUZDWSHWNDTLTUBFTGVGCYZYFQDUMRJ9IQMVFCZJZJHRVYREOEFNPDTJKMYLOKPKKLMEEEDIFHKAYBVEMXL9OWMEYMQYBVEONSTNWEPCSP9MNZNBOLICIHXYIQMBWALHDQNWCJD9LMGHSJWEHAWIIHE9GHRRSBMLQKWSQNCMAEOPHZRICNMTTYXH9KHBOCDADSECURFTE9YKGTVZHYFYHVHDDHL9Q9JJTTJJUWIZWIMTDAUI9DTFJENYLLLRQ9XIWMCQ9BPZRKZVLXTO9MCQCEALKCNVWGROTJNFVSLTYDMISCOQU9VRVNLBGGEAAR9XOYQOOKYXQJJTROWVQYBKO9URAFTMUW9ABBBCOABUO9GFDZBGACBLQQNYQYAIUKBVJGWRBUZYOJTIPO9GGSEJBUGNQPXYBIMMFPHNVOLTBGKP9AMGBFALZJLXQZMWZKAJURQRRKSKAYWQERERQCOQFABBAXL9MRCCRVFYMLUQATBFHLNISISIXKVYCEPMZKD9HSOKIL9YNVYVIVJHYNVDQEQ9HUZZHPDURFYBDUWRKCCHQDESPHZRPJOOWAUWCX9K9QYSROEDCTVWLLGECJDWI9KEZZAVKRTRHSHPTUQJOLNCBSDQMYTNFWGMYOIRS9RIQFABDTDKRTSZZSKVUUOIUORSDZGNQYXHIOFCYVQHFMBXFXRGLYRPZYWIRPRZXDRBIENSMSJVJMMUMHZPXGQHLDWKWCLVIYL9MQHMUXHHZYDFI9AAZOXFEGY9TTZMYWUVZXCJBWRSPXNTIZXCG9DSFGAHVQHIMYTZ9FFMOIGWVNTFDYNJDZDCGFMQFNHYXJMXLKSREUSAWVCWLUTBUNK9WXTWGDWZXSQCWCCHEZWZQWFRPEPUYDXWUTIVMITLRVWDBKHERHITJKBTKZDLWVKSJSUPSQJUEPKC9QTJIGKQGPRMRUHIWYPYSHCYUQXQRN9IJBDPRLYTADHVFQRBZNOPNBWXFLQIOMEMXFGMZ9SBVBTHHXFHDIIRKSGMZAPIKBXYDCEAQLSTTXDPQ9ASORJUZLMNOKQNXMJCTH9KZLBPNWVMBJSQXDEMFWWBNVQZXCJYRXEMBSSGWLVNOIEIZD9EJEWGHICEXOJZAEHJTJHTENPSZFERQBJZPX9NQOHGBYSUMKUXZDJ9FHEZUW9SMQHWMMNRJTKSAMWGKMDWCMB9ARCODYEXSRVBDFWXDHMEY9CT9QXTZNELVWSOHSJYPMQGKVFRNMUNQAPTVMVVFVNNBBBQAMOWSMETCHHMRWLXWWOEMFOEAZWMPLGSUZRS9PIUHMZOXBQKEQUBPRZICPQCSEVUMLLKTWC9VGZJEXDBAXVTMYYSACYQVJTIVIEZDI9SUHVLFKZEJAYEEYEBFCQFMIZZIATDDBNZQESSNXVEYFJRJSHHGQQDRGVDVLYMQKSRMOWMSNIISJYGIAWJKEHMWKDYEAEAETSST9JMYNC9KI9MMZGNADIJRYDKLXEFUZTMJEB9DBSPVOXVXLMGCXDXRQTZRUWLMHCXTSRZNGZDAFF9IYUZWISUBGNUEYTOPHDHFRJOVUVHUXIHLJHMJG9SSHMLRUULBJYGKHUQYAQOT9GHTXX9LCZLLEIMXYKIZHGSVHGSPA9GSKLLMIJ9WYL9DLODOWNXTMHJFZBIOIRVRBZIPAYDNRLZODNJQWATHOWMGACVPLDEANJXFETDCVFDOFGECVOWWXJQJEGAACIZBYFHDMIIMZHRMGJZSJDTVCUPDZKDFHWKVDZB9NILRXDGPHVVQBGGMDXDEVDMRXOTRJSNIEMXJVTDYHGTOLUIPSBCERYJSUQDGLQWVCBPPCLSVGVD
- - - - - - - - - - - - - - - - - - - - -
security:  2
private key length:  4374
private key:  XUXGEZIDZJNUTRGHLXZLMTHQZIPGVCEDYZCYZPCGSXRRZTPFOCFFOC9W9ALKIQCVGZNVZJKNVKIEYHPWBIANTSWGFXQBIMBQLXNTGXKH9MSZYQUMDRNVWZVDBWLJZCMLAWJHUTJZARVELQEXIDCTLTSFYMVVLMNXFYUUGB9TVVEOPV9FFKQZTQONILV9FJCWZDRRITITAPTSOXRXCPWYJKNFONXJLFOIHKJWBWGKYYNUTKC9DWAMXSLFRBGMWKUIDD9CTJFKXEKEXMHWSWAR9GNGKAMHYQNOPLJORZFWHIXEGBBILATMSKHGN99ERIMNHQDZPBMOJOGNWCEBTQPABBRKOPXPYKFHUZDWSHWNDTLTUBFTGVGCYZYFQDUMRJ9IQMVFCZJZJHRVYREOEFNPDTJKMYLOKPKKLMEEEDIFHKAYBVEMXL9OWMEYMQYBVEONSTNWEPCSP9MNZNBOLICIHXYIQMBWALHDQNWCJD9LMGHSJWEHAWIIHE9GHRRSBMLQKWSQNCMAEOPHZRICNMTTYXH9KHBOCDADSECURFTE9YKGTVZHYFYHVHDDHL9Q9JJTTJJUWIZWIMTDAUI9DTFJENYLLLRQ9XIWMCQ9BPZRKZVLXTO9MCQCEALKCNVWGROTJNFVSLTYDMISCOQU9VRVNLBGGEAAR9XOYQOOKYXQJJTROWVQYBKO9URAFTMUW9ABBBCOABUO9GFDZBGACBLQQNYQYAIUKBVJGWRBUZYOJTIPO9GGSEJBUGNQPXYBIMMFPHNVOLTBGKP9AMGBFALZJLXQZMWZKAJURQRRKSKAYWQERERQCOQFABBAXL9MRCCRVFYMLUQATBFHLNISISIXKVYCEPMZKD9HSOKIL9YNVYVIVJHYNVDQEQ9HUZZHPDURFYBDUWRKCCHQDESPHZRPJOOWAUWCX9K9QYSROEDCTVWLLGECJDWI9KEZZAVKRTRHSHPTUQJOLNCBSDQMYTNFWGMYOIRS9RIQFABDTDKRTSZZSKVUUOIUORSDZGNQYXHIOFCYVQHFMBXFXRGLYRPZYWIRPRZXDRBIENSMSJVJMMUMHZPXGQHLDWKWCLVIYL9MQHMUXHHZYDFI9AAZOXFEGY9TTZMYWUVZXCJBWRSPXNTIZXCG9DSFGAHVQHIMYTZ9FFMOIGWVNTFDYNJDZDCGFMQFNHYXJMXLKSREUSAWVCWLUTBUNK9WXTWGDWZXSQCWCCHEZWZQWFRPEPUYDXWUTIVMITLRVWDBKHERHITJKBTKZDLWVKSJSUPSQJUEPKC9QTJIGKQGPRMRUHIWYPYSHCYUQXQRN9IJBDPRLYTADHVFQRBZNOPNBWXFLQIOMEMXFGMZ9SBVBTHHXFHDIIRKSGMZAPIKBXYDCEAQLSTTXDPQ9ASORJUZLMNOKQNXMJCTH9KZLBPNWVMBJSQXDEMFWWBNVQZXCJYRXEMBSSGWLVNOIEIZD9EJEWGHICEXOJZAEHJTJHTENPSZFERQBJZPX9NQOHGBYSUMKUXZDJ9FHEZUW9SMQHWMMNRJTKSAMWGKMDWCMB9ARCODYEXSRVBDFWXDHMEY9CT9QXTZNELVWSOHSJYPMQGKVFRNMUNQAPTVMVVFVNNBBBQAMOWSMETCHHMRWLXWWOEMFOEAZWMPLGSUZRS9PIUHMZOXBQKEQUBPRZICPQCSEVUMLLKTWC9VGZJEXDBAXVTMYYSACYQVJTIVIEZDI9SUHVLFKZEJAYEEYEBFCQFMIZZIATDDBNZQESSNXVEYFJRJSHHGQQDRGVDVLYMQKSRMOWMSNIISJYGIAWJKEHMWKDYEAEAETSST9JMYNC9KI9MMZGNADIJRYDKLXEFUZTMJEB9DBSPVOXVXLMGCXDXRQTZRUWLMHCXTSRZNGZDAFF9IYUZWISUBGNUEYTOPHDHFRJOVUVHUXIHLJHMJG9SSHMLRUULBJYGKHUQYAQOT9GHTXX9LCZLLEIMXYKIZHGSVHGSPA9GSKLLMIJ9WYL9DLODOWNXTMHJFZBIOIRVRBZIPAYDNRLZODNJQWATHOWMGACVPLDEANJXFETDCVFDOFGECVOWWXJQJEGAACIZBYFHDMIIMZHRMGJZSJDTVCUPDZKDFHWKVDZB9NILRXDGPHVVQBGGMDXDEVDMRXOTRJSNIEMXJVTDYHGTOLUIPSBCERYJSUQDGLQWVCBPPCLSVGVDYSCKGXUBGYRAZJDAQYCNFWZSLKOYJSRCGVJZHTSXMFBKCDNBJR9HKEEE9ALGASHEYLABOUKKUYCGEWLNZRQIBXWMIPLDXZXDJNVTOCLSQUPTEQIFLCSWUJOLWI9TWMSF9HZWBZCIYOQITAAMIBHQGDJKSXWRHPLYICVYOKYZUXFVUCZUTRBSKTKOQYURAXLLPNJNY9QVCQBG9ZNEJBXCTFHROGTXL99PWAPFKJOBIE9FEICTTX9GOUFOCABPFRDFOHRQWYLMDJYWPTUULBFBTMEXLNWCHVPEASRREAQ9TXKRJRMKPDPHPKOEKCCHOR9BDGZ9RUEXBVJVBWMKUEZNXEKQYZZCHAWPFKUTWCIDM9JHNXUJOS9HDDZSQZMIUFCHJYJHTOYKRPYP9DRGNYDRDCYKNE9BZQONWFHORWTVAKUIGX9SAPJTAEBOSUHIAPUMDNPMWLHGPPKFZGWBLLFATYUZOK9HRJBDYPHIEDGMNVRDBJCKGQOOQFBVHBGLSVHPWCROQZANFBJGW9QEE9WVTUPFMULPKGKHXSBGPJSNXVPXVGYFYAITGJAJYOWHNHGSKVCK9SKCOYHRGGSDYO9ILEPPZLXECTTI9GGFXNN9GOWUSGOLEDJ9XHOAVZIKJRPLTALVQG9DRTYNS9ZUUTZAJHJSPCKMKKQKQKSTDINPJVXYDYAHDGFWINGFKXFW9DSHTTABQNVHD9ZPCFDISQNVL9NHDYMPPNQJUVWIHXUMVJ9ZXZKIRHQQWQVRMTOYAPOWHFXMGCXJFTJFJBMFLAJHHEURVHPRQNDOXQTGBKU9XDKHVIVCCLWDSBIDLCOWMEJJMXDONHHTUANKKOYFURF9DTVAAFQEMCBVZBQZMJQIFHRISLFXGQMUMZNYNOXYDDYWFHVIQJNJVKVWXUTWBMTBXQSCWXDTZZQVWELRFLAGXNXSDPKKMKUIHN9SSOHKNZAZCOYGUKFXJIDDLECPVINKENDMKWJLGCWKZPPQQAAONUOYFVTWVBTFDBUYYHHDZUCXMVNNUVBOGD9KOIMONVTZBGFX9FRVCTNRBWJVJSJOUZBXBNTKQUVZIOEUDNOL9WYUG9FLKJVHOJWBVLMKWMJPRMQDTEQLXAFECHPZYHPQZFSEPDNQGPRMITSQCQFMAZSSAFOKNRPMUK9JOKAKHUZAZYIURHQYUGAVNHN9TXJLDFWSJSWEAEWQCGLLR9ZDBRXNNZWWPDYF9LWFKMPHLYLHIWWCEXFJOCWXWTPK9ICCLEOOKAXWDPK9P9FWXSSRZBKRNWZPJYYWYYSVCODB9JVLFH9E9YOTUSGHRFGFGSVDHX9BYBTGLYCTRKOEVUFVWMIPRPWCMLNBTPG9CB9NNLQCYCIF9PVUCZ9OZRQDEIIJOWWCKZEYHCE999WPXMUFQSISGJCHZVTLPFHSYHJXHTVBIMEUXXJWUWQHNNQPHV9CVSQQRCMSRWPKRTYZLBOKZXTCFMDHOVXITWWHEJLYPYRNQTLXBUNSSUAASYVKLRTZZWMVYCKBNVDKSLO9DXCMOITHA9DCUSOIKWNHI9QJKLVKGIC9HYYWSBYD9OJQRHY9UPJULCAYZQTHSATYKTPEWAVTRTNO9VYGLEKUYHOLMBHWNRSKYTOPDDFQNDTOSBDWIAVWRAWGXFLJCL9LBJNVZHVZVKLRKIYDVMZSDHKZIPPI9EWEAJ9NUPHHR9KAWUNS9NT9JJDWPIUCNBYDLVCTBFACTETDVGZVZSDKXQXUBKXAPULERN9CIYATKGKPJAUSJ9YNRVBCLGRZZYDVJGWA9IVQBASIWVZGHTKNTEKDXBYZXQQTSXYOSEEHB9YJDKXPLIUQSSWBHKIGMTKRXUAELSJZXRGMXJWXCWVJBCXSZWVPXWHJWXBOFGZBIWZHHUFULCKHSDKJRKZZ9FPTUCBHESQ9DNIGWEZGWTHQCOMHXGW9AGMYHBQ9WSLIRGPUYIAAOKYZVNDRKBFWGYRSJLIAEXLXQPFGZTQPHNFEUWQLNXPDYXQOZ9MUAUH9JU9SWCJAAWRZZXKWYFFOGRPPOQJQPXGNUPOXLRRYZPDDTHMKVAXPZPADZKENHZHACAZZHMCAFVC9QVQXPKSDDLLSD9NQLZRPKUKXZZYRKSTKHYK9LZIYXCQXIKMNJKYBWLPG9GSEJPKGIFYNTZTOINIZBBHMUJTYGMAJXZZOYXB
- - - - - - - - - - - - - - - - - - - - -
security:  3
private key length:  6561
private key:  XUXGEZIDZJNUTRGHLXZLMTHQZIPGVCEDYZCYZPCGSXRRZTPFOCFFOC9W9ALKIQCVGZNVZJKNVKIEYHPWBIANTSWGFXQBIMBQLXNTGXKH9MSZYQUMDRNVWZVDBWLJZCMLAWJHUTJZARVELQEXIDCTLTSFYMVVLMNXFYUUGB9TVVEOPV9FFKQZTQONILV9FJCWZDRRITITAPTSOXRXCPWYJKNFONXJLFOIHKJWBWGKYYNUTKC9DWAMXSLFRBGMWKUIDD9CTJFKXEKEXMHWSWAR9GNGKAMHYQNOPLJORZFWHIXEGBBILATMSKHGN99ERIMNHQDZPBMOJOGNWCEBTQPABBRKOPXPYKFHUZDWSHWNDTLTUBFTGVGCYZYFQDUMRJ9IQMVFCZJZJHRVYREOEFNPDTJKMYLOKPKKLMEEEDIFHKAYBVEMXL9OWMEYMQYBVEONSTNWEPCSP9MNZNBOLICIHXYIQMBWALHDQNWCJD9LMGHSJWEHAWIIHE9GHRRSBMLQKWSQNCMAEOPHZRICNMTTYXH9KHBOCDADSECURFTE9YKGTVZHYFYHVHDDHL9Q9JJTTJJUWIZWIMTDAUI9DTFJENYLLLRQ9XIWMCQ9BPZRKZVLXTO9MCQCEALKCNVWGROTJNFVSLTYDMISCOQU9VRVNLBGGEAAR9XOYQOOKYXQJJTROWVQYBKO9URAFTMUW9ABBBCOABUO9GFDZBGACBLQQNYQYAIUKBVJGWRBUZYOJTIPO9GGSEJBUGNQPXYBIMMFPHNVOLTBGKP9AMGBFALZJLXQZMWZKAJURQRRKSKAYWQERERQCOQFABBAXL9MRCCRVFYMLUQATBFHLNISISIXKVYCEPMZKD9HSOKIL9YNVYVIVJHYNVDQEQ9HUZZHPDURFYBDUWRKCCHQDESPHZRPJOOWAUWCX9K9QYSROEDCTVWLLGECJDWI9KEZZAVKRTRHSHPTUQJOLNCBSDQMYTNFWGMYOIRS9RIQFABDTDKRTSZZSKVUUOIUORSDZGNQYXHIOFCYVQHFMBXFXRGLYRPZYWIRPRZXDRBIENSMSJVJMMUMHZPXGQHLDWKWCLVIYL9MQHMUXHHZYDFI9AAZOXFEGY9TTZMYWUVZXCJBWRSPXNTIZXCG9DSFGAHVQHIMYTZ9FFMOIGWVNTFDYNJDZDCGFMQFNHYXJMXLKSREUSAWVCWLUTBUNK9WXTWGDWZXSQCWCCHEZWZQWFRPEPUYDXWUTIVMITLRVWDBKHERHITJKBTKZDLWVKSJSUPSQJUEPKC9QTJIGKQGPRMRUHIWYPYSHCYUQXQRN9IJBDPRLYTADHVFQRBZNOPNBWXFLQIOMEMXFGMZ9SBVBTHHXFHDIIRKSGMZAPIKBXYDCEAQLSTTXDPQ9ASORJUZLMNOKQNXMJCTH9KZLBPNWVMBJSQXDEMFWWBNVQZXCJYRXEMBSSGWLVNOIEIZD9EJEWGHICEXOJZAEHJTJHTENPSZFERQBJZPX9NQOHGBYSUMKUXZDJ9FHEZUW9SMQHWMMNRJTKSAMWGKMDWCMB9ARCODYEXSRVBDFWXDHMEY9CT9QXTZNELVWSOHSJYPMQGKVFRNMUNQAPTVMVVFVNNBBBQAMOWSMETCHHMRWLXWWOEMFOEAZWMPLGSUZRS9PIUHMZOXBQKEQUBPRZICPQCSEVUMLLKTWC9VGZJEXDBAXVTMYYSACYQVJTIVIEZDI9SUHVLFKZEJAYEEYEBFCQFMIZZIATDDBNZQESSNXVEYFJRJSHHGQQDRGVDVLYMQKSRMOWMSNIISJYGIAWJKEHMWKDYEAEAETSST9JMYNC9KI9MMZGNADIJRYDKLXEFUZTMJEB9DBSPVOXVXLMGCXDXRQTZRUWLMHCXTSRZNGZDAFF9IYUZWISUBGNUEYTOPHDHFRJOVUVHUXIHLJHMJG9SSHMLRUULBJYGKHUQYAQOT9GHTXX9LCZLLEIMXYKIZHGSVHGSPA9GSKLLMIJ9WYL9DLODOWNXTMHJFZBIOIRVRBZIPAYDNRLZODNJQWATHOWMGACVPLDEANJXFETDCVFDOFGECVOWWXJQJEGAACIZBYFHDMIIMZHRMGJZSJDTVCUPDZKDFHWKVDZB9NILRXDGPHVVQBGGMDXDEVDMRXOTRJSNIEMXJVTDYHGTOLUIPSBCERYJSUQDGLQWVCBPPCLSVGVDYSCKGXUBGYRAZJDAQYCNFWZSLKOYJSRCGVJZHTSXMFBKCDNBJR9HKEEE9ALGASHEYLABOUKKUYCGEWLNZRQIBXWMIPLDXZXDJNVTOCLSQUPTEQIFLCSWUJOLWI9TWMSF9HZWBZCIYOQITAAMIBHQGDJKSXWRHPLYICVYOKYZUXFVUCZUTRBSKTKOQYURAXLLPNJNY9QVCQBG9ZNEJBXCTFHROGTXL99PWAPFKJOBIE9FEICTTX9GOUFOCABPFRDFOHRQWYLMDJYWPTUULBFBTMEXLNWCHVPEASRREAQ9TXKRJRMKPDPHPKOEKCCHOR9BDGZ9RUEXBVJVBWMKUEZNXEKQYZZCHAWPFKUTWCIDM9JHNXUJOS9HDDZSQZMIUFCHJYJHTOYKRPYP9DRGNYDRDCYKNE9BZQONWFHORWTVAKUIGX9SAPJTAEBOSUHIAPUMDNPMWLHGPPKFZGWBLLFATYUZOK9HRJBDYPHIEDGMNVRDBJCKGQOOQFBVHBGLSVHPWCROQZANFBJGW9QEE9WVTUPFMULPKGKHXSBGPJSNXVPXVGYFYAITGJAJYOWHNHGSKVCK9SKCOYHRGGSDYO9ILEPPZLXECTTI9GGFXNN9GOWUSGOLEDJ9XHOAVZIKJRPLTALVQG9DRTYNS9ZUUTZAJHJSPCKMKKQKQKSTDINPJVXYDYAHDGFWINGFKXFW9DSHTTABQNVHD9ZPCFDISQNVL9NHDYMPPNQJUVWIHXUMVJ9ZXZKIRHQQWQVRMTOYAPOWHFXMGCXJFTJFJBMFLAJHHEURVHPRQNDOXQTGBKU9XDKHVIVCCLWDSBIDLCOWMEJJMXDONHHTUANKKOYFURF9DTVAAFQEMCBVZBQZMJQIFHRISLFXGQMUMZNYNOXYDDYWFHVIQJNJVKVWXUTWBMTBXQSCWXDTZZQVWELRFLAGXNXSDPKKMKUIHN9SSOHKNZAZCOYGUKFXJIDDLECPVINKENDMKWJLGCWKZPPQQAAONUOYFVTWVBTFDBUYYHHDZUCXMVNNUVBOGD9KOIMONVTZBGFX9FRVCTNRBWJVJSJOUZBXBNTKQUVZIOEUDNOL9WYUG9FLKJVHOJWBVLMKWMJPRMQDTEQLXAFECHPZYHPQZFSEPDNQGPRMITSQCQFMAZSSAFOKNRPMUK9JOKAKHUZAZYIURHQYUGAVNHN9TXJLDFWSJSWEAEWQCGLLR9ZDBRXNNZWWPDYF9LWFKMPHLYLHIWWCEXFJOCWXWTPK9ICCLEOOKAXWDPK9P9FWXSSRZBKRNWZPJYYWYYSVCODB9JVLFH9E9YOTUSGHRFGFGSVDHX9BYBTGLYCTRKOEVUFVWMIPRPWCMLNBTPG9CB9NNLQCYCIF9PVUCZ9OZRQDEIIJOWWCKZEYHCE999WPXMUFQSISGJCHZVTLPFHSYHJXHTVBIMEUXXJWUWQHNNQPHV9CVSQQRCMSRWPKRTYZLBOKZXTCFMDHOVXITWWHEJLYPYRNQTLXBUNSSUAASYVKLRTZZWMVYCKBNVDKSLO9DXCMOITHA9DCUSOIKWNHI9QJKLVKGIC9HYYWSBYD9OJQRHY9UPJULCAYZQTHSATYKTPEWAVTRTNO9VYGLEKUYHOLMBHWNRSKYTOPDDFQNDTOSBDWIAVWRAWGXFLJCL9LBJNVZHVZVKLRKIYDVMZSDHKZIPPI9EWEAJ9NUPHHR9KAWUNS9NT9JJDWPIUCNBYDLVCTBFACTETDVGZVZSDKXQXUBKXAPULERN9CIYATKGKPJAUSJ9YNRVBCLGRZZYDVJGWA9IVQBASIWVZGHTKNTEKDXBYZXQQTSXYOSEEHB9YJDKXPLIUQSSWBHKIGMTKRXUAELSJZXRGMXJWXCWVJBCXSZWVPXWHJWXBOFGZBIWZHHUFULCKHSDKJRKZZ9FPTUCBHESQ9DNIGWEZGWTHQCOMHXGW9AGMYHBQ9WSLIRGPUYIAAOKYZVNDRKBFWGYRSJLIAEXLXQPFGZTQPHNFEUWQLNXPDYXQOZ9MUAUH9JU9SWCJAAWRZZXKWYFFOGRPPOQJQPXGNUPOXLRRYZPDDTHMKVAXPZPADZKENHZHACAZZHMCAFVC9QVQXPKSDDLLSD9NQLZRPKUKXZZYRKSTKHYK9LZIYXCQXIKMNJKYBWLPG9GSEJPKGIFYNTZTOINIZBBHMUJTYGMAJXZZOYXBNVQTNHRIEUFARKQKQJCTQDDPQWQSPUIZFGQXILXYYADVLRZEVLXSZLPEEFMSCVLYIFFAYPIWWT9VFSJTDZVOCYZABVOQEGFEFMJIWEEKFKBBNIALMMJLMNZDZPDSSPMDQYWGDCAZCRKBLABJUXVZ9EOSKJLJRVWKOYHUVHRASW9PRAUAK9DGXVLTBQEYIKNHOXKLXZTFSEQF9VTCAKVYEONZFOVJVXNAPPOYWPQXZKQJQFLNCU9MQRJETHDVDYWRCVLWYQXXOXMKZUPWHWLVKZACNNYBDZLFQSYNOAWSAWHYGOGVZACBOCSXD9JVVIUG9LRZBHQNTZEBGT9JZNPFDWMIKCIOMUSSKROUEWYHJKKGTSEUTKOJDXGGVHVSAMUXAFVWPNX9YZTK9FE9FPJUCPEERLGWKNIXZUTJFUARMZSMJEFEUKFOIDMDPOCZGGUFMARX9MMWAJNNF9BB9SOLKZMGATMZJKINKGMAEZFVTFUQVVYJKCAGSFBNVIOZVJFGOYZJDMNPPZOTVAZCFXDKRIJOGXVAF9SADRSRPSKSDQJJAWXSVIKDFQ9UJYVHJQSRNYWEPPOUSOXGCRIVIOUZHI9MYGJITK9EGDSIADVKE9STUQSJBETYHJUUHESVEVKSUHUGWENDRL9UVYNGGETSBOKKAGDNFJXRYHPWQPEADGKB9NFHPDWTFKXSTZVLEEDVJMGEINXXPKDPMHVGBMNYKDEL9UZXGTUTOVQSCYAG9WZUPBEIWQXVNAGPKPHUYKCWUFXRVVYMCOBGOCEBBIOXELLWPUHFT9CEMFXXGHMROYGDOQUQYKNIVJLQZSOBZXSUBUICNLYI9DGHIFJLLGXJEEESYOMPOMAARGSWCP9JUUBLCVXDVRLGNB9DBCDLLEWEWL9IXVVWNIILBVV9FRZVCKKMIEICOBRLFWHXGERNEBXBRRKUEIMLHDZNFIKOPOBFUSJTAYHKJCC9ZZJNPLSJSZUVLQGABB9YZMCPBLGZV9KGRGOKBNERFUMUQKWKOPDCLXFCDNYS9UYDCOADJPLMWVAQRGUODVHGAXNBUPE9JSAJBWCQPOZTKMCONEQNFDAIFQJLOUJBHBRANLLUOSVNLGGQMWA9ACLSLFTNFMDXFECYXAQHTIQYHEFQTAYBKFMKIODBBCVRBHULD9MDLRUNS9OQCWPMO9O9T9GZVETNBAC99FVKSC9OCTKLDGFP9AXHHFUYGYAEHPJOCQREFTLAQJ9LPWUAGQBSOFQKOAGBATJGQCDXZPCYETMCWMWEFFPPFTJMIPZJJECIZAMXHHKVW9BFJPHVETSGBSTCVOWOSLPXLQZML9GGFRXDILRKMRTCKY9QFKAJBHNPSDHMYMNWN9LXTDFAWYNYXMGUKA9PKF9ODRTVODLNEVYNGIXGRUCAOKDQKRWHGWDCDTPFQYPTVLXZLLGHAYRSGZCSDTKZSLHLQWMNIBXHGCMESHZC9ZYDIZZOCPNCXVJCFYXPLMUKDMSTZ9TXBZLRZFVIESPANDIPSVTKDOCAVBRX9YXSJREVTECYLPHLHQPCZQBRYLVGVNUVRZECKJSJTZDMBPAKFQJPSVGQYKZGIPAANEZBBAGPKNETDVHGQFXMGK9PL9WWFGCHAKG9AIDEDQIJBDRQYILF9VOGNSNNHFYNNXJICWUJLIDW9UXKKXFLYAEXTZMRCVK9SAFCYCXYBRBLWLXMSSCYFMEZTYLWTYLIILFIVLDMFTLPZAUAPUPROWSIAMHRBB99ANFBMSN9HFUMKSKKYLBNFFNHWUQVV9GDOUROUMGOKETZTH9TKQNVBRKHIVPHQJYVVWUKNSSNXESUFYDCGKSRAJTTYBNI9UZADJQZPGEUOUEMRLWAJWVOCGEBXFKJNNBBNVWYWJI9DMNBVBDDNDWQNUGKMVKFBHUYDGBXTJTJPJAPIIQWFIYYDXTCWUFAQCV9ESE9LWEICQFTQLNJ9WA9RHAGXLMALACCBSCXMGZTLOEMCNSOQIBEPAJIQOMKICTFQXDJLYRCJNMEGJBCWCBAE9XWCERGTJARMLMHEEYXYSQMRPSBN9LXVASSGLI9SOJDTSFLNKNITVLJUZFVMSEKGBCIKOQQFCVLAWT9QJCUGOYRBUXLSELLKNNRSLLNTLNNBHOBGQHDZDXYBKSQFUMYWEQSLOECSCHDQKS9TKBQQWSAVBT9SJX

digest

digest is a next byproduct by hashing private key.

var Signing = require('../lib/crypto/signing/signing');
var Converter = require('../lib/crypto/converter/converter');

var seed = 'ABMUSHI9TEST';

// index is fixed in this example.
var index = 0;

// get digest
var getDigests = function(seed,index,security){
    var key_trits = Signing.key(Converter.trits(seed),index,security);  // private key
    var digest_trits = Signing.digests(key_trits);  // digest trits
    var digest = Converter.trytes(digest_trits); // convert to tryte
    return digest;
}

// show different digests with different security level(1,2, and 3)
for(var s=1;s<4;s++){
    var digest = getDigests(seed,index,s);
    console.log('- - - - - - - - - - - - - - - - - - - - -');
    console.log('security: ',s);
    console.log('digest length: ',digest.length);
    console.log('digest: ',digest);
}
- - - - - - - - - - - - - - - - - - - - -
security:  1
digest length:  81
digest:  OUHUMCXMVPJVCKKKNRJLZXMXKVFWDNPGDUKDKJCQFEXFXYDNFLJQHCEAPFCZVNFPCIJITBPDGVQOUYGHY
- - - - - - - - - - - - - - - - - - - - -
security:  2
digest length:  162
digest:  OUHUMCXMVPJVCKKKNRJLZXMXKVFWDNPGDUKDKJCQFEXFXYDNFLJQHCEAPFCZVNFPCIJITBPDGVQOUYGHYCBGPOYSCSDUGDFMJFFOZQRDKCUHOGIRLFOMFNJGITVWFYZNJDSMJJTAPBMQ9PZI9ARRSHYOMYFKLIROWA
- - - - - - - - - - - - - - - - - - - - -
security:  3
digest length:  243
digest:  OUHUMCXMVPJVCKKKNRJLZXMXKVFWDNPGDUKDKJCQFEXFXYDNFLJQHCEAPFCZVNFPCIJITBPDGVQOUYGHYCBGPOYSCSDUGDFMJFFOZQRDKCUHOGIRLFOMFNJGITVWFYZNJDSMJJTAPBMQ9PZI9ARRSHYOMYFKLIROWAVMRWHOBWLGLFJXTIFAVKNDTQZ9P9AHPBEFO9BVSVKIAFIXWAVIOEZBLZCCRSXNSWWSPKYCMUUGZZKYZFW

 Because long seemingly random string is hard to find sense, below is a figure that pictualizes what is happening.

key_digest.png

 Apparently, the bigger security, the longer length. And by changing security, only what deviates are newly appended chunk.

Address generation

 Note that every address has 81 tryte length. However, private key and digest are of different length, and length depends on the level of security. It implies address is generated by the mechanism with which any length of digest(pricisely must be multiples of 81) produces an address with length of 81 trytes.  For example, if security=10,Private Key is 21870(=2187\*10) trytes, digest is 810(=81\*10)trytes but address is 81 trytes. And importantly, completely different addresses are randomly produced from different security with no partial match.

address_gen2.png

 Multisig makes use of nature that final address being generated is always length of 81 trytes no matter how long the original digest is.

Multisig Implementaion

 Now we start looking at how multisig works.

Multisig Address

 For instance, as a setting, let's say Alice and Bob want to create an account, which both of them are responsible of the balance. They have own unique seed neighther of them know other's.  First of all, they generate the address called Multisig Address, which looks normal address of 81 trytes from any tangle viewers, but is generated in different way. When generating multisig address(of two people in this case), two digests of each Alice's and Bob's are used. And for each of them, they choose their own index, and security level individually to submit their digest.

twoDigests.png

 Note that they can share their digests freely. But, never share seeds as always.  Next, concatinate those submitted two digests to create one digest of double length. This new digest looks digest of security=5. Then using same method as used in normal address generation, hash the digest to create an address out of it.

twoDigests2.png

 This address is Multisig Address. In summary, Two different digests, each of which created from two different seeds, concatinated together is seen as one digest. And generate address from the digest.  Of course, if you concatinate more than two digests, you can generate the address that requires more than two people to sign.

Signing Multisig Address

 Let's assume we send 100[Gi] (big amount!) to this address. Sending to multisig address is just as same as ordinary sending. The difference is in sending(spending) from multisig address. Spending from any address requires signature. And multisig address by its name requires several co-singers.  Let's create transfer bundle. In this short example reveiver address is "xxx". And we send 50[Gi] to "xxx". And this 50[Gi] comes from the multisig address's balance(BID...). And remainder address which is used to send change amount to is not generated automatically in multisig transfer, because to generate next address one needs to have several digests from different people. So, before transfer value from multisig address input, make sure that all next digests with next index of co-signers are ready to create next address. Also, if you no longer need your change value to be sent to multisig address, you can specify any normal address.  Signature is generated from own private key. This procedure is no different from of normal signing, which is explained in this article. Signed data is generated bundle hash(strictly speaking, normalized bundle hash). Co-signers create signature of same bundle hash.

 multisig_en3.png

 Now we have co-signers' signature, two signatures in total. In this example, Alice is security=2 and Bob is security=3, so Alice's signature is of 4372 trytes, and 6561 trytes for bob's. Totally, 10935 (=4372+6561) trytes are stored in five signatureFragment of transaction objects in the bundle. (five comes from 5 = 10935/2187, where each signatureFragment of one transaction object is 2187 trytes.) *詳細。  Below is overview of the final bundle.

multisig_en4.png

 The figure above, each signature is colored just for visual friendly purpose. On acutual tangle, viewers cannot distinguish security=5 normal signature from security=2 and security=3 multisignature, and two security=2 and one security=1 multisignature.  And order matters. In this example, digest of Alice comes prior to digest of Bob, so signature should correspond to it.

Validate Multisig

 Validating is a piece of cake. On Tangle, multisig bundle being attached seems just as same as the one created from single signature. Only differences are the length of the signature. As seen in single signature, where different security level creates different length of the signature(security times 2187 Trytes), multisig bundle of, let's say, three people of security=3,3,2 can be treated as single sig of security=3+3+2=8 bundle when being validated.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment