λΆ„μ‚°ν˜• λ©”μ‹ μ €λŠ” λΈ”λ‘μ²΄μΈμ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λ‚˜μš”?

2017λ…„ 초, μš°λ¦¬λŠ” κΈ°μ‘΄ P2P 메신저에 λΉ„ν•΄ μž₯점을 λ…Όμ˜ν•˜λ©΄μ„œ 블둝체인 λ©”μ‹ μ €(이름과 λ§ν¬λŠ” ν”„λ‘œν•„μ— 있음)λ₯Ό λ§Œλ“€κΈ° μ‹œμž‘ν–ˆμŠ΅λ‹ˆλ‹€.

합격 2.5 μˆ˜λ…„κ°„μ˜ λ…Έλ ₯ 끝에 μš°λ¦¬λŠ” 우리의 κ°œλ…μ„ μž…μ¦ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 이제 iOS용 λ©”μ‹ μ € μ•±κ³Ό μ›Ή PWAλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€. Windows, GNU/Linuxλ§₯ OS 및 Android.

μ˜€λŠ˜μ€ 블둝체인 λ©”μ‹ μ €μ˜ μž‘λ™ 방식과 ν΄λΌμ΄μ–ΈνŠΈ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•΄λ‹Ή API와 μž‘λ™ν•˜λŠ” 방식을 μ•Œλ €λ“œλ¦¬κ² μŠ΅λ‹ˆλ‹€.
λΆ„μ‚°ν˜• λ©”μ‹ μ €λŠ” λΈ”λ‘μ²΄μΈμ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λ‚˜μš”?

μš°λ¦¬λŠ” 블둝체인이 κΈ°μ‘΄ P2P λ©”μ‹ μ €μ˜ λ³΄μ•ˆ 및 개인 정보 보호 문제λ₯Ό ν•΄κ²°ν•˜κΈ°λ₯Ό μ›ν–ˆμŠ΅λ‹ˆλ‹€.

  • ν•œ 번의 클릭으둜 계정을 λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. μ „ν™”λ‚˜ 이메일이 μ—†κ³  μ£Όμ†Œλ‘μ΄λ‚˜ 지리적 μœ„μΉ˜μ— μ•‘μ„ΈμŠ€ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • λŒ€λ‹΄μžλŠ” μ ˆλŒ€ 직접 연결을 μ„€μ •ν•˜μ§€ μ•ŠμœΌλ©° λͺ¨λ“  톡신은 λΆ„μ‚° λ…Έλ“œ μ‹œμŠ€ν…œμ„ 톡해 μ΄λ£¨μ–΄μ§‘λ‹ˆλ‹€. μ‚¬μš©μžμ˜ IP μ£Όμ†ŒλŠ” μ„œλ‘œ μ ‘κ·Όν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • λͺ¨λ“  λ©”μ‹œμ§€λŠ” end-to-end curve25519xsalsa20poly1305둜 μ•”ν˜Έν™”λ©λ‹ˆλ‹€. 이것은 λˆ„κ΅¬μ—κ²Œλ„ 놀라지 μ•Šμ„ 것 κ°™μ§€λ§Œ 우리의 μ†ŒμŠ€ μ½”λ“œλŠ” κ³΅κ°œλ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
  • MITM 곡격은 μ œμ™Έλ©λ‹ˆλ‹€. 각 λ©”μ‹œμ§€λŠ” νŠΈλžœμž­μ…˜μ΄λ©° Ed25519 EdDSA에 μ˜ν•΄ μ„œλͺ…λ©λ‹ˆλ‹€.
  • λ©”μ‹œμ§€λŠ” 자체 λΈ”λ‘μœΌλ‘œ λλ‚©λ‹ˆλ‹€. 일관성과 timestamp 블둝을 μˆ˜μ •ν•  수 μ—†μœΌλ―€λ‘œ λ©”μ‹œμ§€ μˆœμ„œλ„ μˆ˜μ •ν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • "λ‚˜λŠ” 그런 말을 ν•˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€"λŠ” λΈ”λ‘μ²΄μΈμ˜ λ©”μ‹œμ§€μ—λŠ” μ μš©λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • λ©”μ‹œμ§€μ˜ "μ§„μœ„μ„±"을 ν™•μΈν•˜λŠ” 쀑앙 κ΅¬μ‘°λŠ” μ—†μŠ΅λ‹ˆλ‹€. μ΄λŠ” ν•©μ˜μ— κΈ°λ°˜ν•œ λΆ„μ‚° λ…Έλ“œ μ‹œμŠ€ν…œμ— μ˜ν•΄ μˆ˜ν–‰λ˜λ©°, μ΄λŠ” μ‚¬μš©μžκ°€ μ†Œμœ ν•©λ‹ˆλ‹€.
  • κ²€μ—΄ λΆˆκ°€λŠ₯ - 계정을 차단할 수 μ—†μœΌλ©° λ©”μ‹œμ§€λ₯Ό μ‚­μ œν•  수 μ—†μŠ΅λ‹ˆλ‹€.
  • 블둝체인 2FAλŠ” SMSλ₯Ό ν†΅ν•œ μ§€μ˜₯ 같은 2FA의 λŒ€μ•ˆμž…λ‹ˆλ‹€. 건강을 많이 λ§μ³€μŠ΅λ‹ˆλ‹€.
  • μ–Έμ œλ“ μ§€ λͺ¨λ“  μž₯μΉ˜μ—μ„œ λͺ¨λ“  λŒ€ν™”λ₯Ό 얻을 수 μžˆλ‹€λŠ” 것은 λŒ€ν™”λ₯Ό λ‘œμ»¬μ— μ „ν˜€ μ €μž₯ν•  ν•„μš”κ°€ μ—†λ‹€λŠ” 것을 μ˜λ―Έν•©λ‹ˆλ‹€.
  • λ©”μ‹œμ§€ 전달 확인. μ‚¬μš©μžμ˜ μž₯μΉ˜κ°€ μ•„λ‹Œ λ„€νŠΈμ›Œν¬μ— λŒ€ν•œ κ²ƒμž…λ‹ˆλ‹€. 기본적으둜 μ΄λŠ” μˆ˜μ‹ μžκ°€ λ©”μ‹œμ§€λ₯Ό 읽을 수 μžˆλŠ”μ§€ ν™•μΈν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŠ” μ€‘μš”ν•œ μ•Œλ¦Όμ„ λ³΄λ‚΄λŠ” 데 μœ μš©ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€.

λΈ”λ‘μ²΄μΈμ˜ μ΄μ μ—λŠ” μ•”ν˜Έν™”νμΈ Ethereum, Dogecoin, Lisk, Dash, Bitcoin(아직 μ§„ν–‰ 쀑)과의 κΈ΄λ°€ν•œ 톡합 및 μ±„νŒ…μ—μ„œ 토큰을 보낼 수 μžˆλŠ” κΈ°λŠ₯도 ν¬ν•¨λ©λ‹ˆλ‹€. μš°λ¦¬λŠ” λ‚΄μž₯ν˜• μ•”ν˜Έν™” κ΅ν™˜κΈ°λ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

그리고 λͺ¨λ“  것이 μ–΄λ–»κ²Œ μž‘λ™ν•˜λŠ”μ§€.

λ©”μ‹œμ§€λŠ” κ±°λž˜μ΄λ‹€

λͺ¨λ“  μ‚¬λžŒμ€ 이미 λΈ”λ‘μ²΄μΈμ˜ κ±°λž˜κ°€ ν•œ μ‚¬μš©μžμ—μ„œ λ‹€λ₯Έ μ‚¬μš©μžλ‘œ 토큰(코인)을 μ „μ†‘ν•œλ‹€λŠ” 사싀에 μ΅μˆ™ν•©λ‹ˆλ‹€. λΉ„νŠΈμ½”μΈμ²˜λŸΌ. μš°λ¦¬λŠ” λ©”μ‹œμ§€ 전솑을 μœ„ν•΄ νŠΉλ³„ν•œ μœ ν˜•μ˜ νŠΈλžœμž­μ…˜μ„ λ§Œλ“€μ—ˆμŠ΅λ‹ˆλ‹€.

λΈ”λ‘μ²΄μΈμ˜ λ©”μ‹ μ €λ‘œ λ©”μ‹œμ§€λ₯Ό 보내렀면 λ‹€μŒκ³Ό 같은 λͺ‡ κ°€μ§€ 단계λ₯Ό 거쳐야 ν•©λ‹ˆλ‹€.

  1. λ©”μ‹œμ§€ ν…μŠ€νŠΈ μ•”ν˜Έν™”
  2. μ•”ν˜Έλ¬Έμ„ νŠΈλžœμž­μ…˜μ— λ„£κΈ°
  3. κ±°λž˜μ— μ„œλͺ…ν•˜μ„Έμš”
  4. λͺ¨λ“  λ„€νŠΈμ›Œν¬ λ…Έλ“œμ— νŠΈλžœμž­μ…˜ 보내기
  5. λ…Έλ“œμ˜ λΆ„μ‚° μ‹œμŠ€ν…œμ΄ λ©”μ‹œμ§€μ˜ "μ§„μœ„μ„±"을 κ²°μ •ν•©λ‹ˆλ‹€.
  6. λͺ¨λ“  것이 정상이면 λ©”μ‹œμ§€κ°€ ν¬ν•¨λœ νŠΈλžœμž­μ…˜μ΄ λ‹€μŒ 블둝에 ν¬ν•¨λ©λ‹ˆλ‹€.
  7. μˆ˜μ‹ μžλŠ” λ©”μ‹œμ§€ νŠΈλžœμž­μ…˜μ„ κ²€μƒ‰ν•˜κ³  μ•”ν˜Έλ₯Ό ν•΄λ…ν•©λ‹ˆλ‹€.

1~3단계와 7λ‹¨κ³„λŠ” ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 둜컬둜 μˆ˜ν–‰λ˜κ³  5~6λ‹¨κ³„λŠ” ν˜ΈμŠ€νŠΈμ—μ„œ μˆ˜ν–‰λ©λ‹ˆλ‹€.

λ©”μ‹œμ§€ μ•”ν˜Έν™”

λ©”μ‹œμ§€λŠ” 보낸 μ‚¬λžŒμ˜ 개인 킀와 λ°›λŠ” μ‚¬λžŒμ˜ 곡개 ν‚€λ‘œ μ•”ν˜Έν™”λ©λ‹ˆλ‹€. μš°λ¦¬λŠ” λ„€νŠΈμ›Œν¬μ—μ„œ 곡개 ν‚€λ₯Ό κ°€μ Έμ˜€μ§€λ§Œ 이λ₯Ό μœ„ν•΄μ„œλŠ” μˆ˜μ‹ μžμ˜ 계정을 μ΄ˆκΈ°ν™”ν•΄μ•Ό ν•©λ‹ˆλ‹€. 즉, 적어도 ν•˜λ‚˜μ˜ κ±°λž˜κ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. REST μš”μ²­μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ GET /api/accounts/getPublicKey?address={ADAMANT address}, μ±„νŒ…μ„ λ‘œλ“œν•  λ•Œ λŒ€ν™” μƒλŒ€μ˜ 곡개 ν‚€λ₯Ό 이미 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λΆ„μ‚°ν˜• λ©”μ‹ μ €λŠ” λΈ”λ‘μ²΄μΈμ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λ‚˜μš”?

λ©”μ‹ μ €λŠ” curve25519xsalsa20poly1305 μ•Œκ³ λ¦¬μ¦˜μ„ μ‚¬μš©ν•˜μ—¬ λ©”μ‹œμ§€λ₯Ό μ•”ν˜Έν™”ν•©λ‹ˆλ‹€(NaCl μƒμž). 계정에 Ed25519 ν‚€κ°€ ν¬ν•¨λ˜μ–΄ μžˆμœΌλ―€λ‘œ μƒμžλ₯Ό ν˜•μ„±ν•˜λ €λ©΄ λ¨Όμ € ν‚€λ₯Ό Curve25519 Diffie-Hellman으둜 λ³€ν™˜ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ‹€μŒμ€ 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으둜 νŠΈλžœμž­μ…˜μ„ ν•΄μ‹œν•œ λ‹€μŒ μ„œλͺ…ν•˜λŠ” 것을 λ³΄μ—¬μ€λ‹ˆλ‹€. Ed25519 EdDSA 그리고 사인을 λ°›μ•„ 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μ—μ„œ λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. μœ νš¨μ„± 검사기.js ΠΈ verify.js. λ„€, λ…Έλ“œλŠ” Node.jsμ—μ„œ μ‹€ν–‰λ©λ‹ˆλ‹€.

블둝에 λ©”μ‹œμ§€κ°€ ν¬ν•¨λœ νŠΈλžœμž­μ…˜ 포함

ν•©μ˜μ— λ„λ‹¬ν•˜λ©΄ λ©”μ‹œμ§€κ°€ ν¬ν•¨λœ νŠΈλžœμž­μ…˜μ΄ λ‹€λ₯Έ μœ νš¨ν•œ νŠΈλžœμž­μ…˜κ³Ό ν•¨κ»˜ λ‹€μŒ 블둝에 ν¬ν•¨λ©λ‹ˆλ‹€.

블둝은 μ—„κ²©ν•œ μˆœμ„œλ₯Ό κ°€μ§€λ©°, 각 후속 블둝은 이전 λΈ”λ‘μ˜ ν•΄μ‹œλ₯Ό 기반으둜 ν˜•μ„±λ©λ‹ˆλ‹€.

λΆ„μ‚°ν˜• λ©”μ‹ μ €λŠ” λΈ”λ‘μ²΄μΈμ—μ„œ μ–΄λ–»κ²Œ μž‘λ™ν•˜λ‚˜μš”?

μš”μ μ€ 우리의 λ©”μ‹œμ§€λ„ 이 μˆœμ„œμ— ν¬ν•¨λ˜μ–΄ 있으며 "μž¬λ°°μ—΄"될 수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. μ—¬λŸ¬ λ©”μ‹œμ§€κ°€ ν•˜λ‚˜μ˜ 블둝에 μ†ν•˜λŠ” 경우 μˆœμ„œλŠ” λ‹€μŒκ³Ό 같이 κ²°μ •λ©λ‹ˆλ‹€. 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λŠ” μ•„λ‹ˆμ§€λ§Œ NaCl λΉ„λ°€ μƒμž. 이것이 λ©”μ‹ μ €κ°€ λ‹€λ₯Έ 데이터λ₯Ό μ €μž₯ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€.

파일/이미지 전솑 및 κ·Έλ£Ή μ±„νŒ…μ—λŠ” μ—¬μ „νžˆ λ§Žμ€ μž‘μ—…μ΄ ν•„μš”ν•©λ‹ˆλ‹€. λ¬Όλ‘ , μ‹€μˆ˜μ™€ μ‹€μˆ˜ ν˜•μ‹μ—μ„œλŠ” 이것이 λΉ λ₯΄κ²Œ "λ§κ°€μ§ˆ" 수 μžˆμ§€λ§Œ, μš°λ¦¬λŠ” λ™μΌν•œ μˆ˜μ€€μ˜ 개인 정보 보호λ₯Ό μœ μ§€ν•˜κ³  μ‹ΆμŠ΅λ‹ˆλ‹€.

예, 아직 ν•΄μ•Ό ν•  일이 μžˆμŠ΅λ‹ˆλ‹€. μ΄μƒμ μœΌλ‘œλŠ” μ‹€μ œ 개인 정보 λ³΄ν˜ΈλŠ” μ‚¬μš©μžκ°€ 곡용 λ„€νŠΈμ›Œν¬ λ…Έλ“œμ— μ—°κ²°ν•˜μ§€ μ•Šκ³  슀슀둜 λ…Έλ“œλ₯Ό 생성할 것이라고 κ°€μ •ν•©λ‹ˆλ‹€. λͺ‡ νΌμ„ΌνŠΈμ˜ μ‚¬μš©μžκ°€ 이 μž‘μ—…μ„ μˆ˜ν–‰ν•œλ‹€κ³  μƒκ°ν•˜μ‹œλ‚˜μš”? λ§žμŠ΅λ‹ˆλ‹€, 0. μ €ν¬λŠ” Tor λ²„μ „μ˜ λ©”μ‹ μ €λ‘œ 이 문제λ₯Ό λΆ€λΆ„μ μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

μš°λ¦¬λŠ” 블둝체인에 λ©”μ‹ μ €κ°€ μ‘΄μž¬ν•  수 μžˆλ‹€λŠ” 것을 증λͺ…ν–ˆμŠ΅λ‹ˆλ‹€. μ΄μ „μ—λŠ” 2012년에 단 ν•œ 번의 μ‹œλ„λ§Œ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. λΉ„νŠΈ λ©”μ‹œμ§€, κΈ΄ λ©”μ‹œμ§€ 전달 μ‹œκ°„, CPU λΆ€ν•˜, λͺ¨λ°”일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ λΆ€μ‘±μœΌλ‘œ 인해 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.

그리고 νšŒμ˜λ‘ μ€ λΈ”λ‘μ²΄μΈμ˜ λ©”μ‹ μ €κ°€ μ‹œλŒ€λ₯Ό μ•žμ„œ μžˆλ‹€λŠ” 사싀에 κΈ°μΈν•©λ‹ˆλ‹€. μ‚¬λžŒλ“€μ€ μžμ‹ μ˜ 계정에 λŒ€ν•΄ μ±…μž„μ„ 질 μ€€λΉ„κ°€ λ˜μ–΄ μžˆμ§€ μ•Šκ³ , 개인 정보λ₯Ό μ†Œμœ ν•˜λŠ” 것이 아직 μΆ”μ„Έκ°€ μ•„λ‹ˆλ©°, 기술이 λΈ”λ‘μ²΄μΈμ—μ„œ λΉ λ₯Έ 속도λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠλŠ”λ‹€λŠ” 사싀에 κΈ°μΈν•©λ‹ˆλ‹€. 우리 ν”„λ‘œμ νŠΈμ˜ 더 λ§Žμ€ 기술적 μœ μ‚¬μ μ΄ λ‹€μŒμ— λ‚˜νƒ€λ‚  κ²ƒμž…λ‹ˆλ‹€. 당신은 λ³Ό 수.

좜처 : habr.com

DDoS 보호, VPS VDS μ„œλ²„κ°€ μžˆλŠ” μ‚¬μ΄νŠΈλ₯Ό μœ„ν•œ μ•ˆμ •μ μΈ ν˜ΈμŠ€νŒ… κ΅¬μž… πŸ”₯ DDoS 곡격 λ°©μ§€ κΈ°λŠ₯이 νƒ‘μž¬λœ μ•ˆμ •μ μΈ μ›Ήμ‚¬μ΄νŠΈ ν˜ΈμŠ€νŒ…, VPS 및 VDS μ„œλ²„λ₯Ό κ΅¬λ§€ν•˜μ„Έμš” | ProHoster