Contract API
Contract API는 다음 기능들을 제공합니다.
- 컨트랙트 리소스 등록, 조회, 변경
- 컨트랙트 배포, 조회, 변경, 함수 실행
사전 준비: API 인증 토큰 발급하기
Contract API를 호출하려면 API Header에 인증 토큰을 첨부해야 합니다. API 인증 토큰을 발급받는 방법은 다음과 같습니다.
- Hive 콘솔에 가입 후 앱센터 > 게임목록 > 새 게임 등록하기에서 게임을 등록합니다.
- 앱센터 > AppID 목록 > 새 AppID 등록하기에서 AppID를 생성합니다.
- AppID 만들기: 웹 로그인 AppID
- 사용 용도 선택: 블록체인
- 사용할 AppID 선택: "자동 생성된 AppID" 또는 "자동 생성된 AppID + 추가정보" 선택
- Hive 콘솔 > 블록체인 > API 인증키 조회에서 게임명을 선택하고 ID와 인증키(SecretKey)를 발급받습니다.
- auth-token API Request Body에 ID와 SecretKey를 넣고 API를 호출합니다.
- API 응답값에서
data.accessToken
이 인증 토큰입니다.
컨트랙트 리소스 등록
컨트랙트의 리소스를 등록합니다. 컨트랙트명(contractName
), 컨트랙트 설명(contractDesc
), 컨트랙트 컴파일 후 생성된 Bytecode와 ABI/Scheme을 등록합니다.
Note
- 컨트랙트 리소스는 블록체인에 기록되지 않습니다.
- 컨트랙트는 Solidity 또는 Rust로 작성해야 합니다.
Request URL
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Request body
필드명 | 설명 | 타입 | 필수 여부 |
from | 컨트랙트 소유자 계정 주소 | string | Y |
contractName | 컨트랙트 이름 | string | Y |
contractDesc | 컨트랙트 설명 | string | Y |
contractAbi | 컨트랙트 컴파일 시 생성된 어플리케이션 바이너리 인터페이스 | file | Y |
contractBytecode | 컨트랙트 컴파일 시 생성된 바이트 코드 | file | Y |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.resourceId | 컨트랙트 리소스 ID | number |
Request sample
curl -X 'POST'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20ydXMuYzJ4d2...'
-H 'Content-Type: multipart/form-data'
-F 'from=0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0'
-F 'contractName=컴투스 토큰 컨트랙트'
-F 'contractDesc=대체가능토큰(FT) 컨트랙트'
-F 'contractAbi=@erc20-capped.json;type=application/json'
-F 'contractBytecode=@erc20-capped.code'
Response sample
// polygon
{
"code": 0,
"message": "success",
"data": {
"resourceId": 1
}
}
// xpla
{
"code": 0,
"message": "success",
"data": {
"rawTx": "02f873830138810c8451f4d5c08451f4d5cf83018c0694572f47db51a98...",
"resourceId": 1
}
}
컨트랙트 리소스 조회
등록한 컨트랙트 리소스를 조회합니다.
Request URL
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Query parameters
필드명 | 설명 | 타입 | 필수 여부 |
resourceId | 컨트랙트 리소스 ID | string | N |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.resourceId | 컨트랙트 리소스 ID | number |
data.network | 블록체인 네트워크 | string |
data.tenantId | 컨트랙트 등록자 ID | string |
data.contractName | 컨트랙트 이름 | string |
data.contractDesc | 컨트랙트 설명 | string |
data.codeId | 컨트랙트 코드 ID (XPLA 블록체인 전용) | string |
data.updatedAt | 컨트랙트 등록일 | string |
data.createdAt | 컨트랙트 수정일 | string |
Request sample
curl -X 'GET'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource?resourceId=1'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb...'
Response sample
{
"code": 0,
"message": "success",
"data": [
{
"resourceId": 1,
"network": "polygon",
"tenantId": "com.com2us.c2xwallet.global.normal",
"contractName": "컴투스 토큰 컨트랙트",
"contractDesc": "대체가능토큰(FT) 컨트랙트",
"codeId": null,
"updatedAt": "2023-07-27T18:05:25.000Z",
"createdAt": "2023-07-27T18:05:25.000Z"
}
]
}
컨트랙트 리소스 변경
등록한 컨트랙트 리소스를 변경합니다. 컨트랙트 설명(contractDesc
), Bytecode, ABI/Scheme 등을 변경합니다.
Request URL
Path parameters
필드명 | 설명 | 타입 | 필수 여부 |
resourceId | 컨트랙트 리소스 ID | string | Y |
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Request body
필드명 | 설명 | 타입 | 필수 여부 |
from | 컨트랙트 소유자 계정 주소 | string | Y |
contractDesc | 컨트랙트 설명 | string | N |
codeId | 컨트랙트 코드 ID(XPLA 전용)입니다. XPLA 블록체인에 컨트랙트 배포 시 발급받는 ID입니다. | string | N |
contractAbi | 컨트랙트 컴파일 시 생성된 어플리케이션 바이너리 인터페이스 | file | N |
contractBytecode | 컨트랙트 컴파일 시 생성된 바이트 코드 | file | N |
Note
codeId
는 XPLA 블록체인에 컨트랙트 전송 후 txHash를 XPLA Explorer에 검색한 결과중 Event Logs에서 확인할 수 있습니다.
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.resourceId | 컨트랙트 리소스 ID | number |
Request sample
curl -X 'PATCH'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/1'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNv...'
-H 'Content-Type: multipart/form-data'
-F 'from=0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0'
-F 'contractDesc=대체가능토큰(FT) 컨트랙트'
-F 'codeId=20'
Response sample
{
"code": 0,
"message": "success",
"data": {
"resourceId": 1
}
}
컨트랙트 배포
기존에 등록한 컨트랙트 리소스(Bytecode와 ABI/Scheme)를 기반으로 새로운 컨트랙트를 배포할 수 있는 트랜잭션을 생성합니다. 이 API는 모든 종류(NFT, FT 포함)의 컨트랙트를 배포할 수 있습니다.
Request URL
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Path parameters
필드명 | 설명 | 타입 | 필수 여부 |
resourceId | 컨트랙트 리소스 ID | string | Y |
Request body
필드명 | 설명 | 타입 | 필수 여부 |
from | 컨트랙트를 배포하는 지갑 주소 | string | Y |
message | 컨트랙트 배포에 필요한 초기 설정 정보 | json | Y |
encoded | 반환받을 트랜잭션의 인코딩 여부 true : data.rawTx 으로 인코딩된 Raw Transaction String을 받습니다. false : data.rawTx 으로 인코딩을 디코딩한 JSON 결과값을 받습니다. | boolean | N |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | json |
data.rawTx | 트랜잭션 데이터 | string 또는 json |
data.instanceId | 컨트랙트 인스턴스 ID | number |
Request sample
curl -X 'POST'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/2'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb...'
-H 'Content-Type: application/json'
-d '{
"from": "0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0",
"message": {
"name": "testft",
"symbol": "tft",
"decimals": 6,
"initialSupply": "1000000000"
},
"encoded": true
}'
Response sample
{
"code": 0,
"message": "success",
"data": {
"rawTx": "02f91c9c830138811a84513619a084513619b...",
"instanceId": 1
}
}
배포된 컨트랙트 정보 조회
블록체인에 배포된 컨트랙트 정보를 조회합니다.
Request URL
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Query parameters
필드명 | 설명 | 타입 | 필수 여부 |
instanceId | 컨트랙트 인스턴스 ID | string | N |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | array |
data.resourceId | 컨트랙트 리소스 ID | number |
data.instanceId | 컨트랙트 인스턴스 ID | number |
data.contractAddress | 컨트랙트 주소 | string |
data.initMsg | 컨트랙트 배포 시 초기 설정 정보 | json |
data.createdAt | 컨트랙트가 블록체인에 기록된 날짜 | string |
data.network | 블록체인 네트워크 정보 | string |
data.tenantId | 컨트랙트 배포한 사용자 ID | string |
Request sample
curl -X 'GET'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/instance?instanceId=1'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20yd...'
Response sample
{
"code": 0,
"message": "success",
"data": [
{
"resourceId": 2,
"instanceId": 1,
"contractAddress": null,
"initMsg": {
"name": "testft",
"symbol": "tft",
"decimals": 6,
"initialSupply": "1000000000"
},
"createdAt": "2023-07-28T17:35:22.000Z",
"network": "polygon",
"tenantId": "com.com2us.c2xwallet.global.normal"
}
]
}
컨트랙트 인스턴스 주소 변경
컨트랙트 인스턴스 ID(instanceId
)를 사용해 배포된 컨트랙트(contract) 주소를 업데이트합니다.
Request URL
Path parameters
필드명 | 설명 | 타입 | 필수 여부 |
instanceId | 컨트랙트 인스턴스 ID | string | Y |
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Query parameters
필드명 | 설명 | 타입 | 필수 여부 |
contractAddress | 컨트랙트 주소 | string | Y |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
Request sample
curl -X 'PATCH'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/instance/1?contractAddress=0x78ce8698bd69fc96d425a82ae6813f553a673e63'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJp...'
Response sample
{
"code": 0,
"message": "success"
}
컨트랙트 함수 목록 조회
컨트랙트 리소스 ID(resourceId
)로 컨트랙트 함수 목록을 조회합니다.
Request URL
Path parameters
필드명 | 설명 | 타입 | 필수 여부 |
resourceId | 컨트랙트 리소스 ID | string | Y |
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | API 응답 데이터 | array |
data.methodName | 컨트랙트 함수 이름 | string |
data.type | 컨트랙트 함수 유형 execute : 컨트랙트에 데이터를 입력하거나 기존 데이터를 변경 query : 컨트랙트 조회 | string |
Request sample
curl -X 'GET'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/1/methods'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20yd...'
Response sample
{
"code": 0,
"message": "success",
"data": [
{
"methodName": "allowance",
"type": "query"
},
{
"methodName": "totalSupply",
"type": "query"
},
...
]
}
컨트랙트 함수 정보 조회
컨트랙트 리소스 ID(resourceId
), 기능명(method
)으로 컨트랙트 함수 실행에 필요한 function signature를 조회합니다.
Request URL
Path parameters
필드명 | 설명 | 타입 | 필수 여부 |
resourceId | 컨트랙트 리소스 ID | string | Y |
method | 컨트랙트 함수명 | string | Y |
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | 컨트랙트 함수 실행에 필요한 정보(컨트랙트 함수명, 컨트랙트 함수 실행에 필요한 입력 파라미터)입니다. | json |
Request sample
curl -X 'GET'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/resource/2/method/balanceOf'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb20...'
Response sample
{
"code": 0,
"message": "success",
"data": {
"balanceOf": {
"account": "address"
}
}
}
컨트랙트 함수 실행
컨트랙트 함수명과 함수의 입력 파라미터(message
)로 컨트랙트에 있는 함수를 호출합니다.
Request URL
Path parameters
필드명 | 설명 | 타입 | 필수 여부 |
instanceId | 컨트랙트 인스턴스 ID | string | Y |
필드명 | 설명 | 타입 | 필수 여부 |
Authorization | API를 호출하기 위한 인증 토큰 | string | Y |
x-network | 블록체인 네트워크{ploygon, xpla} | string | Y |
Request Body
필드명 | 설명 | 타입 | 필수 여부 |
from | 컨트랙트 함수 실행을 요청할 계정 지갑 주소 | string | Y |
message | 실행할 컨트랙트 함수명, 함수 실행에 필요한 입력 파라미터, 입력 파라미터 값들 | string | Y |
encoded | 반환받을 트랜잭션의 인코딩 여부 true : data.rawTx 으로 인코딩된 Raw Transaction String을 받습니다. false : data.rawTx 으로 인코딩을 디코딩한 JSON 결과값을 받습니다. | boolean | N |
Responses
필드명 | 설명 | 타입 |
code | api 호출 결과 코드, 0:성공 | number |
message | 결과 메시지 | string |
data | 컨트랙트 함수 실행 결과값 | json |
Request sample
curl -X 'POST'
'https://sandbox-bc-api.qpyou.cn/core/v1/contract/instance/1/query'
-H 'accept: */*'
-H 'x-network: polygon'
-H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6ImNvbS5jb2...'
-H 'Content-Type: application/json'
-d '{
"from": "0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0",
"message": {
"balanceOf": {
"account": "0xD6e69da7f1be111394dfef4C48eaC9b52ddf2Fd0"
}
},
"encoded": true
}'
컨트랙트에 있는 함수는 크게 데이터를 단순 조회하는 함수(Query 타입)와, 컨트랙트에 새 데이터를 쓰거나 기존 데이터를 변경하는 함수(Execute 타입)로 나뉩니다. Execute 타입은 Query 타입과 달리 Raw Transaction을 반드시 반환합니다.
Response sample: Query type
{
"code": 0,
"message": "success",
"data": "1000000000"
}
Response sample: Execute type (encoded
is true
)
{
"code": 0,
"message": "success",
"data": {
"rawTx": "02f8738301388181c2846fc23ac0846fc23ad882cdc49494853bdc9c6add50d7...",
}
}
Response sample: Execute type (encoded
is false
)
{
"code": 0,
"message": "success",
"data": {
"rawTx": {
"from": "0x9428e6eF51FEb2201676deEc11B7E36F7c1F0765",
"to": "0x94853BdC9c6AdD50D7842D1A3117fab385457470",
"data": "0xa9059cbb000000000000000000000000fbd488d1b00604d3b05124d80e35fea...",
"nonce": 224,
"chainId": 80001,
"gas": 52676,
"maxFeePerGas": 1575000048,
"maxPriorityFeePerGas": 1575000000
}
}
}