예제

Token/Wallet/Block API를 사용한 예제를 보여줍니다.

모든 API는 HTTP POST 방식을 사용하여 JSON 데이터를 주고 받습니다.

계좌

계좌 생성하기

사용자는 은행에서 돈을 넣기 위해서 본인의 계좌가 필요하듯이 토큰을 저장하기 위한 계좌를 먼저 생성해야 합니다. 계좌를 생성하려면 다음과 같이 실행합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "createAddress",
    "params": {
        "addInfo": "My first address"
    }
}
  • "jsonrpc"는 반드시 "2.0"이어야 합니다.

  • "id"는 클라이언트에서 생성하는 구분자이며 반드시 스트링이어야 합니다.

  • "method"는 실행할 명령입니다. 계좌를 생성하기 위해서는 "createAddress"를 사용합니다.

  • "params"에는 명령을 실행할 때 필요한 인자를 저장합니다. 계좌를 생성할 때는 "addInfo" 인자가 필요합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "1234",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
            "mnemonic": "miracle anchor zebra brush talent broom pig broom news hammer suit brick",
            "secretKey": "d0c48b4d6972bf8d4110f81d5dd8ac1c"
        }
    }
}
  • "id"는 요청했을 때 값과 동일합니다.

  • 계좌 "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64"이 생성되었습니다.

  • "mnemonic"은 계좌의 비밀키를 복구할 때 사용하는 키워드 목록입니다. 사용자는 menemonic을 어딘가 메모해 두어야 합니다.

계좌가 생성되었는지 확인하려면,

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "1235",
    "method": "getAddressInfo",
    "params": {
        "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "1235",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
            "addInfo": "My first address"
        }
    }
}

ERC20

ERC20 토큰 이체

각 토큰은 contract address로 구분합니다. 토큰 생성은 클라이언트에서 처리하지 않고 서버에서만 처리합니다. 다음 토큰이 이미 정의되어 있습니다.

토큰 이체는 4단계로 진행됩니다.

첫째, 안전한 이체를 위한 임시키를 발급받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "transfer"
    }
}
  • "address"는 사용자 계정입니다.

  • "keyType"은 반드시 "transfer" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "1234",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "c3b915aba82d31aa7f505739ee323db0"
        }
    }
}
  • "tempKey"를 발급받았습니다.

둘째, 메시지를 서명을 받아야 합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "signData",
    "params": {
        "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
        "data": "0ef6b88023386ac2691ebc50e6ab8c651326524ac7932b2c88c8349cc0b5d21f",
        "tempKey": "c3b915aba82d31aa7f505739ee323db0",
        "hashKey": "5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619"
    }
}
  • "address"는 사용자 계정입니다.

  • "tempKey"는 이전 단계에서 받은 임시키입니다.

  • "hashKey"는 임시키와 계좌의 비밀키로 생성되는 해시값입니다. 예를 들어, hash(['c3b915aba82d31aa7f505739ee323db0', 'd0c48b4d6972bf8d4110f81d5dd8ac1c']) => '5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619'. 해시 함수는 dart로 다음과 같이 구현할 수 있습니다. 이 함수는 반복적으로 사용될 것입니다.

/// Dart
import 'package:crypto/crypto.dart';
String hash(List<String> v) => sha256.convert(utf8.encode(v.join('|'))).toString();
  • "data"는 토큰 contract address, 사용자 계좌, 수신자 계좌, 금액, 임시키, 해시를 사용해서 만든 해시 값 입니다. 예를 들어, hash(['0x1a007ca3d881c14269f956c6e4b734095bf450a7', '0x841dd0a424ba0ab63950a4c8ad11b33f34deac64', '0x191f06333602d2f5296e1aa83e3166454032adab', "1", "c3b915aba82d31aa7f505739ee323db0", "5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619"]) => '0ef6b88023386ac2691ebc50e6ab8c651326524ac7932b2c88c8349cc0b5d21f'

Response:

{
    "jsonrpc": "2.0",
    "id": "1234",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "304502203ee4b7410b058c718ae52423cde25f4df68b4ce49255c4a6f34ae368c3f0a3690221009332445fcb1717588063a098882bc6ff17e887b76f6fac46ca0cfdec0e1e2595"
        }
    }
}
  • "signedData"는 메시지 서명입니다.

셋째, 이체합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "1234",
    "method": "erc20_transfer",
    "params": {
        "contractAddress": "0x1a007ca3d881c14269f956c6e4b734095bf450a7",
        "sender": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
        "toAddress": "0x191f06333602d2f5296e1aa83e3166454032adab",
        "amount": "1",
        "tempKey": "c3b915aba82d31aa7f505739ee323db0",
        "hashKey": "5df34c6abc72e6d96e4499f6b1999e43c146a43000813eb7154c87c1eb3dc619",
        "signature": "3044022036d634a588a4582539465d8c4849303ed5acee11ba6e3772649ba6e442c1d25c022016902d4dd83bcedca25ef7e4e530d19f08afba77a1c2d10fe25d225ae2eb7f79",
        "comment": "Transfer"
    }
}
  • "signature"는 이전 단계에서 생성된 메시지 서명입니다.

  • "comment"는 메모로 서명 시 포함되지 않습니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "57096",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0x50d0b07cd332b08b15ec071c9bf00cd6b926f43b2ffd1bc62e7f3254033e94ee"
        }
    }
}
  • "transactionId" 를 받습니다.

넷째, 토큰 이체가 블록체인에 쓰여지는데 시간이 걸립니다. 완료될 때까지 기다려야 합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "57266",
    "method": "net_getTransactionStatus",
    "params": {
        "transactionId": "0x50d0b07cd332b08b15ec071c9bf00cd6b926f43b2ffd1bc62e7f3254033e94ee"
    }
j

Response:

{
    "jsonrpc": "2.0",
    "id": "57266",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": -1,
            "revertReason": ""
        }
    }
}

또는

{
    "jsonrpc": "2.0",
    "id": "59336",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}
  • "status"가 -1은 아직 진행 중이란 의미입니다. 완료가 되면 0이나 1을 돌려줍니다. 1은 성공, 0은 에러가 발생한 경우입니다.

주기적으로 net_getTransactionStatus를 호출하여 status가 -1이 아닐 때까지, 즉 완료될 때가지 기다립니다.

ERC20 잔액 구하기

특정 계좌의 특정 토큰의 잔액을 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "37026",
    "method": "erc20_getBalance",
    "params": {
        "contractAddress": "0x1a007ca3d881c14269f956c6e4b734095bf450a7"
        "address": "0x841dd0a424ba0ab63950a4c8ad11b33f34deac64",
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "37026",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "balance": "99"
        }
    }
}

ERC721 (NFT)

ERC721 (NFT) 토큰 이체하기

ERC721 토큰의 생성, mint, 이체는 서버에서 관리됩니다. 클라이언트는 오직 토큰 권한을 서버로 승인해 주는 역할만 합니다. 다음의 토큰이 이미 정의되어 있습니다.

서버를 통해 NFT를 mint 할 경우 (별도의 api 제공됨) 사용자는 contract address와 토큰 ID를 돌려받게 됩니다.

NFT 마켓에 상품을 올리기 위해서는 상품 소유자는 소유권 관리를 마켓에서 처리할 수 있도록 승인을 해 주어야 합니다. 승인 처리는 이체와 유사하게 동작합니다.

첫째, 임시키를 발급받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "53494",
    "method": "net_getTempKey",
    "params": {
        "address": "0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9",
        "keyType": "approve"
    }
}
  • 계좌는 사용자의 NFT가 저장된 계좌입니다.

  • "keyType"은 항상 "approve" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "53494",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "ae1b64e6a1a29d9b91ef7515dfe74c4d"
        }
    }
}

둘째, 메시지 서명을 생성합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "54079",
    "method": "signData",
    "params": {
        "hashKey": "02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11",
        "address": "0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9",
        "data": "5b69d60a7fec498b9f3d24ef06b4cb323c7d0606e4606edad19065c3c024f578",
        "tempKey": "ae1b64e6a1a29d9b91ef7515dfe74c4d"
    }
}
  • "hashKey"는 임시키와 계좌 비밀키의 해시 값입니다. 예를 들어, hash(['ae1b64e6a1a29d9b91ef7515dfe74c4d', 'b5dc981ece0925ecf56e490727bce577']) => '02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11'. "b5dc981ece0925ecf56e490727bce577"는 계좌의 비밀키입니다.

  • "data"는 contract address, 계좌 주소, 마켓의 계좌 주소, 토큰 ID, 임시키, 해시키를 가지고 해시 값을 구합니다. 예를 들어, hash(['0xa408c647676f01c1463174019ddacdc49837097b', '0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9', '0x6a39630bd5986e73fe181938c6097958127c16c4', "2", "ae1b64e6a1a29d9b91ef7515dfe74c4d", "02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11"]) => '5b69d60a7fec498b9f3d24ef06b4cb323c7d0606e4606edad19065c3c024f578'. "0x6a39630bd5986e73fe181938c6097958127c16c4" is the market address.

Response:

{
    "jsonrpc": "2.0",
    "id": "54079",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3046022100c21b658831e1d8955fd92fb937c0c5d39ceb2f72522a0667fdff685764920478022100fa38a36d9e2b6cac80e39723ac79af4386ad466e1afd019a50149588c3a78de2"
        }
    }
}

셋째, NFT 마켓에 상품 권한을 위임합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "54157",
    "method": "erc721_approve",
    "params": {
        "hashKey": "02d8168679b03d74902159e2e1782d2a0644408acb01791023c858dc8788df11",
        "tokenId": "2",
        "sender": "0xd839a7e8872a2624fc9d84eee63bb1eca8ee9be9",
        "spender": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "signature": "3046022100c21b658831e1d8955fd92fb937c0c5d39ceb2f72522a0667fdff685764920478022100fa38a36d9e2b6cac80e39723ac79af4386ad466e1afd019a50149588c3a78de2",
        "contractAddress": "0xa408c647676f01c1463174019ddacdc49837097b",
        "comment": "Put on the market",
        "tempKey": "ae1b64e6a1a29d9b91ef7515dfe74c4d"
    }
}
  • "sender"는 NFT가 저장된 계좌주소입니다.

  • "spender" 는 마켓의 계좌 주소입니.

Response:

{
    "jsonrpc": "2.0",
    "id": "54157",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xf9348011be7423261ca2c74208f876a1a4a3cd6dcd3038414a131bd247d6b783"
        }
    }
}

넷재, 완료될 때까지 기다립니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "54238",
    "method": "net_getTransactionStatus",
    "params": {
        "transactionId": "0xf9348011be7423261ca2c74208f876a1a4a3cd6dcd3038414a131bd247d6b783"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "56316",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}
  • -1은 현재 진행 중이란 의미입니다. 0나 1이 응답될 때까지 기다려야 합니다.

Swap

Swap 목록 구하기

Swap 가능한 목록을 구하기 위해서는 swap_getPairList를 호출해야 합니다. swap 목록은 서버에서 관리됩니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0"
    "id": "85551",
    "method": "swap_getPairList",
}

Response:

{
    "jsonrpc": "2.0",
    "id": "85551",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": [
            {
                "pairAddress": "0x294e47341f7da34a6d8187ecbc4ff206d6ca212f",
                "token0": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
                "token1": "0x4883c1d966d103485f97f548a0cb1fb117388af0",
                "symbol0": "TOK1",
                "symbol1": "TOK2",
                "amount0": "1",
                "amount1": "10"
            }
        ]
    }
}
  • TOK1과 TOK2 간에 swap이 가능합니다.

Swap 시 예상 금액 구하기

Swap 후 예상되는 금액을 구할 수 있습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "86197",
    "method": "swap_getAmountOut",
    "params": {
        "tokenIn": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
        "tokenOut": "0x4883c1d966d103485f97f548a0cb1fb117388af0",
        "amountIn": "0.1",
        "sender": "0x6a39630bd5986e73fe181938c6097958127c16c4"
    }
}
  • "tokenIn"와 "tokenOut"은 토큰 contract address입니다.

  • "tokenIn" 토큰 "amountIn" 금액을 "tokenOut" 토큰으로 전환하려고 합니다.

  • "sender"는 "tokenIn"을 저장하고 있는 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "86197",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "amountIn": "0.1",
            "amountOut": "0.405288228265375695"
        }
    }
}
  • "tokenOut" 토큰 0.405288228265375695을 받을 수 있습니다.

토큰 Swap

토큰을 swap 하려면 2단계로 진행됩니다.

첫째, 토큰 금액을 서버에서 처리할 수 있도록 승인해 줘야 합니다.

첫째, 임시 키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "86255",
    "method": "net_getTempKey",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "keyType": "approve"
    }
}
  • "address"는 당신의 계좌입니다.

  • "keyType"은 "approve"입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "86255",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "b215f78617e0e5559042971c8e284133"
        }
    }
}

둘째, 메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "86287",
    "method": "signData",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "tempKey": "b215f78617e0e5559042971c8e284133",
        "hashKey": "33f82dc02a98428690b41820970bfeefff7294fcb432408ed8ad924baf874fe1",
        "data": "d62cd64946e2522dc7963a7bcabf5d927998bbeea10d96732b79aa793ecf9b8a"
    }
}
  • "hashKey"는 hash(temp key, your address's secret key) 입니다.

  • "data"는 hash(tokenIn contract address, your address, amount, "tempKey", "hashKey") 입니다.

Resonse:

{
    "jsonrpc": "2.0",
    "id": "86287",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "304602210088ae728b0bc33b7416d73c4b4e04be59bf9da45ad1037799f1b7e4b49a1a16a4022100da66160775e9a99dbd8e02aae98ad7b0eb45a0c0ab55c9fbe6d604c320a0aa31"
        }
    }
}

토큰 금액을 승인합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "86354",
    "method": "swap_approve",
    "params": {
        "contractAddress": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
        "sender": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "amount": "0.1",
        "comment": "Approve to swap",
        "tempKey": "b215f78617e0e5559042971c8e284133",
        "hashKey": "33f82dc02a98428690b41820970bfeefff7294fcb432408ed8ad924baf874fe1",
        "signature": "304602210088ae728b0bc33b7416d73c4b4e04be59bf9da45ad1037799f1b7e4b49a1a16a4022100da66160775e9a99dbd8e02aae98ad7b0eb45a0c0ab55c9fbe6d604c320a0aa31"
    }
}
  • "contractAddress"는 토큰 contract address입니다.

  • "sender" 는 사용 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "86354",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0x0a32339b56022e31aa1f3a5162d4e4a581a3d28505ac7c84b05fdd5c347bb61f"
        }
    }
}

끝날 때까지 기다립니다.

Request: https://test-api.protx.io/token

{
    "method": "net_getTransactionStatus",
    "id": "86420",
    "jsonrpc": "2.0",
    "params": {
        "transactionId": "0x0a32339b56022e31aa1f3a5162d4e4a581a3d28505ac7c84b05fdd5c347bb61f"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "89531",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}

둘째, 토큰을 swap합니다.

임시키를 발급받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "89561",
    "method": "net_getTempKey",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "keyType": "swap"
    }
}
  • "address"는 사용자 계정입니다.

  • "keyType"은 "swap"이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "89561",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "57a2b588f8b9634f53a322cdf1edfb05"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "89597",
    "method": "signData",
    "params": {
        "address": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "hashKey": "829f93bc755e5928a13edb69d9bf81130db4f6d4637c59c2aa9923af9ac1a93e",
        "tempKey": "57a2b588f8b9634f53a322cdf1edfb05",
        "data": "0758e1bd89b0cb38b38ca6f74e601a3eb258f33eeedcf0ba3531c1d624f6968a"
    }
}
  • "hashKey"는 hash(temp key, your address's secret key) 입니다.

  • "data"는 hash(tokenIn amount, tokenOut amount, tokenIn contract address, your address, "tempKey", "hashKey") 입니다.

Resonse:

{
    "jsonrpc": "2.0",
    "id": "89597",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3045022100946bd7860fe667b247692d50449135864428c17e0d50e42175a8b701ac8ed11702205a69e0f03684842906aed52b1c030dc686030806926ad1a7c3aa3c80291c37ff"
        }
    }
}

토큰을 swap 합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "89626",
    "method": "swap_tokenToToken",
    "params": {
        "amountIn": "0.1",
        "tokenIn": "0x0d183c9a4d9b2c503c049ffc687436b35c31ea3a",
        "tokenOut": "0x4883c1d966d103485f97f548a0cb1fb117388af0",
        "sender": "0x6a39630bd5986e73fe181938c6097958127c16c4",
        "comment": "Swap",
        "tempKey": "57a2b588f8b9634f53a322cdf1edfb05",
        "hashKey": "829f93bc755e5928a13edb69d9bf81130db4f6d4637c59c2aa9923af9ac1a93e",
        "signature": "3045022100946bd7860fe667b247692d50449135864428c17e0d50e42175a8b701ac8ed11702205a69e0f03684842906aed52b1c030dc686030806926ad1a7c3aa3c80291c37ff"
    }
}
  • "tokenIn", "tokenOut"은 토큰 contract address 입니다.

  • "sender"는 사용자 계정입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "89626",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xc0a11b0b743d060672f00bb7c8386af252d793162b6aee233109c2daaf054173"
        }
    }
}

완료될 때까지 기다립니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "91789",
    "method": "net_getTransactionStatus",
    "params": {
        "transactionId": "0xc0a11b0b743d060672f00bb7c8386af252d793162b6aee233109c2daaf054173"
    }
}

Response:

{
    "jsonrpc": "2.0",
    "id": "91789",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "status": 1,
            "revertReason": ""
        }
    }
}

Staking

Staking 목록 구하기

Request: https://test-api.protx.io/block

{
    "jsonrpc": "2.0",
    "id": "55900",
    "method": "getStakingV1List",
    "params": {
        "pageNumber": 1,
        "pageSize": 10,
        "order": 1,
        "stakingTimeFilter": 1666000700819,
    }
}
  • "order"가 1이면 오름차순, 그렇지 않으면 내림차순.

  • "stakingTimeFilter"에 timestamp를 지정하면 해당 timestamp 시점에 유효한 staking 목록만을 구할 수 있습니다.

/// In dart
var stakingTimeFilter = DateTime.now().millisecondsSinceEpoch;

Response:

{
    "jsonrpc": "2.0",
    "id": "55900",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "pageNumber": 1,
            "pageSize": 10,
            "totalPages": 1,
            "totalElements": 1,
            "list": [
                {
                    "contractAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
                    "owner": "0x5f619702528e9de7f5a4a233cd1896902385e705",
                    "stakingToken": "0x5f748cff221bf63bdadf33cd2678093930e7fb2a",
                    "rewardToken": "0x3ff720bf49f69a61fd2c9a19a5b9a33ed5a59555",
                    "rewardRate": 100,
                    "limitStakingTime": 1666427295713,
                    "limitRewardTime": 1666427295713,
                    "txId": "0x81c0ae9709ea292d4546adb991fe13be4d06f3190c35641e9870e9adea493150",
                    "blockNumber": 3621918,
                    "txTime": "2022-10-17T17:28:38"
                }
            ]
        }
    }
}
  • "contractAddress"는 staking을 나타내는 contract address 입니다. 이후 우리는 이 contract address는 "stakingAddress"라고 지칭하겠습니다.

  • "stackingToken"와 "rewardToken"은 토큰 contract addresses. UI에서는 이에 대응하는 토큰 심볼을 보여주도록 합니다.

  • "limitStakingtime"와 "limitRewardTime"은 1970년 1월 1일 UTC에서부터 시작한 초 시간입니다.

  • "rewardRate"는 초당 이자입니다. 단위는 0.0000000000000000001 입니다.

Staking 시작

첫째, staking을 하기 위해서는 사용자가 가진 토큰을 시스템에서 사용할 수 있도록 승인을 해 줘야 합니다..

임시키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "10029",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "approve"
    }
}
  • "keyType"은 "approve" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "10029",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "a694f888d7e45aea7773948de35437ef"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "10722",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "a694f888d7e45aea7773948de35437ef",
        "hashKey": "4a935c6b118b3e1a432147d88f7bd29fce5c976fd02c28870274664d10c6167d",
        "data": "57a4ad402f7abc6f93bfafd5623ac68545df82e12686d9adb6b11e1e0d9cf4cf"
    }
}
  • "hashKey"는 hash(temp key, your address's secret key) 입니다.

  • "data"는s hash(contract address of the token to be entrusted to the staking address, your address, staking address, amount, "tempKey", "hashKey") 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "10722",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "304402205007a96f671808d1c09daad726621be5fac7e04e83d75abace1aa7301677d9bc022046c43cf4853a7f38dce3345a7a132a3b73c3a4aa05b656003d583af5af166de0"
        }
    }
}

Staking 계좌에 승인합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "10788",
    "method": "erc20_approve",
    "params": {
        "contractAddress": "0x5f748cff221bf63bdadf33cd2678093930e7fb2a",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "spender": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "amount": "1",
        "comment": "Approve",
        "tempKey": "a694f888d7e45aea7773948de35437ef",
        "hashKey": "4a935c6b118b3e1a432147d88f7bd29fce5c976fd02c28870274664d10c6167d",
        "signature": "304402205007a96f671808d1c09daad726621be5fac7e04e83d75abace1aa7301677d9bc022046c43cf4853a7f38dce3345a7a132a3b73c3a4aa05b656003d583af5af166de0"
    }
}
  • "contractAddress"는 staking contract address 입니다..

  • "sender"는 사용자 계좌입니다.

  • "spender"는 staking 계좌입니다..

  • "amount"는 staking 계좌에 맡길 금액입니다. 이 금액은 현재 사용자가 가진 금액보다 클 수는 없습니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "10788",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xecc5fc9aba68fe4c04964505213359d6c9edd5cc5d471f2caca94cbfec1c274a"
        }
    }
}

완료될 때까지 기다립니다.

둘째, staking을 시작합니다.

임시키를 발급받습니다.

Request: https://test-api.protx.io/token ****

{
    "jsonrpc": "2.0",
    "id": "95866",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "stake"
    }
}
  • "keyType"은 "stake" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "95866",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "52f6f4b228b38b0602e659ceee45e784"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "96450",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "52f6f4b228b38b0602e659ceee45e784",
        "hashKey": "2c6219ee0ba6889bca7767ad686fedc12a48d364590ad3c14e34574ac18ce23e",
        "data": "ed3747837d66d5f003548abdea104b2a81170b68a859080ec440054d5366f989"
    }
}
  • "hashKey"는 hash(temp key, address's secret key) 입니다.

  • "dataKey"는 hash(staking address, your address, amount, "tempKey", "hashKey") 입니.

Response:

{
    "jsonrpc": "2.0",
    "id": "96450",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3045022100bd4a0fefdde88497f67271eaa9c828b139e1a5df3845faf2d7bea70f381123e40220668a2bfcee0a160b74ea975e57529f826cb7d59ce284232383506152a9212575"
        }
    }
}

Staking을 시작합니다.

Request: https://test-api.protx.io/token****

{
    "jsonrpc": "2.0",
    "id": "24225",
    "method": "stakingV1_stake",
    "params": {
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "amount": "1",
        "comment": "Stake",
        "tempKey": "52f6f4b228b38b0602e659ceee45e784",
        "hashKey": "2c6219ee0ba6889bca7767ad686fedc12a48d364590ad3c14e34574ac18ce23e",
        "signature": "3045022100bd4a0fefdde88497f67271eaa9c828b139e1a5df3845faf2d7bea70f381123e40220668a2bfcee0a160b74ea975e57529f826cb7d59ce284232383506152a9212575"
    }
}
  • "stakingAddress"는 staking contract address 입니다.

  • "sender"는 사용자 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "24225",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xe559e76068b177747a512c0fa82800cc184c76f57603a9ffd7768e50383146e8"
        }
    }
}

net_getTransactionStatus을 사용하여 완료될때까지 기다립니다.

현재 staking 상태 구하기

Staking 계좌에 맡겨진 금액을 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "36392",
    "method": "stakingV1_getStaked",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920"
    }
}
  • "stakingAddress"는 staking address 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36392",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "balance": "1"
        }
    }
}

지금까지 쌓 적립금을 확인할 수 있습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "36465",
    "method": "stakingV1_getEarned",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920"
    }
}
  • "stakingAddress"는 staking 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36465",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "balance": "0.0000000000000012"
        }
    }
}
  • 받을 수 있는 적립금은 0.0000000000000012 입니다.

인출

첫째, 해지는 staking 계좌에 맡겨놓은 금액을 인출합니다.

임시키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "36492",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "withdraw"
    }
}
  • "keyType"는 "withdraw" 이어야 합니다.

Response:

{
    "resultCode": "200",
    "resultMessage": "Success",
    "resultData": {
        "tempKey": "464317e9051c036bae5d55879420ec59"
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet

{
    "jsonrpc": "2.0",
    "id": "36525",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "464317e9051c036bae5d55879420ec59",
        "hashKey": "17c48c9425c19bcb659f943921f7ec150e10f85bb0ff2e733c438560c5f74898",
        "data": "ba2c07102047695df0c352d1a43bc277ed88ac27b5eafcdb2c027c13c9df475e"
    }
}
  • "tempKey"는 hash(temp key, address's secret key) 입니다.

  • "data"는 hash(staking address, your address, amount, "tempKey", "hashKey") 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36525",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "3046022100c52683d4b2318a1380f002da07de67e0fc3d8bcb6e39ccc15b29b1df533c68af022100ef3fcd0c1d11614e06c77f280202f0fc87c1dff8be5ef499a85b8c4256398895"
        }
    }
}

금액을 인출합니다.

Request: https://test-api.protx.io/token****

{
    "method": "stakingV1_withdraw",
    "id": "36552",
    "jsonrpc": "2.0",
    "params": {
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "amount": "1",
        "comment": "Withdraw",
        "tempKey": "464317e9051c036bae5d55879420ec59",
        "hashKey": "17c48c9425c19bcb659f943921f7ec150e10f85bb0ff2e733c438560c5f74898",
        "signature": "3046022100c52683d4b2318a1380f002da07de67e0fc3d8bcb6e39ccc15b29b1df533c68af022100ef3fcd0c1d11614e06c77f280202f0fc87c1dff8be5ef499a85b8c4256398895"
    }
}
  • "stakingAddress"는 staking contract address 입니다.

  • "sender"는 사용자 계좌 주소입니다.

  • "amount"는 staking 계좌에 맡긴 금액입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "36552",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0xc9920e01b32f7bc52a12c6342d2b8f8ad39ec72d9c0728a57552e0ca8857c8b9"
        }
    }
}

완료될 때까지 기다립니다.

둘째, 적립금을 받습니다.

임시키를 구합니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "38723",
    "method": "net_getTempKey",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "keyType": "claimReward"
    }
}
  • "keyType"은 "claimReward" 이어야 합니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "38723",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "tempKey": "effeba77d6c04223d4a381a1dffa7d3f"
        }
    }
}

메시지 서명을 구합니다.

Request: https://test-api.protx.io/wallet****

{
    "jsonrpc": "2.0",
    "id": "38757",
    "method": "signData",
    "params": {
        "address": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "tempKey": "effeba77d6c04223d4a381a1dffa7d3f",
        "hashKey": "0e6f8b6c0f89cd1427bd7cdcd69b337a50a535f70f0a8580c4f1484ae267129d",
        "data": "05eadc9b44605d6ef54ff3d62bb909e29ba4f32eaea02e2128472cb5ecd0d7cf"
    }
}
  • "address"는 사용자 계좌입니다.

  • "hashKey"는 hash(temp key, address's secret key) 입니다.

  • "data"는 hash(staking address, your address, "tempKey", "hashKey") 입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "38757",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "signedData": "30440220230f62ac0d2700ce8af8be2fb29fcc8e9337f8c64b3df20c9b0df1192324cb660220632c491f2c105856961dfd571dd191a9a678758275c251f48c56b7cfae37b228"
        }
    }
}

적립금을 받습니다.

Request: https://test-api.protx.io/token

{
    "jsonrpc": "2.0",
    "id": "38788",
    "method": "stakingV1_claimReward",
    "params": {
        "stakingAddress": "0x82fb521a90b8ac242801e4603434968e2cdd9920",
        "sender": "0x5f619702528e9de7f5a4a233cd1896902385e705",
        "comment": "Claim reward",
        "tempKey": "effeba77d6c04223d4a381a1dffa7d3f",
        "hashKey": "0e6f8b6c0f89cd1427bd7cdcd69b337a50a535f70f0a8580c4f1484ae267129d",
        "signature": "30440220230f62ac0d2700ce8af8be2fb29fcc8e9337f8c64b3df20c9b0df1192324cb660220632c491f2c105856961dfd571dd191a9a678758275c251f48c56b7cfae37b228"
    }
}
  • "stakingAddress"는 staking contract address 입니다.

  • "sender"는 사용자 계좌입니다.

Response:

{
    "jsonrpc": "2.0",
    "id": "38788",
    "result": {
        "resultCode": "200",
        "resultMessage": "Success",
        "resultData": {
            "transactionId": "0x1e3539d4de4b6ebe9e15e03898e0759fed71d68c35804c29523eb1b1031f6860"
        }
    }
}

완료될 때까지 기다립니다.

DID (Decentralized Identifier)

DID 생성하기

Request: https://test-auth.protx.io/v2/did/create-did****

{
    "alias": "4700634FB09E0019",
    "address": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
    "secretKey": "********"
}
  • "alias"는 DID를 구분하는 별칭입니다.

  • "address"와 "secretKey"는 token API를 통해 생성한 사용자 계좌 정보입니다.

Response:

{
  "controllerKeyId": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
  "provider": "did:ethr",
  "keys": [
    {
      "kid": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
      "kms": "protx-kms",
      "type": "Secp256k1",
      "publicKeyHex": "0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
      "privateKeyHex": "",
      "meta": {
        "algorithms": [
          "ES256K",
          "ES256K-R",
          "eth_signTransaction",
          "eth_signTypedData",
          "eth_signMessage"
        ],
        "secretKey": "********"
      }
    }
  ],
  "alias": "4700634FB09E0019",
  "services": [],
  "did": "did:ethr:0x38b45217e81548733f9fd7443ecfe4ea6b5725cf"
}
  • 응답 본문은 DID 본문입니다.

VC (Verifiable Credential) 생성하기

이 VC는 본 인증 시스템에서 인증하기 위한 정보를 포함하게 됩니다. 이를 위해 /auth/auth-user를 통해 발급받은 JWT를 API에 호출 시 헤더에 첨부해야 합니다.

Request: https://test-auth.protx.io/v2/did/create-vc****

curl -X 'POST' \
  'https://test-auth.protx.io/v2/did/create-vc' \
  -H 'accept: application/json' \
  -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0Iiwicm9sZSI6IlJPTEVfVVNFUiIsImV4cCI6MTY2ODkyMzY5MSwidXNlciI6IjQ3MDA2MDM2NDRCNzAwMDQiLCJpYXQiOjE2NjYzMzE2OTF9.c2BMNGbTUNV6HQAIBy9nHOTEK8nZOex1r-ntO3KLlNY' \
  -H 'Content-Type: application/json' \
  -d '{
  "holder": "did:ethr:0x38b45217e81548733f9fd7443ecfe4ea6b5725cf",
  "issuer": "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4",
  "userInfo": {
     "name": "Hong"
  }
}'
  • "holder"는 사용자 DID 입니다.

  • "issuer"는 본 인증 시스템에서 제공하는 발급자 DID 입니다.

  • "userInfo"에는 키/값 형태로 추가적인 정보를 제공할 수 잇습니다.

Response:

{
  "credentialSubject": {
    "name": "Hong",
    "sub": "test",
    "id": "did:ethr:0x38b45217e81548733f9fd7443ecfe4ea6b5725cf"
  },
  "issuanceDate": "2022-10-21T05:56:06.000Z",
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiUHJvZmlsZSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiSG9uZyIsInN1YiI6InRlc3QifX0sInN1YiI6ImRpZDpldGhyOjB4MzhiNDUyMTdlODE1NDg3MzNmOWZkNzQ0M2VjZmU0ZWE2YjU3MjVjZiIsIm5iZiI6MTY2NjMzMTc2NiwiaXNzIjoiZGlkOmV0aHI6MHhkMjg0Y2RjOTY0YWY4YTAxZDgyZDBjYWE3ZGVlYmE4Mjc4NWI1NGY0In0.IvrseTkX-lnadHg7TrPcBaTC5utYIr72nbQRgdNS_jwSPy4fypUxu7_2xaJw1IqHy71-uTp1B52hAz7ZeRb89g"
  },
  "type": [
    "VerifiableCredential",
    "Profile"
  ],
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "issuer": {
    "id": "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4"
  }
}
  • 응답 본문은 VC 본문이 됩니다.

VP (Verifiable Presentation) 생성하기

Request: https://test-auth.protx.io/v2/did/create-vp****

{
    "holder": "did:ethr:0xa54545a4e45cf5a229438695c6bea23c5d1414c9",
    "verifier": "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4",
    "credentials": [
        {
            "credentialSubject": {
                "userId": "sus",
                "name": "ss",
                "phone": "019-3992-6444",
                "birthdate": "2022-10-19",
                "dRegNumber": "ss",
                "sub": "7005550002",
                "id": "did:ethr:0xa54545a4e45cf5a229438695c6bea23c5d1414c9"
            },
            "issuer": {
                "id": "did:ethr:0xa3bbf50a3c3a4180521325cb99ea301142b3634e"
            },
            "type": [
                "VerifiableCredential",
                "Profile"
            ],
            "@context": [
                "https://www.w3.org/2018/credentials/v1"
            ],
            "issuanceDate": "2022-10-19T10:42:13.000Z",
            "proof": {
                "type": "JwtProof2020",
                "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiUHJvZmlsZSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJ1c2VySWQiOiJzdXMiLCJuYW1lIjoic3MiLCJwaG9uZSI6IjAxOS0zOTkyLTY0NDQiLCJiaXJ0aGRhdGUiOiIyMDIyLTEwLTE5IiwiZFJlZ051bWJlciI6InNzIiwic3ViIjoiNzAwNTU1MDAwMiJ9fSwic3ViIjoiZGlkOmV0aHI6MHhhNTQ1NDVhNGU0NWNmNWEyMjk0Mzg2OTVjNmJlYTIzYzVkMTQxNGM5IiwibmJmIjoxNjY2MTc2MTMzLCJpc3MiOiJkaWQ6ZXRocjoweGEzYmJmNTBhM2MzYTQxODA1MjEzMjVjYjk5ZWEzMDExNDJiMzYzNGUifQ.LrTCG_SPXE-qpicQvTlaw666cmDpsZEILPpCAVRMBbjB-Yp-GMY0arqTxgc0rTRD3XlXV57JhCkZKYBZ261Dxg"
            }
        }
    ]
}
  • "holder"는 VP를 소유할 사용자 DID입니다.

  • "verifier"는 본 인증 시스템에서 제공하는 검증자 DID 입니다.

  • "credentials"에는 VC 목록이 저장됩니다.

Response:

{
  "issuanceDate": "2022-10-21T06:16:23.000Z",
  "verifier": [
    "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4"
  ],
  "holder": "did:ethr:0xa54545a4e45cf5a229438695c6bea23c5d1414c9",
  "proof": {
    "type": "JwtProof2020",
    "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iLCJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlByb2ZpbGUiXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKaGJHY2lPaUpGVXpJMU5rc2lMQ0owZVhBaU9pSktWMVFpZlEuZXlKMll5STZleUpBWTI5dWRHVjRkQ0k2V3lKb2RIUndjem92TDNkM2R5NTNNeTV2Y21jdk1qQXhPQzlqY21Wa1pXNTBhV0ZzY3k5Mk1TSmRMQ0owZVhCbElqcGJJbFpsY21sbWFXRmliR1ZEY21Wa1pXNTBhV0ZzSWl3aVVISnZabWxzWlNKZExDSmpjbVZrWlc1MGFXRnNVM1ZpYW1WamRDSTZleUoxYzJWeVNXUWlPaUp6ZFhNaUxDSnVZVzFsSWpvaWMzTWlMQ0p3YUc5dVpTSTZJakF4T1Mwek9Ua3lMVFkwTkRRaUxDSmlhWEowYUdSaGRHVWlPaUl5TURJeUxURXdMVEU1SWl3aVpGSmxaMDUxYldKbGNpSTZJbk56SWl3aWMzVmlJam9pTnpBd05UVTFNREF3TWlKOWZTd2ljM1ZpSWpvaVpHbGtPbVYwYUhJNk1IaGhOVFExTkRWaE5HVTBOV05tTldFeU1qazBNemcyT1RWak5tSmxZVEl6WXpWa01UUXhOR001SWl3aWJtSm1Jam94TmpZMk1UYzJNVE16TENKcGMzTWlPaUprYVdRNlpYUm9jam93ZUdFelltSm1OVEJoTTJNellUUXhPREExTWpFek1qVmpZams1WldFek1ERXhOREppTXpZek5HVWlmUS5MclRDR19TUFhFLXFwaWNRdlRsYXc2NjZjbURwc1pFSUxQcENBVlJNQmJqQi1ZcC1HTVkwYXJxVHhnYzByVFJEM1hsWFY1N0poQ2taS1lCWjI2MUR4ZyJdfSwibmJmIjoxNjY2MzMyOTgzLCJpc3MiOiJkaWQ6ZXRocjoweGE1NDU0NWE0ZTQ1Y2Y1YTIyOTQzODY5NWM2YmVhMjNjNWQxNDE0YzkiLCJhdWQiOlsiZGlkOmV0aHI6MHhkMjg0Y2RjOTY0YWY4YTAxZDgyZDBjYWE3ZGVlYmE4Mjc4NWI1NGY0Il19.AjFvyK-4yYH7PHMZT2c-ZsBiquX8ZPZARwmMHcYNtkup15CqCgq1GFcQOWEtvDfwkj8abJH4kH4ffCreWR1tWQ"
  },
  "type": [
    "VerifiablePresentation",
    "VerifiableCredential",
    "Profile"
  ],
  "@context": [
    "https://www.w3.org/2018/credentials/v1"
  ],
  "verifiableCredential": [
    {
      "credentialSubject": {
        "userId": "sus",
        "name": "ss",
        "phone": "019-3992-6444",
        "birthdate": "2022-10-19",
        "dRegNumber": "ss",
        "sub": "7005550002",
        "id": "did:ethr:0xa54545a4e45cf5a229438695c6bea23c5d1414c9"
      },
      "issuer": {
        "id": "did:ethr:0xa3bbf50a3c3a4180521325cb99ea301142b3634e"
      },
      "type": [
        "VerifiableCredential",
        "Profile"
      ],
      "@context": [
        "https://www.w3.org/2018/credentials/v1"
      ],
      "issuanceDate": "2022-10-19T10:42:13.000Z",
      "proof": {
        "type": "JwtProof2020",
        "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiUHJvZmlsZSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJ1c2VySWQiOiJzdXMiLCJuYW1lIjoic3MiLCJwaG9uZSI6IjAxOS0zOTkyLTY0NDQiLCJiaXJ0aGRhdGUiOiIyMDIyLTEwLTE5IiwiZFJlZ051bWJlciI6InNzIiwic3ViIjoiNzAwNTU1MDAwMiJ9fSwic3ViIjoiZGlkOmV0aHI6MHhhNTQ1NDVhNGU0NWNmNWEyMjk0Mzg2OTVjNmJlYTIzYzVkMTQxNGM5IiwibmJmIjoxNjY2MTc2MTMzLCJpc3MiOiJkaWQ6ZXRocjoweGEzYmJmNTBhM2MzYTQxODA1MjEzMjVjYjk5ZWEzMDExNDJiMzYzNGUifQ.LrTCG_SPXE-qpicQvTlaw666cmDpsZEILPpCAVRMBbjB-Yp-GMY0arqTxgc0rTRD3XlXV57JhCkZKYBZ261Dxg"
      }
    }
  ]
}
  • 응답 본문은 VP 본문이 된다.

발급자와 검증자 목록 구하기

본 시스템에서 제공하는 발급자와 검증자 목록을 구한다. 이 API는 GET 메쏘드를 사용한다.

Request: https://test-auth.protx.io/v2/did/issuers****

Response:

[
  {
    "alias": "prot",
    "did": "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4"
  },
  {
    "alias": "medi",
    "did": "did:ethr:0xa3bbf50a3c3a4180521325cb99ea301142b3634e"
  }
]

Request: https://test-auth.protx.io/v2/did/verifiers****

Response:

[
  {
    "alias": "prot",
    "did": "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4"
  },
  {
    "alias": "medi",
    "did": "did:ethr:0xa3bbf50a3c3a4180521325cb99ea301142b3634e"
  }
]

VP를 사용하여 인증하기

Request: https://test-auth.protx.io/v2/auth/auth-user-with-vp****

{
    "requestId": "https://test-admin.protx.io/?requestId=1234124_1242",
    "vp": {
        "verifiableCredential": [
            {
                "credentialSubject": {
                    "name": "asd",
                    "phone": "432-4324",
                    "sub": "01022223333",
                    "id": "did:ethr:0xb80a41cd53c3a42faa5a5f58e61909e50df811e0"
                },
                "issuer": {
                    "id": "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4"
                },
                "type": [
                    "VerifiableCredential",
                    "Profile"
                ],
                "@context": [
                    "https://www.w3.org/2018/credentials/v1"
                ],
                "issuanceDate": "2022-10-18T09:14:22.000Z",
                "proof": {
                    "type": "JwtProof2020",
                    "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2YyI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVDcmVkZW50aWFsIiwiUHJvZmlsZSJdLCJjcmVkZW50aWFsU3ViamVjdCI6eyJuYW1lIjoiYXNkIiwicGhvbmUiOiI0MzItNDMyNCIsInN1YiI6IjAxMDIyMjIzMzMzIn19LCJzdWIiOiJkaWQ6ZXRocjoweGI4MGE0MWNkNTNjM2E0MmZhYTVhNWY1OGU2MTkwOWU1MGRmODExZTAiLCJuYmYiOjE2NjYwODQ0NjIsImlzcyI6ImRpZDpldGhyOjB4ZDI4NGNkYzk2NGFmOGEwMWQ4MmQwY2FhN2RlZWJhODI3ODViNTRmNCJ9.PqUOVrxFI8Bmt2UKjJ2oF6oFNkV_0s9xzJczPwkDf8_fueJdBoK3OuOKnWPfS-wgSDTDMpyNlf_m27DoxvA1pA"
                }
            }
        ],
        "holder": "did:ethr:0xb80a41cd53c3a42faa5a5f58e61909e50df811e0",
        "verifier": [
            "did:ethr:0xd284cdc964af8a01d82d0caa7deeba82785b54f4"
        ],
        "type": [
            "VerifiablePresentation",
            "VerifiableCredential",
            "Profile"
        ],
        "@context": [
            "https://www.w3.org/2018/credentials/v1"
        ],
        "issuanceDate": "2022-10-18T09:14:26.000Z",
        "proof": {
            "type": "JwtProof2020",
            "jwt": "eyJhbGciOiJFUzI1NksiLCJ0eXAiOiJKV1QifQ.eyJ2cCI6eyJAY29udGV4dCI6WyJodHRwczovL3d3dy53My5vcmcvMjAxOC9jcmVkZW50aWFscy92MSJdLCJ0eXBlIjpbIlZlcmlmaWFibGVQcmVzZW50YXRpb24iLCJWZXJpZmlhYmxlQ3JlZGVudGlhbCIsIlByb2ZpbGUiXSwidmVyaWZpYWJsZUNyZWRlbnRpYWwiOlsiZXlKaGJHY2lPaUpGVXpJMU5rc2lMQ0owZVhBaU9pSktWMVFpZlEuZXlKMll5STZleUpBWTI5dWRHVjRkQ0k2V3lKb2RIUndjem92TDNkM2R5NTNNeTV2Y21jdk1qQXhPQzlqY21Wa1pXNTBhV0ZzY3k5Mk1TSmRMQ0owZVhCbElqcGJJbFpsY21sbWFXRmliR1ZEY21Wa1pXNTBhV0ZzSWl3aVVISnZabWxzWlNKZExDSmpjbVZrWlc1MGFXRnNVM1ZpYW1WamRDSTZleUp1WVcxbElqb2lZWE5rSWl3aWNHaHZibVVpT2lJME16SXRORE15TkNJc0luTjFZaUk2SWpBeE1ESXlNakl6TXpNekluMTlMQ0p6ZFdJaU9pSmthV1E2WlhSb2Nqb3dlR0k0TUdFME1XTmtOVE5qTTJFME1tWmhZVFZoTldZMU9HVTJNVGt3T1dVMU1HUm1PREV4WlRBaUxDSnVZbVlpT2pFMk5qWXdPRFEwTmpJc0ltbHpjeUk2SW1ScFpEcGxkR2h5T2pCNFpESTROR05rWXprMk5HRm1PR0V3TVdRNE1tUXdZMkZoTjJSbFpXSmhPREkzT0RWaU5UUm1OQ0o5LlBxVU9WcnhGSThCbXQyVUtqSjJvRjZvRk5rVl8wczl4ekpjelB3a0RmOF9mdWVKZEJvSzNPdU9LbldQZlMtd2dTRFRETXB5TmxmX20yN0RveHZBMXBBIl19LCJuYmYiOjE2NjYwODQ0NjYsImlzcyI6ImRpZDpldGhyOjB4YjgwYTQxY2Q1M2MzYTQyZmFhNWE1ZjU4ZTYxOTA5ZTUwZGY4MTFlMCIsImF1ZCI6WyJkaWQ6ZXRocjoweGQyODRjZGM5NjRhZjhhMDFkODJkMGNhYTdkZWViYTgyNzg1YjU0ZjQiXX0.fLwCJfdJdtZDtAm8jipG7EJ_Qyrv-03XmwGWnWOhyGg_XNFKX4K271HB2zkTIUbcbU8VavjlWMNlkuwEiV8Kog"
        }
    }
}
  • "vp"에 VP 본문을 넣는다.

  • 앱 로그인인 경우 "requestId"가 필요하다. "requestId"는 웹 로그인에 사용된다. 웹 사이트에서 QR 코드를 보여주면, 사용자 앱에서는 해당 QR 코드를 읽어서 "requestId"에 설정 후, VP와 같이 로그인 요청을 한다. 앱에서 로그인이 성공한 경우 웹 사이트도 로그인이 성공하게 된다.

Response:

{
  "token": "eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIwMTAyMjIyMzMzMyIsInJvbGUiOiJST0xFX1VTRVIiLCJleHAiOjE2Njg3Nzg5NzAsInVzZXIiOiI0NzAwNjBFRkNCRUMwMDJDIiwiaWF0IjoxNjY2MTg2OTcwfQ.h9bMc-mmswRcI8vLfl1E-a65hcIvqdKikcj_50ZOI8k",
  "userId": "01022223333",
  "name": "test1",
  "telNo": "01022223333",
  "email": ""
}

Last updated