LoginSignup
5
1

More than 5 years have passed since last update.

カタパルトのネームスペースIDとモザイクIDの導出方法(Alpaca, Bison, Cow)

Last updated at Posted at 2019-02-19

はじめに

カタパルトのCowからネームスペースIDとモザイクIDの導出方法が変わったので書きます。

ネームスペースID

Alpaca, Bison

基本的には、名前から導出されています。

例えば、nemのネームスペースIDは、84B3552D375FFA4Bです。

const nem2Sdk = require("nem2-sdk").NamespaceId;
const namespaceIdNem = new NamespaceId("nem");
console.log(namespaceIdNem.toHex().toUpperCase())
// 84B3552D375FFA4B

ルートネームスペースの場合は、0000000000000000と名前を結合してハッシュ値をとります。

ネームスペース(nem)
const nem = "6e656d"
const id = calcurateHash(toLE("0000000000000000") + nem)
console.log(toLE(id.substring(8,16)) + " " + toLE(id.substring(0,8)))
// 84B3552D 375FFA4B

サブネームスペースの場合は、親ネームスペースIDと名前を結合してハッシュ値をとります。

サブネームスペース(nem.catapult)
const catapult = "6361746170756C74"
const id = calcurateHash(toLE("84b3552d375ffa4b") + catapult)
console.log(toLE(id.substring(8,16)) + " " + toLE(id.substring(0,8)))
// 1B558641 28318CF8

Cow

Alpaca, Bisonとほとんど同じですが、最上位ビットが必ず1になるようになりました。例えば、catのネームスペースIDはB1497F5FBA651B4Fですが、先ほどと同じように計算すると、31497F5FBA651B4Fになります。

0x31は、0011 0001ですが、最上位ビットを立てると、1011 0001となり、0xB1となります。

ネームスペース(cat)
const cat = "636174"
const id = calcurateHash(toLE("0000000000000000") + cat)
console.log(toLE(id.substring(8,16)) + " " + toLE(id.substring(0,8)))
// 31497F5F BA651B4F
// 最上位ビットを立てると
// B1497F5F BA651B4F

サブネームスペースも同様です。

サブネームスペース(cat.harvest)
const harvest = "68617276657374"
const id = calcurateHash(toLE("B1497F5FBA651B4F") + cat)
console.log(toLE(id.substring(8,16)) + " " + toLE(id.substring(0,8)))
// 941299B2 B7E1291C
// 最初から最上位ビット立ってるパターン

モザイクID

Alpaca, Bison

ネームスペースIDと似たような感じです。ネームスペースIDとモザイク名を結合してハッシュをとります。

モザイク(xem)
const xem = "78656d"
const id = calcurateHash(toLE("84B3552D375FFA4B") + xem)
console.log(toLE(id.substring(8,16)) + " " + toLE(id.substring(0,8)))
// D525AD41 D95FCF29

Cow

劇的に変わりました。

モザイクから名前という概念はなくなりました。

ノンス(ナンス)という任意の値と、公開鍵から導出されます。

また、最上位ビットが必ず0になるようになりました。

モザイク(nonce=0)
const publicKey = '7F78559C556642FE132616910B1C9F2C36BC144D2D3A9E909092D64A0D0DE0DE'
const id = calcurateHash(toLE("00000000") + publicKey)
console.log(toLE(id.substring(8,16)) + " " + toLE(id.substring(0,8)))
// 119E1566 1E9B2758
モザイク(nonce=1)
const publicKey = '7F78559C556642FE132616910B1C9F2C36BC144D2D3A9E909092D64A0D0DE0DE'
const id = calcurateHash(toLE("00000001") + publicKey)
console.log(toLE(id.substring(8,16)) + " " + toLE(id.substring(0,8)))
// AAECBFD7 6AE7411B
// 最上位ビットを下げると
// 2AECBFD7 6AE7411B

toLEとcalcurateHashについて

toLE
const nem2lib = require("nem2-library")
function toLE(hex) {
    const uint8arr = nem2lib.convert.hexToUint8(hex)
    return nem2lib.convert.uint8ToHex(uint8arr.reverse())
}
calcurateHash
const sha3_256 = require('js-sha3').sha3_256
function calcurateHash(hex) {
    const hash = sha3_256.create();
    hash.update(Buffer.from(hex, 'hex'));
    return hash.hex().toUpperCase();
}

Cowでネメシスブロックに定義したIDを簡単に見る方法

nemgenをしたときのログから確認できます。

image.png

なんでNamespaceIdはMSBが1で、MosaicIdはMSBが0なの

Gimre氏が答えてくれました!

image.png

Cowでモザイクに名前を設定したいときは

MosaicAliasTransactionを使って、ネームスペースと紐づけます。

おわりに

これまでは、ネームスペース空間の中にモザイクがあるイメージでした。

Cowは、ネームスペースは名前定義の役割を持ち、モザイクはトークン・アセットを定義する役割を持つようになったと感じました。

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1