Scikit Web

Solana sign and verify messages with wallets - 솔라나 지갑 정보로 메세지 사인 본문

NFT/Solana(솔라나)

Solana sign and verify messages with wallets - 솔라나 지갑 정보로 메세지 사인

Keun0 2022. 6. 21. 21:56
728x90
반응형

솔라나에서 메세지를 tweetnacl 이라는 라이브러리를 이용하여 encode, decode 를 하고 있다.

 

솔라나가.. cookbook 에서 알려주는 예제 하고.. 메타플렉스 개발문서에서 알려주는 것 하고 차이가 좀 있어서..

 

문서 2개를 다 같이 확인해야 한다.. 관련 예제가 솔라나 쿡북, 메타플렉스 개발문서 둘 다 있었으나.. 사용하기 더 쉽고 좋아보이는 cookbook 예제를 사용하여 예제를 만들었다.

 

cookbook 예제와 다른점은 메세지를 JSON Object로 사용하는 것과 signature 의 경우 Uint8Array 형태로 주는 결과를

encodeBase64를 이용하여 보기 좋게 변경한 것이다.

 

import { Keypair } from "@solana/web3.js";
import nacl from "tweetnacl";
import { decodeBase64, decodeUTF8, encodeBase64 } from "tweetnacl-util";

async function main() {
  (async () => {
    const keypair = Keypair.fromSecretKey(
      Uint8Array.from([
        174, 47, 154, 16, 202, 193, 206, 113, 199, 190, 53, 133, 169, 175, 31,
        56, 222, 53, 138, 189, 224, 216, 117, 173, 10, 149, 53, 45, 73, 251,
        237, 246, 15, 185, 186, 82, 177, 240, 148, 69, 241, 227, 167, 80, 141,
        89, 240, 121, 121, 35, 172, 247, 68, 251, 226, 218, 48, 63, 176, 109,
        168, 89, 238, 135,
      ])
    );

    const message = JSON.stringify({
      publicKey: "hello world",
      message: "hello",
    });
    const messageBytes = decodeUTF8(message);

    const signature = nacl.sign.detached(messageBytes, keypair.secretKey);
    console.log("signature ", encodeBase64(signature));
    const result = nacl.sign.detached.verify(
      messageBytes,
      signature,
      keypair.publicKey.toBytes()
    );

    console.log(result);
  })();
}

// We recommend this pattern to be able to use async/await everywhere
// and properly handle errors.
main().catch((error) => {
  console.error(error);
  process.exitCode = 1;
});
728x90
반응형
Comments