Blocknet 결제의 암호화 메모

· 읽는 데 7분

모든 Blocknet 결제에는 짧은 암호화 메모를 붙일 수 있습니다. 청구서 번호, 주문 참조 번호, 받는 사람에게 전할 메시지 등에 쓸 수 있으며, 두 사람만 읽을 수 있습니다. 이 가이드에서는 BNT를 보낼 때 메모를 넣는 방법, 누가 메모를 읽을 수 있는지, 메모가 체인에서 절대 눈에 띄지 않는 이유, 받은 메모를 확인하는 곳을 설명합니다.

Blocknet 메모란 무엇입니까?

Blocknet 메모는 모든 트랜잭션 출력에 붙는 128바이트 암호화 필드입니다. 청구서 번호나 짧은 메모처럼 직접 쓴 텍스트나 데이터를 최대 124바이트까지 담습니다. 보낸 사람과 받는 사람만 공유하는 비밀값으로 암호화되며, 빈 메모도 가득 찬 메모와 똑같아 보이도록 패딩됩니다.

메모는 트랜잭션 형식 자체의 일부입니다. 체인의 모든 출력에 메모가 있으며, 코인을 자신의 지갑으로 돌려보내는 잔돈 출력도 마찬가지입니다. 덕분에 다음 세 가지 유용한 특성이 생깁니다.

메모에는 무엇을 넣을 수 있습니까?

124바이트에 들어가는 것이라면 무엇이든 넣을 수 있습니다. 일반 텍스트는 UTF-8로 저장되므로 영어로는 글자, 숫자, 공백 124개입니다. 라틴 알파벳이 아닌 문자는 더 많은 바이트를 차지합니다. 한글이나 한자는 한 글자에 3바이트이므로 메모 하나에 약 41자가 들어갑니다.

주요 용도는 다음과 같습니다.

BNT를 보낼 때 메모는 어떻게 넣습니까?

짧은 답변

명령줄 지갑에서 금액 뒤에 메모를 입력하세요: send @rock 100 “invoice 1042”. 지갑은 확인 화면에서 수수료 옆에 메모를 보여 주고, 받는 사람을 위해 암호화한 뒤, 확인하면 결제를 보냅니다. hex: 접두사를 붙이면 원시 바이트도 보낼 수 있습니다.

지갑의 send 명령은 메모를 선택 사항인 마지막 인수로 받습니다.

send <address> <amount> [memo|hex:<memo_hex>]

메모에는 공백을 넣을 수 있고, 따옴표로 감싸는 것은 선택 사항입니다. 지갑은 텍스트를 암호화하기 전에 짝이 맞는 따옴표 한 쌍을 제거합니다. 다음은 청구서 번호를 넣어 Blocknet ID 이름으로 결제하는 예입니다.

> send @rock 100 "invoice 1042"
  Resolved @rock -> <address> ✓ verified

# Send
  Building transaction...

  Send 100 BNT to @rock?
  Fee:     <fee>
  Address: <address>
  Memo:    "invoice 1042"
  Confirm [y/N]: y

확인 단계에서 받는 사람이 읽게 될 메모를 보여 주므로, 아무것도 보내기 전에 메모를 점검할 수 있습니다. 메모가 124바이트보다 길면 지갑은 트랜잭션을 만들기 전에 memo too long: max 124 bytes를 표시하고 멈추므로, 메모를 줄여 다시 시도하면 됩니다.

원시 바이트를 보내려면 메모 앞에 hex:를 붙이세요. 지갑이 16진수를 디코딩해 그 바이트를 암호화합니다.

send @rock 100 hex:494e562d31303432

결제 링크에도 메모를 담을 수 있습니다. blocknet:// 링크나 bntpay.com 링크를 지갑에 붙여 넣으면 주소, 금액, 메모가 채워지고 확인만 하면 되므로, 결제를 받는 사람이 청구서 참조 번호를 미리 정해 둘 수 있습니다. 이름과 링크에 대한 자세한 내용은 Blocknet ID 가이드에서 볼 수 있습니다.

직접 만든 소프트웨어에서 쓰는 메모

지갑 API는 송금의 수신자마다 메모를 받습니다. POST /api/wallet/send 요청에서 각 수신자에게 일반 텍스트용 memo_text나 원시 바이트용 memo_hex를 지정하세요.

{
  "recipients": [
    { "address": "@rock", "amount": 10000000000, "memo_text": "invoice 1042" },
    { "address": "$shop", "amount": 2500000000, "memo_hex": "4f524445522d3737" }
  ]
}

여기서 금액은 원자 단위이며 1 BNT는 100,000,000 단위이므로, 예시는 100 BNT와 25 BNT를 보냅니다. 수신자마다 자신의 지갑만을 위해 암호화된 메모를 받습니다. 최대 124바이트 제한은 똑같이 적용됩니다.

Blocknet 메모는 누가 읽을 수 있습니까?

짧은 답변

보낸 사람과 받는 사람입니다. 각 메모는 두 지갑이 해당 출력에 대해 공유하는 비밀값으로 암호화되며, 이는 받는 사람의 일회용 스텔스 주소를 만드는 비밀값과 같습니다. 노드 운영자와 블록 탐색기를 포함한 다른 사람에게는 무작위처럼 보이는 128바이트 데이터만 보이며, 안에 메모가 있는지도 알 수 없습니다.

지갑은 결제를 만들 때 새로운 무작위 트랜잭션 키와 받는 사람의 공개 조회 키를 결합해 공유 비밀값을 얻습니다. 이 비밀값이 받는 사람의 일회용 스텔스 주소를 만들며, 지갑은 이를 메모 암호화에도 사용합니다. 비밀값을 트랜잭션 안에서의 출력 위치, 네트워크 식별자와 함께 SHA3-256으로 해시해 128바이트 마스크를 만들고, 이 마스크를 메모와 결합합니다. 출력마다 자체 마스크를 받으므로 같은 트랜잭션 안의 두 메모도 따로 암호화됩니다.

받는 사람의 지갑은 각 블록을 스캔하면서 비공개 조회 키로 같은 비밀값을 자기 쪽에서 계산해 냅니다. 그리고 메모를 복호화해 결제와 함께 저장합니다. 보내는 쪽에서는 지갑이 작성한 메모를 송금 내역에 보관합니다.

알아 두면 좋은 점이 두 가지 있습니다.

체인에서 모든 메모가 똑같아 보이는 이유

메모의 길이가 드러난다면 정보가 새어 나갑니다. 30바이트 메모는 100바이트 메모와 달라 보이고, 빈 메모는 둘 모두와 구별될 것입니다. Blocknet 지갑은 고정 레이아웃과 무작위 패딩으로 이 틈을 막습니다.

암호화하기 전에 지갑은 메모를 128바이트 봉투에 담습니다.

바이트 내용
1 봉투 버전
1 메모 길이
2 메모 체크섬
0~124 메모 내용
나머지 무작위 패딩

패딩은 시스템의 암호학적 난수 생성기에서 나오므로 사용하지 않은 공간을 예측할 수 없습니다. 암호화 후에는 짧은 메모, 가득 찬 메모, 빈 메모가 모두 무작위처럼 보이는 128바이트 데이터가 됩니다. 잔돈 출력에도 패딩된 빈 메모가 따로 붙으므로, 자신에게 돌려보내는 코인까지 구별되지 않습니다.

체크섬은 받는 사람의 지갑이 메모를 보여 주기 전에 올바르게 복호화했는지 확인하게 해 줍니다. 또한 노드는 메모 필드가 모두 0인 출력이 들어 있는 블록을 거부하므로, 체인의 모든 출력에는 제대로 채워진 메모가 들어 있습니다.

받은 메모를 확인하는 곳

명령줄 지갑은 결제를 나열하는 모든 곳에서 메모를 보여 줍니다.

텍스트 메모는 따옴표 안에 표시됩니다. hex:로 보낸 원시 바이트처럼 출력 가능한 텍스트가 아닌 메모는 16진수로 표시됩니다.

결제를 정산해야 할 일이 생기면 보낸 사람이 증명할 수 있습니다. 지갑의 prove <txid> 명령은 보낸 결제의 트랜잭션 키를 출력합니다. 이 키, 트랜잭션 ID, 받는 사람의 주소가 있으면 누구나 지갑 없이 POST /api/verify-proof 엔드포인트로 결제를 확인할 수 있습니다. 이 엔드포인트는 트랜잭션을 확인하고, 그 주소가 받은 출력과 금액, 메모를 보여 줍니다.

보낼 BNT 채굴하기

첫 BNT를 얻는 간단한 방법은 직접 채굴하는 것입니다. seine는 내 컴퓨터에서 실행되고, 채굴하면서 스스로 튜닝하며, bntpool.com을 통해 내 주소나 @name으로 바로 지급합니다. 채굴 가이드를 따라 하면 몇 분 안에 실행할 수 있습니다.

자주 묻는 질문

Blocknet 메모는 얼마나 길게 쓸 수 있습니까?

메모에는 최대 124바이트를 담을 수 있습니다. 일반 텍스트는 UTF-8로 저장되므로 영문 글자, 숫자, 문장 부호로는 124자이고, 한 글자에 3바이트인 한글이나 한자로는 약 41자입니다. 더 긴 메모는 지갑이 트랜잭션을 만들기 전에 막고 최대 124바이트라고 알려 줍니다.

블록 탐색기에서 Blocknet 메모를 읽을 수 있습니까?

아니요. 탐색기는 메모 필드를 암호화되었다고 표시된 128바이트 암호문으로 보여 줍니다. 키는 해당 출력에 대해 보낸 사람과 받는 사람이 공유하는 비밀값에서 나오므로 두 사람의 지갑만 열 수 있습니다. 모든 메모가 최대 크기로 패딩되므로 탐색기는 어느 출력에 메모가 들어 있는지조차 알 수 없습니다.

메모를 넣으면 Blocknet 트랜잭션이 커집니까?

아니요. 모든 출력에는 메모를 쓰든 비워 두든 128바이트 암호화 메모 필드가 이미 들어 있습니다. 메모를 추가하면 원래 있던 공간이 채워질 뿐이므로, 청구서 번호를 넣은 결제와 넣지 않은 같은 결제는 크기가 정확히 같고 체인에서도 똑같아 보입니다.

Blocknet ID 이름으로 결제할 때도 메모를 넣을 수 있습니까?

네. 주소 자리에 이름을, 금액 뒤에 메모를 넣으면 됩니다. 예: send @rock 100 "invoice 1042". 지갑이 이름을 주소로 변환해 검증된 주소, 수수료, 메모를 보여 주고 확인을 요청합니다. 메모는 그 이름이 가리키는 지갑을 위해 암호화됩니다.