다중 서명 트랜잭션

이 페이지는 Wallet API로 여러 계정이 서명해야하는 트랜잭션을 전송하는 방법을 안내합니다.

튜토리얼에 앞서

  • API 호출에 사용되는 x-chain-id 값은 8217(Cypress) 또는 1001(Baobab)입니다.

  • API 호출에 필요한 필수 파라미터는 각 예시에 설명됩니다.

API 호출 시 사용자가 입력해야 하는 값은 중괄호 1개({})로 표시합니다. 사용자가 입력해야 하는 값은 아래 테이블과 같습니다.

API 인증 키가 있으면 모든 KAS 서비스를 사용할 수 있으며 Wallet API를 호출해 만든 Klaytn 계정에 대한 모든 권한을 소유합니다. 모든 권한에는 Klaytn 계정의 자산(KLAY 등) 이동이나 트랜잭션 전송 및 실행 권한이 포함됩니다. 만약 API 인증 키에 타인이 접근한다면 Klaytn 계정 권한을 탈취당해 원치 않는 트랜잭션이 발생할 수 있습니다.

KAS/Klaytn 계정 보안을 위해 KAS API 인증 키(Secret Access Key)를 타인과 함부로 공유하지 말고 주의해 관리하십시오.

다중 서명이란?

다중 서명이란 말 그대로 여러개의 서명을 의미합니다. 클레이튼은 트랜잭션을 보내기 전에 트랜잭션에 서명을 받아야 합니다. 이 때, 1개 트랜잭션에 여러 클레이튼 계정이 서명해야 하는 경우가 있습니다. 이는 트랜잭션을 보내려는 계정이 다중 서명 계정, 즉 다중 서명 키를 가진 계정인 경우입니다.

트랜잭션과 트랜잭션 서명에 관한 자세한 내용은 다음을 확인하십시오. 여러분의 계정 키를 다중 서명 키로 바꾸는 방법은 다음을 확인하십시오.

다중 서명을 받는 트랜잭션 보내기

여러분은 다중 서명 계정(=다중 서명 키를 가진 계정)으로 트랜잭션에 여러 클레이튼 계정의 서명을 받은 후 트랜잭션을 전송할 수 있습니다. 여기에서는 다중 서명을 받은 KLAY 전송 트랜잭션을 보내는 방법을 안내합니다.

Klay를 보내려면 Klaytn Node에 트랜잭션을 보내야 하며, 트랜잭션을 보내려면 트랜잭션 수수료를 지불해야 합니다. API를 호출하려면 계정 저장소와 계정을 생성하고 사용할 계정을 선택해야 합니다. 이 예시를 따라 트랜잭션을 보내면, 보내는는 계정(Account)이 트랜잭션 수수료를 직접 부담합니다.

다중 서명을 받는 트랜잭션 전송 예시로써, KLAY 전송 트랜잭션을 보낼 때 여러 계정으로 서명하는 단계는 아래와 같습니다.

보류중인 트랜잭션이 필요한 모든 서명을 받으면 트랜잭션은 자동으로 클레이튼에 전송됩니다.

보류 중인 트랜잭션 목록 조회

현재 계정에서 보낸 트랜잭션 중 보류중인 트랜잭션 목록을 조회합니다.

현재 계정이 다중 서명 계정이고 트랜잭션을 전송하는 데 서명을 충분히 받지 못한 경우(=이미 서명에 사용된 키들의 가중치 합이 기준치를 넘지 못한 경우) 트랜잭션 상태(status)는 보류(Pending) 상태입니다. 다중 서명 계정으로 트랜잭션을 전송했어도 트랜잭션을 전송하기 위한 서명 개수가 부족하다면 트랜잭션은 필요한 서명을 모두 받을 때까지 보류 상태입니다.

API를 호출하려면 계정 저장소와 계정을 생성하고 사용할 계정을 선택해야 합니다.

KAS SDK(caver-js/caver-java extension) 설치, 실행에 관한 자세한 내용은 KAS SDK를 확인하십시오. 계정 저장소 생성, 계정 생성, 계정 선택에 관한 자세한 내용은 Getting Started를 확인하십시오.

API 호출

입력한 클레이튼 계정 주소(EOA)에서 보낸 트랜잭션 중에서 보류 중인 트랜잭션들을 불러오는 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

쿼리 파라미터

여러분은 커서 방식 페이지네이션을 사용해 API 응답값을 받아올 수 있습니다. 검색 범위를 초단위로 지정할 수 있습니다.

curl --location --request GET "https://wallet-api.klaytnapi.com/v2/multisig/account/0xc6C9356887b7F7887918Bf577417E5D8De253295/tx" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}" \

API 응답

보류 중인 트랜잭션 목록 조회 API의 응답은 아래와 같습니다.

{
  "cursor": "",
  "items": [
    {
      "address": "0xc6C9356887b7F7887918Bf577417E5D8De253295",
      "chainId": 1001,
      "createdAt": 1599144020,
      "multiSigKeys": [
        {
          "address": "0xc6C9356887b7F7887918Bf577417E5D8De253295",
          "weight": 3
        },
        {
          "address": "0x0b7caaf70e7A0a5399041c64711E535CE8B3cf7d",
          "weight": 1
        }
      ],
      "status": 2,
      "threshold": 4,
      "transactionId": "0x65111d4fba621a1bfa3bd97c219b3e0454471cf3c07827396f1202946df51ee2",
      "txData": {
        "from": "0xc6c9356887b7f7887918bf577417e5d8de253295",
        "gasLimit": 1000000,
        "gasPrice": "0x5d21dba00",
        "input": "0x6d656d6f",
        "to": "0x2f87ba64de5526f7880f21481effbf950f70005c",
        "typeInt": 16,
        "value": "0x1001"
      },
      "type": "TX",
      "updatedAt": 1599144020
    },
    {
      "address": "0xc6C9356887b7F7887918Bf577417E5D8De253295",
      "chainId": 1001,
      "createdAt": 1599144013,
      "multiSigKeys": [
        {
          "address": "0xc6C9356887b7F7887918Bf577417E5D8De253295",
          "weight": 3
        },
        {
          "address": "0x0b7caaf70e7A0a5399041c64711E535CE8B3cf7d",
          "weight": 1
        }
      ],
      "status": 2,
      "threshold": 4,
      "transactionId": "0x36f9c5794fc141d3625e89a1164e6105fa973e8214d23bc6a210d2afe9dba6dd",
      "txData": {
        "from": "0xc6c9356887b7f7887918bf577417e5d8de253295",
        "gasLimit": 1000000,
        "gasPrice": "0x5d21dba00",
        "input": "0x6d656d6f",
        "to": "0x2f87ba64de5526f7880f21481effbf950f70005c",
        "typeInt": 16,
        "value": "0x100"
      },
      "type": "TX",
      "updatedAt": 1599144013
    }
  ]
}

typeInt 변수는 트랜잭션 종류를 구별하는 값입니다. 트랜잭션의 종류에 관한 자세한 내용은 다음을 확인하십시오.

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

보류 중인 트랜잭션에 서명하기

계정으로 특정 트랜잭션에 서명하기 API를 호출해 보류중인 트랜잭션에 서명합니다. 현재 계정이 다중 서명 계정이고 트랜잭션을 전송하는 데 서명을 충분히 받지 못한 경우(=이미 서명에 사용된 키들의 가중치 합이 기준치를 넘지 못한 경우) 트랜잭션 상태(status)는 보류(Pending) 상태입니다.

API를 호출하려면 계정 저장소와 계정을 생성하고 사용할 계정을 선택해야 합니다.

KAS SDK(caver-js/caver-java extension) 설치, 실행에 관한 자세한 내용은 KAS SDK를 확인하십시오. 계정 저장소 생성, 계정 생성, 계정 선택에 관한 자세한 내용은 Getting Started를 확인하십시오.

API 호출

보류 중인 트랜잭션 서명 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request POST "https://wallet-api.klaytnapi.com/v2/multisig/account/0x68Da92c0557A62C292598A3156B770df6e07BD83/tx/0x5d7beaf43d63d27bf8ddd11ac32ee3c853abfe869988526f92431a63fe3dcb1d/sign" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}" \

API 응답

보류 중인 트랜잭션 서명 API의 응답은 아래와 같습니다.

// 전체 가중치 합계가 4(=기준치) 이상이어야 하는 상황에서, 일부 서명만 받았을 경우: 가중치 1짜리 서명만 받은 경우
{
  "reminders": [
    "0xf24e881d3cFF241859203DB09a28421267B7F6E6"
  ],
  "signedWeight": 1,
  "status": "Signed",
  "threshold": 4,
  "transactionID": "0xfa275dba88d197a85504ef70e0dd2640acc708817e9eb3933d7850acfb048649",
  "weight": 1
}

// 전체 가중치 합계가 4(=기준치) 이상이어야 하는 상황에서, 트랜잭션 전송에 필요한 모든 서명을 받았을 경우: : 가중치 1짜리 서명과 가중치 3짜리 서명까지 받은 경우
{
  "signedWeight": 4,
  "status": "Submitted",
  "threshold": 4,
  "transactionHash": "0x81f2ff422eae9b40d65b7a6f1e3c5ca598f83d1473ccc87e53d51b875fe75c82",
  "transactionID": "0xfa275dba88d197a85504ef70e0dd2640acc708817e9eb3933d7850acfb048649",
  "weight": 3
}
  • reminders: 아직 서명하지 않은 키의 주인인 계정 주소

  • signedWeight: 이 트랜잭션에 여태까지 서명된 키들의 가중치 누적합으로 이 값이 threshold보다 커야 트랜잭션이 전송됨

  • weight: 서명된 키의 가중치

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

보류 중인 트랜잭션에 서명하기 - 미리 준비한 서명 사용하기

보류중인 트랜잭션에 서명합니다. 이 때 미리 준비한 서명 값으로 보류중인 트랜잭션에 서명합니다.

KAS 외부에서 만든 Klaytn 계정이 있고 이 계정의 서명 값이 있다면, 이 서명 값으로 트랜잭션에 서명할 수 있습니다. 현재 계정이 다중 서명 계정이고 트랜잭션을 전송하는 데 서명을 충분히 받지 못한 경우(=이미 서명에 사용된 키들의 가중치 합이 기준치를 넘지 못한 경우) 트랜잭션 상태(status)는 보류(Pending) 상태입니다.

API를 호출하려면 계정 저장소와 계정을 생성하고 사용할 계정을 선택해야 합니다.

KAS SDK(caver-js/caver-java extension) 설치, 실행에 관한 자세한 내용은 KAS SDK를 확인하십시오. 계정 저장소 생성, 계정 생성, 계정 선택에 관한 자세한 내용은 Getting Started를 확인하십시오.

API 호출

보류 중인 트랜잭션 서명 API를 호출합니다. API 호출 시 REST API 또는 SDKs(caver-js, caver-java extensions)를 사용할 수 있습니다.

curl --location --request POST "https://wallet-api.klaytnapi.com/v2/multisig/tx/0x5d7beaf43d63d27bf8ddd11ac32ee3c853abfe869988526f92431a63fe3dcb1d/sign" \
-u {access-key-id}:{secret-access-key} \
--header "x-chain-id: {chain-id}" \
--header "Content-Type: application/json" \
--data-raw "{
  "signatures": [
    {
      "R": "0xaa2ae446f5dd35df839e8ec2005aede91f0b3ea0f1e6889f4294d4760529bfaf",
      "S": "0x7b3efab682bcc86f7050819e12a2b5ea916871d684b9e1c8ca8f49869df41896",
      "V": "0x7f5"
    }
  ]
}"
  • signatures: ECDSA 서명 정보(R,S)와 공개키 복원 정보(V)로 구성된 미리 준비한 서명값입니다.

API 응답

보류 중인 트랜잭션 서명 API의 응답은 아래와 같습니다.

// 다중 서명이 필요한 상황에서, 일부 서명만 받았을 경우: 기준치 4에 가중치 3짜리 서명만 받은 경우
{
  "reminders": [
    "0xA9183eD590ebEDf06D415ae684E3f18d06789f8d"
  ],
  "signedWeight": 3,
  "status": "Signed",
  "threshold": 4,
  "transactionId": "0xa0cabe28c75aa6babbf7e85b5033641c46d0f2e7b714e47103716695d454a45a",
  "weight": 3
}

// 다중 서명이 필요한 상황에서, 트랜잭션 전송에 필요한 모든 서명을 받았을 경우: : 기준치 4에 가중치 1짜리 서명까지 받은 경우
{
  "signedWeight": 4,
  "status": "Submitted",
  "threshold": 4,
  "transactionHash": "0xf1ced3855f3cd1d5220f2991ec4ba845ec747a0c01028c2d63de3662ddad2083",
  "transactionId": "0xae20ed8ce084d372fb804ea6f6073ba2f485a64bac086199efb83d665d0b31f2",
  "weight": 1
}
  • reminders: 아직 서명하지 않은 키의 주인인 계정 주소

  • signedWeight: 이 트랜잭션에 여태까지 서명된 키들의 가중치 누적합으로 이 값이 threshold보다 커야 트랜잭션이 전송됨

  • weight: 서명된 키의 가중치

이 API에 관한 자세한 내용은 다음을 확인하십시오. 이 문서 혹은 KAS에 관한 문의는 개발자 포럼을 방문해 도움을 받으십시오.

Last updated