2017๋ ์ด, ์ฐ๋ฆฌ๋ ๊ธฐ์กด P2P ๋ฉ์ ์ ์ ๋นํด ์ฅ์ ์ ๋ ผ์ํ๋ฉด์ ๋ธ๋ก์ฒด์ธ ๋ฉ์ ์ (์ด๋ฆ๊ณผ ๋งํฌ๋ ํ๋กํ์ ์์)๋ฅผ ๋ง๋ค๊ธฐ ์์ํ์ต๋๋ค.
ํฉ๊ฒฉ 2.5
์ด์ iOS, ์น PWA, Windows, GNU/Linux, Mac OS ๋ฐ Android์์ ๋ฉ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฐ๋
์ ํ์ธํ ์ ์์์ต๋๋ค.
์ค๋์ ๋ธ๋ก์ฒด์ธ ๋ฉ์ ์ ์ ์๋ ๋ฐฉ์๊ณผ ํด๋ผ์ด์ธํธ ์ ํ๋ฆฌ์ผ์ด์
์ด ํด๋น API์ ์๋ํ๋ ๋ฐฉ์์ ์๋ ค๋๋ฆฌ๊ฒ ์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ธ๋ก์ฒด์ธ์ด ๊ธฐ์กด P2P ๋ฉ์ ์ ์ ๋ณด์ ๋ฐ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ๋ฅผ ์ํ์ต๋๋ค.
- ํ ๋ฒ์ ํด๋ฆญ์ผ๋ก ๊ณ์ ์ ๋ง๋ค ์ ์์ต๋๋ค. ์ ํ๋ ์ด๋ฉ์ผ์ด ์๊ณ ์ฃผ์๋ก์ด๋ ์ง๋ฆฌ์ ์์น์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
- ๋๋ด์๋ ์ ๋ ์ง์ ์ฐ๊ฒฐ์ ์ค์ ํ์ง ์์ผ๋ฉฐ ๋ชจ๋ ํต์ ์ ๋ถ์ฐ ๋ ธ๋ ์์คํ ์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค. ์ฌ์ฉ์์ IP ์ฃผ์๋ ์๋ก ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ๋ฉ์์ง๋ end-to-end curve25519xsalsa20poly1305๋ก ์ํธํ๋ฉ๋๋ค. ์ด๊ฒ์ ๋๊ตฌ์๊ฒ๋ ๋๋ผ์ง ์์ ๊ฒ ๊ฐ์ง๋ง ์ฐ๋ฆฌ์ ์์ค ์ฝ๋๋ ๊ณต๊ฐ๋์ด ์์ต๋๋ค.
- MITM ๊ณต๊ฒฉ์ ์ ์ธ๋ฉ๋๋ค. ๊ฐ ๋ฉ์์ง๋ ํธ๋์ญ์ ์ด๋ฉฐ Ed25519 EdDSA์ ์ํด ์๋ช ๋ฉ๋๋ค.
- ๋ฉ์์ง๋ ์์ฒด ๋ธ๋ก์ผ๋ก ๋๋ฉ๋๋ค. ์ผ๊ด์ฑ๊ณผ
timestamp
๋ธ๋ก์ ์์ ํ ์ ์์ผ๋ฏ๋ก ๋ฉ์์ง ์์๋ ์์ ํ ์ ์์ต๋๋ค. - "๋๋ ๊ทธ๋ฐ ๋ง์ ํ์ง ์์์ต๋๋ค"๋ ๋ธ๋ก์ฒด์ธ์ ๋ฉ์์ง์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
- ๋ฉ์์ง์ "์ง์์ฑ"์ ํ์ธํ๋ ์ค์ ๊ตฌ์กฐ๋ ์์ต๋๋ค. ์ด๋ ํฉ์์ ๊ธฐ๋ฐํ ๋ถ์ฐ ๋ ธ๋ ์์คํ ์ ์ํด ์ํ๋๋ฉฐ, ์ด๋ ์ฌ์ฉ์๊ฐ ์์ ํฉ๋๋ค.
- ๊ฒ์ด ๋ถ๊ฐ๋ฅ - ๊ณ์ ์ ์ฐจ๋จํ ์ ์์ผ๋ฉฐ ๋ฉ์์ง๋ฅผ ์ญ์ ํ ์ ์์ต๋๋ค.
- ๋ธ๋ก์ฒด์ธ 2FA๋ SMS๋ฅผ ํตํ ์ง์ฅ ๊ฐ์ 2FA์ ๋์์
๋๋ค.
๊ฑด๊ฐ์ ๋ง์ด ๋ง์ณค์ต๋๋ค. - ์ธ์ ๋ ์ง ๋ชจ๋ ์ฅ์น์์ ๋ชจ๋ ๋ํ๋ฅผ ์ป์ ์ ์๋ค๋ ๊ฒ์ ๋ํ๋ฅผ ๋ก์ปฌ์ ์ ํ ์ ์ฅํ ํ์๊ฐ ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
- ๋ฉ์์ง ์ ๋ฌ ํ์ธ. ์ฌ์ฉ์์ ์ฅ์น๊ฐ ์๋ ๋คํธ์ํฌ์ ๋ํ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ ์์ ์๊ฐ ๋ฉ์์ง๋ฅผ ์ฝ์ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์ค์ํ ์๋ฆผ์ ๋ณด๋ด๋ ๋ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ ๋๋ค.
๋ธ๋ก์ฒด์ธ์ ์ด์ ์๋ ์ํธํํ์ธ Ethereum, Dogecoin, Lisk, Dash, Bitcoin(์์ง ์งํ ์ค)๊ณผ์ ๊ธด๋ฐํ ํตํฉ ๋ฐ ์ฑํ ์์ ํ ํฐ์ ๋ณด๋ผ ์ ์๋ ๊ธฐ๋ฅ๋ ํฌํจ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋ด์ฅํ ์ํธํ ๊ตํ๊ธฐ๋ ๋ง๋ค์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ๊ฒ์ด ์ด๋ป๊ฒ ์๋ํ๋์ง.
๋ฉ์์ง๋ ๊ฑฐ๋์ด๋ค
๋ชจ๋ ์ฌ๋์ ์ด๋ฏธ ๋ธ๋ก์ฒด์ธ์ ๊ฑฐ๋๊ฐ ํ ์ฌ์ฉ์์์ ๋ค๋ฅธ ์ฌ์ฉ์๋ก ํ ํฐ(์ฝ์ธ)์ ์ ์กํ๋ค๋ ์ฌ์ค์ ์ต์ํฉ๋๋ค. ๋นํธ์ฝ์ธ์ฒ๋ผ. ์ฐ๋ฆฌ๋ ๋ฉ์์ง ์ ์ก์ ์ํด ํน๋ณํ ์ ํ์ ํธ๋์ญ์ ์ ๋ง๋ค์์ต๋๋ค.
๋ธ๋ก์ฒด์ธ์ ๋ฉ์ ์ ๋ก ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ์ผ ํฉ๋๋ค.
- ๋ฉ์์ง ํ ์คํธ ์ํธํ
- ์ํธ๋ฌธ์ ํธ๋์ญ์ ์ ๋ฃ๊ธฐ
- ๊ฑฐ๋์ ์๋ช ํ์ธ์
- ๋ชจ๋ ๋คํธ์ํฌ ๋ ธ๋์ ํธ๋์ญ์ ๋ณด๋ด๊ธฐ
- ๋ ธ๋์ ๋ถ์ฐ ์์คํ ์ด ๋ฉ์์ง์ "์ง์์ฑ"์ ๊ฒฐ์ ํฉ๋๋ค.
- ๋ชจ๋ ๊ฒ์ด ์ ์์ด๋ฉด ๋ฉ์์ง๊ฐ ํฌํจ๋ ํธ๋์ญ์ ์ด ๋ค์ ๋ธ๋ก์ ํฌํจ๋ฉ๋๋ค.
- ์์ ์๋ ๋ฉ์์ง ํธ๋์ญ์ ์ ๊ฒ์ํ๊ณ ์ํธ๋ฅผ ํด๋ ํฉ๋๋ค.
1~3๋จ๊ณ์ 7๋จ๊ณ๋ ํด๋ผ์ด์ธํธ์์ ๋ก์ปฌ๋ก ์ํ๋๊ณ 5~6๋จ๊ณ๋ ํธ์คํธ์์ ์ํ๋ฉ๋๋ค.
๋ฉ์์ง ์ํธํ
๋ฉ์์ง๋ ๋ณด๋ธ ์ฌ๋์ ๊ฐ์ธ ํค์ ๋ฐ๋ ์ฌ๋์ ๊ณต๊ฐ ํค๋ก ์ํธํ๋ฉ๋๋ค. ์ฐ๋ฆฌ๋ ๋คํธ์ํฌ์์ ๊ณต๊ฐ ํค๋ฅผ ๊ฐ์ ธ์ค์ง๋ง ์ด๋ฅผ ์ํด์๋ ์์ ์์ ๊ณ์ ์ ์ด๊ธฐํํด์ผ ํฉ๋๋ค. ์ฆ, ์ ์ด๋ ํ๋์ ๊ฑฐ๋๊ฐ ์์ด์ผ ํฉ๋๋ค. REST ์์ฒญ์ ์ฌ์ฉํ ์ ์์ต๋๋ค GET /api/accounts/getPublicKey?address={ADAMANT address}
, ์ฑํ
์ ๋ก๋ํ ๋ ๋ํ ์๋์ ๊ณต๊ฐ ํค๋ฅผ ์ด๋ฏธ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ฉ์ ์ ๋ curve25519xsalsa20poly1305 ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ฌ ๋ฉ์์ง๋ฅผ ์ํธํํฉ๋๋ค(
๋ค์์ JavaScript์ ์์ ๋๋ค.
/**
* Encodes a text message for sending to ADM
* @param {string} msg message to encode
* @param {*} recipientPublicKey recipient's public key
* @param {*} privateKey our private key
* @returns {{message: string, nonce: string}}
*/
adamant.encodeMessage = function (msg, recipientPublicKey, privateKey) {
const nonce = Buffer.allocUnsafe(24)
sodium.randombytes(nonce)
if (typeof recipientPublicKey === 'string') {
recipientPublicKey = hexToBytes(recipientPublicKey)
}
const plainText = Buffer.from(msg)
const DHPublicKey = ed2curve.convertPublicKey(recipientPublicKey)
const DHSecretKey = ed2curve.convertSecretKey(privateKey)
const encrypted = nacl.box(plainText, nonce, DHPublicKey, DHSecretKey)
return {
message: bytesToHex(encrypted),
nonce: bytesToHex(nonce)
}
}
๋ฉ์์ง๋ก ํธ๋์ญ์ ํ์ฑ
ํธ๋์ญ์ ์ ์ผ๋ฐ์ ์ธ ๊ตฌ์กฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
{
"id": "15161295239237781653",
"height": 7585271,
"blockId": "16391508373936326027",
"type": 8,
"block_timestamp": 45182260,
"timestamp": 45182254,
"senderPublicKey": "bd39cc708499ae91b937083463fce5e0668c2b37e78df28f69d132fce51d49ed",
"senderId": "U16023712506749300952",
"recipientId": "U17653312780572073341",
"recipientPublicKey": "23d27f616e304ef2046a60b762683b8dabebe0d8fc26e5ecdb1d5f3d291dbe21",
"amount": 204921300000000,
"fee": 50000000,
"signature": "3c8e551f60fedb81e52835c69e8b158eb1b8b3c89a04d3df5adc0d99017ffbcb06a7b16ad76d519f80df019c930960317a67e8d18ab1e85e575c9470000cf607",
"signatures": [],
"confirmations": 3660548,
"asset": {}
}
๋ฉ์์ง ๊ฑฐ๋์์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์ asset
- ๊ฐ์ฒด์ ๋ฉ์์ง๋ฅผ ๋ฃ์ด์ผ ํฉ๋๋ค. chat
๊ตฌ์กฐ:
message
- ์ํธํ๋ ๋ฉ์์ง๋ฅผ ์ ์ฅํ์ธ์own_message
-๋ชฉํtype
โ ๋ฉ์์ง ์ ํ
๋ฉ์์ง๋ ์ ํ์ผ๋ก ๊ตฌ๋ถ๋ฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๋งค๊ฐ๋ณ์๋ type
์ดํดํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค๋ค message
. ๋ฌธ์๋ง ๋ณด๋ผ ์๋ ์๊ณ ๋ด๋ถ์ ํฅ๋ฏธ๋ก์ด ๋ด์ฉ์ด ํฌํจ๋ ๊ฐ์ฒด๋ฅผ ๋ณด๋ผ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ๋ฉ์ ์ ๊ฐ ์ฑํ
์์ ์ํธํํ๋ฅผ ์ ์กํ๋ ๋ฐฉ์์
๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฐ๋ฆฌ๋ ํธ๋์ญ์ ์ ์์ฑํฉ๋๋ค.
{
"transaction": {
"type": 8,
"amount": 0,
"senderId": "U12499126640447739963",
"senderPublicKey": "e9cafb1e7b403c4cf247c94f73ee4cada367fcc130cb3888219a0ba0633230b6",
"asset": {
"chat": {
"message": "cb682accceef92d7cddaaddb787d1184ab5428",
"own_message": "e7d8f90ddf7d70efe359c3e4ecfb5ed3802297b248eacbd6",
"type": 1
}
},
"recipientId": "U15677078342684640219",
"timestamp": 63228087,
"signature": "ััั ะฑัะดะตั ะฟะพะดะฟะธัั"
}
}
๊ฑฐ๋ ์๋ช
๋ชจ๋ ์ฌ๋์ด ๋ณด๋ธ ์ฌ๋๊ณผ ๋ฐ๋ ์ฌ๋์ ์ง์ ์ฌ๋ถ, ๋ณด๋ธ ์๊ฐ, ๋ฉ์์ง ๋ด์ฉ์ ํ์ ํ ์ ์๋๋ก ๊ฑฐ๋์ ์๋ช ํฉ๋๋ค. ๋์งํธ ์๋ช ์ ์ฌ์ฉํ๋ฉด ๊ณต๊ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฑฐ๋์ ์ง์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์๋ ๊ฐ์ธ ํค๊ฐ ํ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์๋ช ์์ฒด๋ ๊ฐ์ธ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฉ๋๋ค.
๋ค์ด์ด๊ทธ๋จ์ ๋จผ์ SHA-256์ผ๋ก ํธ๋์ญ์
์ ํด์ํ ๋ค์ ์๋ช
ํ๋ ๊ฒ์ ๋ณด์ฌ์ค๋๋ค. signature
, ํธ๋์ญ์
ID๋ SHA-256 ํด์์ ์ผ๋ถ์
๋๋ค.
๊ตฌํ ์:
1 โ ๋ฉ์์ง๋ฅผ ํฌํจํ ๋ฐ์ดํฐ ๋ธ๋ก์ ํ์ฑํฉ๋๋ค.
/**
* Calls `getBytes` based on transaction type
* @see privateTypes
* @implements {ByteBuffer}
* @param {transaction} trs
* @param {boolean} skipSignature
* @param {boolean} skipSecondSignature
* @return {!Array} Contents as an ArrayBuffer.
* @throws {error} If buffer fails.
*/
adamant.getBytes = function (transaction) {
...
switch (transaction.type) {
case constants.Transactions.SEND:
break
case constants.Transactions.CHAT_MESSAGE:
assetBytes = this.chatGetBytes(transaction)
assetSize = assetBytes.length
break
โฆ
default:
alert('Not supported yet')
}
var bb = new ByteBuffer(1 + 4 + 32 + 8 + 8 + 64 + 64 + assetSize, true)
bb.writeByte(transaction.type)
bb.writeInt(transaction.timestamp)
...
bb.flip()
var arrayBuffer = new Uint8Array(bb.toArrayBuffer())
var buffer = []
for (var i = 0; i < arrayBuffer.length; i++) {
buffer[i] = arrayBuffer[i]
}
return Buffer.from(buffer)
}
2 - ๋ฐ์ดํฐ ๋ธ๋ก์์ SHA-256 ๊ณ์ฐ
/**
* Creates hash based on transaction bytes.
* @implements {getBytes}
* @implements {crypto.createHash}
* @param {transaction} trs
* @return {hash} sha256 crypto hash
*/
adamant.getHash = function (trs) {
return crypto.createHash('sha256').update(this.getBytes(trs)).digest()
}
3 โ ๊ฑฐ๋ ์๋ช
adamant.transactionSign = function (trs, keypair) {
var hash = this.getHash(trs)
return this.sign(hash, keypair).toString('hex')
}
/**
* Creates a signature based on a hash and a keypair.
* @implements {sodium}
* @param {hash} hash
* @param {keypair} keypair
* @return {signature} signature
*/
adamant.sign = function (hash, keypair) {
return sodium.crypto_sign_detached(hash, Buffer.from(keypair.privateKey, 'hex'))
}
๋ฉ์์ง์ ํจ๊ป ํธ๋์ญ์ ์ ๋คํธ์ํฌ ๋ ธ๋๋ก ๋ณด๋ด๊ธฐ
๋คํธ์ํฌ๊ฐ ๋ถ์ฐ๋์ด ์์ผ๋ฏ๋ก ๊ฐ๋ฐฉํ API๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ๋
ธ๋๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ์๋ํฌ์ธํธ์ POST ์์ฒญํ๊ธฐ api/transactions
:
curl 'api/transactions' -X POST
-d 'TX_DATA'
์ด์ ๋ํ ์๋ต์ผ๋ก ์ฐ๋ฆฌ๋ ๋ค์ ์ ํ์ ๊ฑฐ๋ ID๋ฅผ ๋ฐ๊ฒ ๋ฉ๋๋ค.
{
"success": true,
"nodeTimestamp": 63228852,
"transactionId": "6146865104403680934"
}
๊ฑฐ๋ ๊ฒ์ฆ
ํฉ์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๋ถ์ฐ ๋ ธ๋ ์์คํ ์ ๊ฑฐ๋ ๋ฉ์์ง์ "์ง์์ฑ"์ ๊ฒฐ์ ํฉ๋๋ค. ๋๊ตฌ์๊ฒ, ๋๊ตฌ์๊ฒ, ์ธ์ , ๋ฉ์์ง๊ฐ ๋ค๋ฅธ ๋ฉ์์ง๋ก ๋์ฒด๋์๋์ง, ์ ์ก ์๊ฐ์ด ์ฌ๋ฐ๋ฅด๊ฒ ํ์๋์๋์ง ์ฌ๋ถ. ์ด๋ ๋ธ๋ก์ฒด์ธ์ ๋งค์ฐ ์ค์ํ ์ฅ์ ์ ๋๋ค. ๊ฒ์ฆ์ ๋ด๋นํ๋ ์ค์ ๊ตฌ์กฐ๊ฐ ์์ผ๋ฉฐ ๋ฉ์์ง ์์์ ๋ด์ฉ์ด ์์กฐ๋ ์ ์์ต๋๋ค.
๋จผ์ , ํ ๋ ธ๋๊ฐ ์ ํ์ฑ์ ํ์ธํ ๋ค์ ์ด๋ฅผ ๋ค๋ฅธ ๋ ธ๋์๊ฒ ๋ณด๋ ๋๋ค. ๋๋ค์๊ฐ ๋ชจ๋ ๊ฒ์ด ์ ์์ด๋ผ๊ณ ๋งํ๋ฉด ํธ๋์ญ์ ์ ์ฒด์ธ์ ๋ค์ ๋ธ๋ก์ ํฌํจ๋ฉ๋๋ค. ์ด๊ฒ์ด ํฉ์์ ๋๋ค.
๊ฒ์ฌ๋ฅผ ๋ด๋นํ๋ ๋
ธ๋ ์ฝ๋ ๋ถ๋ถ์ GitHub์์ ๋ณผ ์ ์์ต๋๋ค.
๋ธ๋ก์ ๋ฉ์์ง๊ฐ ํฌํจ๋ ํธ๋์ญ์ ํฌํจ
ํฉ์์ ๋๋ฌํ๋ฉด ๋ฉ์์ง๊ฐ ํฌํจ๋ ํธ๋์ญ์ ์ด ๋ค๋ฅธ ์ ํจํ ํธ๋์ญ์ ๊ณผ ํจ๊ป ๋ค์ ๋ธ๋ก์ ํฌํจ๋ฉ๋๋ค.
๋ธ๋ก์ ์๊ฒฉํ ์์๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ฐ ํ์ ๋ธ๋ก์ ์ด์ ๋ธ๋ก์ ํด์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ์ฑ๋ฉ๋๋ค.
์์ ์ ์ฐ๋ฆฌ์ ๋ฉ์์ง๋ ์ด ์์์ ํฌํจ๋์ด ์์ผ๋ฉฐ "์ฌ๋ฐฐ์ด"๋ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ์ฌ๋ฌ ๋ฉ์์ง๊ฐ ํ๋์ ๋ธ๋ก์ ์ํ๋ ๊ฒฝ์ฐ ์์๋ ๋ค์๊ณผ ๊ฐ์ด ๊ฒฐ์ ๋ฉ๋๋ค. timestamp
๋ฉ์์ง.
๋ฉ์์ง ์ฝ๊ธฐ
๋ฉ์ ์ ์ ํ๋ฆฌ์ผ์ด์
์ ์์ ์์๊ฒ ์ ์ก๋ ๋ธ๋ก์ฒด์ธ์์ ํธ๋์ญ์
์ ๊ฒ์ํฉ๋๋ค. ์ด๋ฅผ ์ํด ์ฐ๋ฆฌ๋ ์๋ํฌ์ธํธ๋ฅผ ๋ง๋ค์์ต๋๋ค. api/chatrooms
.
๋ชจ๋ ๊ฑฐ๋๋ ๋๊ตฌ๋ ์ด์ฉํ ์ ์์ต๋๋ค. ์ํธํ๋ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์์ ์๋ง์ด ์์ ์ ๊ฐ์ธ ํค์ ๋ฐ์ ์์ ๊ณต๊ฐ ํค๋ฅผ ์ฌ์ฉํ์ฌ ์ํธ๋ฅผ ํด๋ ํ ์ ์์ต๋๋ค.
**
* Decodes the incoming message
* @param {any} msg encoded message
* @param {string} senderPublicKey sender public key
* @param {string} privateKey our private key
* @param {any} nonce nonce
* @returns {string}
*/
adamant.decodeMessage = function (msg, senderPublicKey, privateKey, nonce) {
if (typeof msg === 'string') {
msg = hexToBytes(msg)
}
if (typeof nonce === 'string') {
nonce = hexToBytes(nonce)
}
if (typeof senderPublicKey === 'string') {
senderPublicKey = hexToBytes(senderPublicKey)
}
if (typeof privateKey === 'string') {
privateKey = hexToBytes(privateKey)
}
const DHPublicKey = ed2curve.convertPublicKey(senderPublicKey)
const DHSecretKey = ed2curve.convertSecretKey(privateKey)
const decrypted = nacl.box.open(msg, nonce, DHPublicKey, DHSecretKey)
return decrypted ? decode(decrypted) : ''
}
๋ ๋ญ์ผ?
๋ฉ์์ง๋ ์ฝ 5์ด ์์ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ ๋ฌ๋๋ฏ๋ก(์ด๋๊ฐ ์๋ก์ด ๋คํธ์ํฌ ๋ธ๋ก์ด ๋ํ๋๋ ์๊ฐ์) ํด๋ผ์ด์ธํธ-๋ ธ๋ ๋ฐ ๋ ธ๋-๋ ธ๋ ์์ผ ์ฐ๊ฒฐ์ ์๊ฐํด ๋์ต๋๋ค. ๋ ธ๋๊ฐ ์๋ก์ด ํธ๋์ญ์ ์ ์์ ํ๋ฉด ์ ํจ์ฑ์ ํ์ธํ๊ณ ์ด๋ฅผ ๋ค๋ฅธ ๋ ธ๋์ ์ ๋ฌํฉ๋๋ค. ํฉ์๊ฐ ์ด๋ฃจ์ด์ง๊ณ ๋ธ๋ก์ ํฌํจ๋๊ธฐ ์ ์๋ ๋ฉ์ ์ ํด๋ผ์ด์ธํธ๋ ํธ๋์ญ์ ์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ์ผ๋ฐ ์ธ์คํดํธ ๋ฉ์ ์ ์ฒ๋ผ ์ฆ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ์ ์์ต๋๋ค.
์ฃผ์๋ก์ ์ ์ฅํ๊ธฐ ์ํด KVS(Key-Value Storage)๋ฅผ ๋ง๋ค์์ต๋๋ค. ์ด๋ ๋ ๋ค๋ฅธ ์ ํ์ ํธ๋์ญ์
์
๋๋ค. asset
์ํธํ๋ NaCl-box๋ ์๋์ง๋ง
ํ์ผ/์ด๋ฏธ์ง ์ ์ก ๋ฐ ๊ทธ๋ฃน ์ฑํ ์๋ ์ฌ์ ํ ๋ง์ ์์ ์ด ํ์ํฉ๋๋ค. ๋ฌผ๋ก , ์ค์์ ์ค์ ํ์์์๋ ์ด๊ฒ์ด ๋น ๋ฅด๊ฒ "๋ง๊ฐ์ง" ์ ์์ง๋ง, ์ฐ๋ฆฌ๋ ๋์ผํ ์์ค์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ฅผ ์ ์งํ๊ณ ์ถ์ต๋๋ค.
์, ์์ง ํด์ผ ํ ์ผ์ด ์์ต๋๋ค. ์ด์์ ์ผ๋ก๋ ์ค์ ๊ฐ์ธ ์ ๋ณด ๋ณดํธ๋ ์ฌ์ฉ์๊ฐ ๊ณต์ฉ ๋คํธ์ํฌ ๋ ธ๋์ ์ฐ๊ฒฐํ์ง ์๊ณ ์ค์ค๋ก ๋ ธ๋๋ฅผ ์์ฑํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ช ํผ์ผํธ์ ์ฌ์ฉ์๊ฐ ์ด ์์ ์ ์ํํ๋ค๊ณ ์๊ฐํ์๋์? ๋ง์ต๋๋ค, 0. ์ ํฌ๋ Tor ๋ฒ์ ์ ๋ฉ์ ์ ๋ก ์ด ๋ฌธ์ ๋ฅผ ๋ถ๋ถ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์์ต๋๋ค.
์ฐ๋ฆฌ๋ ๋ธ๋ก์ฒด์ธ์ ๋ฉ์ ์ ๊ฐ ์กด์ฌํ ์ ์๋ค๋ ๊ฒ์ ์ฆ๋ช
ํ์ต๋๋ค. ์ด์ ์๋ 2012๋
์ ๋จ ํ ๋ฒ์ ์๋๋ง ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ํ์๋ก ์ ๋ธ๋ก์ฒด์ธ์ ๋ฉ์ ์ ๊ฐ ์๋๋ฅผ ์์ ์๋ค๋ ์ฌ์ค์ ๊ธฐ์ธํฉ๋๋ค. ์ฌ๋๋ค์ ์์ ์ ๊ณ์ ์ ๋ํด ์ฑ
์์ ์ง ์ค๋น๊ฐ ๋์ด ์์ง ์๊ณ , ๊ฐ์ธ ์ ๋ณด๋ฅผ ์์ ํ๋ ๊ฒ์ด ์์ง ์ถ์ธ๊ฐ ์๋๋ฉฐ, ๊ธฐ์ ์ด ๋ธ๋ก์ฒด์ธ์์ ๋น ๋ฅธ ์๋๋ฅผ ํ์ฉํ์ง ์๋๋ค๋ ์ฌ์ค์ ๊ธฐ์ธํฉ๋๋ค. ์ฐ๋ฆฌ ํ๋ก์ ํธ์ ๋ ๋ง์ ๊ธฐ์ ์ ์ ์ฌ์ ์ด ๋ค์์ ๋ํ๋ ๊ฒ์
๋๋ค. ๋น์ ์ ๋ณผ ์.
์ถ์ฒ : habr.com