토큰 전송
카이아 디자인 섹션에서 설명한 것처럼 서비스체인은 부모체인과 자식체인 간의 밸류(KLAY, ERC-20, ERC-721) 전송을 지원합니다. 이 페이지는 SCN에서 밸류 전송 기능을 활성화하는 방법을 보여줍니다.
EN과 SCN을 설정한 후 체인 간 밸류 전송을 활성화하려면 다음 절차가 필요합니다.
- SCN에 접속하여
subbridge.parentOperator
와subbridge.childOperator
를 실행하여 계정 주소를 확인합니다. parent.operator
를 이전 단계의subbridge.parentOperator
로 설정합니다.- 토큰(ERC-20 또는 721) 컨트랙트를 부모/자식 체인에 배포합니다. (KLAY 전송만 필요한 경우, 3단계와 4단계를 건너뛸 수 있습니다.)
- 토큰 컨트랙트를 부모/자식 체인의 브리지 컨트랙트에 등록합니다.
- 부모/자식 체인에 있는 브리지 컨트랙트를 구독합니다.
단계를 수행하기 전에 메커니즘의 이면을 이해하기 위해 높은 수준의 시스템 아키텍처를 살펴 보겠습니다.
시스템 구조
그림 1은 브리지/토큰 컨트랙트와 브리지 노드가 있는 서비스 체인의 시스템 아키텍처를 보여줍니다.
아래 컨트랙트는 메인/서브 브리지를 통해 서로 통신하며 사용자의 밸류 전송 요청을 처리합니다.
- 브리지 컨트랙트
- ERC-20 컨트랙트(필요한 경우)
- ERC-721 컨트랙트(필요한 경우)
서비스체인에는 부모 체인 브리지 오퍼레이터 계정과 서비스 체인 브리지 오퍼레이터 계정의 두 가지 오퍼레이터 계정이 있습니다. 각 오퍼레이터 계정은 트랜잭션에 서명하는 데 사용됩니다.
트랜잭션이 부모 체인으로 값을 이동하면 부모 체인 브리지 오퍼레이터 계정이 트랜잭션에 서명합니다. 자식 체인에는 자식 체인 브리지 오퍼레이터 계정이 사용됩니다.
사용자가 '값 전송 요청' 트랜잭션을 제출하면 하위 브리지는 브리지 오퍼레이터 계정이 서명한 '값 전송 처리' 트랜잭션을 생성합니다.
그런 다음 parentOperator
에게 KAIA를 전송합니다.
서비스 체인의 가스 가격이 0이 아닌 값으로 설정된 경우, 서비스 체인 브리지 오퍼레이터의 잔액에도 KAIA가 있어야 합니다.
키 저장소 및 비밀번호 파일
SCN이 부팅될 때 부모/자식 운영자의 키가 없는 경우 키스토어 파일과 비밀번호 파일이 자동으로 생성됩니다. 특정 계정을 운영자로 사용하려면 키를 제공하면 됩니다. SCN을 부팅하기 전에 아래 파일을 지정된 경로에 배치합니다. 비밀번호 파일에는 키스토어 파일의 비밀번호 문자열이 있어야 합니다. 비밀번호 파일 이름은 해당 키스토어 파일의 계정 주소여야 합니다.
파일
- 키스토어 파일 :
UTC--2019-10-21T04-05-41.493850000Z--2ed72a9d7fe5da7672fd21567e07302431649b0b
- 비밀번호 파일 :
0x2eD72a9D7fe5da7672fD21567e07302431649B0B
파일 경로
- 상위 체인 브리지 오퍼레이터: $datadir/parent_bridge_account
- 자식 체인 브리지 오퍼레이터 : $datadir/child_bridge_account
> pwd/$dataDIR/child_bridge_account> ls0x2eD72a9D7fe5da7672fD21567e07302431649B0BUTC--2019-10-21T04-05-41.493850000Z--2ed72a9d7fe5da7672fd21567e07302431649b0b> cat 0x2eD72a9D7fe5da7672fD21567e07302431649B0B%S~f5qqM38cB47jL%> cat UTC--2019-10-21T04-05-41.493850000Z--2ed72a9d7fe5da7672fd21567e07302431649b0b{"address":"2ed72a9d7fe5da7672fd21567e07302431649b0b","crypto":{"cipher":"aes-128-ctr","ciphertext":"6486509e8158bf4984608cbc5562cf2c9a27cd988a98e543731b39251144e633","cipherparams":{"iv":"96d7e5b6a936278c0797faae6cb3d903"},"kdf":"scrypt","kdfparams":{"dklen":32,"n":262144,"p":1,"r":8,"salt":"8928ba41b8228af19390ec881c51452fa3ea973ad2c253ca0f5bc9197a8b24c4"},"mac":"9c8ec63694c20a473e0ea33840e7d16e9f1a20afc52b3244b703a3ac0a66cfa3"},"id":"9ae10527-7fd3-4aae-a4eb-316af211494e","version":3}
브리지 오퍼레이터 주소 확인
SCN을 정상적으로 실행했다면, 아래와 같이 RPC API를 사용하여 부모/자식 체인 브리지 오퍼레이터 주소를 확인할 수 있습니다.
$ kscn attach --datadir ~/kscnd_homeWelcome to the Kaia JavaScript console!instance: Kaia/vvX.X.X/XXXX-XXXX/goX.X.X datadir: ~/kscnd_home modules: admin:1.0 subbridge:1.0 debug:1.0 governance:1.0 istanbul:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 servicechain:1.0 txpool:1.0> subbridge.parentOperator"0xA057995175B93Ee0D1bdfA54f078Ad0F0116130b"> subbridge.childOperator"0x5C1C757a6Cb6c6FcEFE398674D8209FDA2A74Df4"
자세한 내용은 subbridge API를 참조하세요.
브리지 오퍼레이터에게 KAIA 보내기
subbridge.parentOperator
와 subbridge.childOperator
는 트랜잭션을 전송하기에 충분한 KAIA를 가지고 있어야 합니다.
서비스 체인의 가스 가격이 0이 아닌 값으로 설정된 경우, 서비스 체인 브리지 오퍼레이터의 잔액에도 KAIA가 있어야 합니다.
운영자 계정을 충전한 후 아래와 같이 잔액을 확인할 수 있습니다.
자식 체인 브리지 운영자
$ kscn attach --datadir ~/kscnd_homeWelcome to the Kaia JavaScript console! instance: Kaia/vvX.X.X/XXXX-XXXX/goX.X.X datadir: ~/kscnd_home modules: admin:1.0 subbridge:1.0 debug:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> subbridge.parentOperatorBalance1e+50
상위 체인 브리지 오퍼레이터
$ kscn attach --datadir ~/kscnd_homeWelcome to the Kaia JavaScript console! instance: Kaia/vvX.X.X/XXXX-XXXX/goX.X.X datadir: ~/kscnd_home modules: admin:1.0 subbridge:1.0 debug:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 txpool:1.0 web3:1.0> subbridge.childOperatorBalance1e+50
브리지 컨트랙트
토큰 컨트랙트는 발행/전송 테스트를 위한 것이고, 브리지 컨트랙트는 밸류 전송 요청을 수신/처리하는 데 사용됩니다.
사용자는 브리지 컨트랙트에 KAIA 전송을 요청하여 자신의 KAIA를 다른 체인으로 전송할 수 있습니다.
KIP-7 토큰 컨트랙트에 requestERC20Transfer()
함수를 호출하여 부모 체인과 자식 체인 간에 KIP-7 토큰을 전송할 수 있습니다.
배포
서브 브리지는 브리지 컨트랙트 배포 API를 제공합니다. 아래와 같이 단일 RPC 호출을 사용하여 두 체인에 브리지 컨트랙트를 배포할 수 있습니다. 이 작업을 수행하기 전에 메인 브리지와 서브 브리지를 연결해야 합니다. 자세한 가이드는 브리지 구성을 참고하시기 바랍니다.
$ kscn attach --datadir ~/kscnd_homeWelcome to the Kaia JavaScript console!instance: Kaia/vvX.X.X/XXXX-XXXX/goX.X.X datadir: ~/kscnd_home modules: admin:1.0 subbridge:1.0 debug:1.0 governance:1.0 istanbul:1.0 klay:1.0 miner:1.0 net:1.0 personal:1.0 rpc:1.0 servicechain:1.0 txpool:1.0> subbridge.deployBridge()["0x27caeba831d98b5fbb1d81ce0ed20801702f443a", "0x22c41ae528627b790233d2e59ea520be12350eb5"]> subbridge.listBridge[{ localAddress: "0x27caeba831d98b5fbb1d81ce0ed20801702f443a", remoteAddress: "0x22c41ae528627b790233d2e59ea520be12350eb5", subscribed: false}]
자세한 내용은 subbridge API를 참조하세요.
subbridge_listBridge
는 브리지 컨트랙트 주소와 해당 컨트랙트의 구독 상태를 보여줍니다.
서브브릿지는 브리지 컨트랙트 주소 목록을 파일에 저장합니다. 재부팅 시 서브브릿지는 파일에서 브리지 컨트랙트 목록을 다시 로드합니다.
구독
브리지 컨트랙트를 배포한 후, 서브 브리지가 배포된 브리지 컨트랙트를 구독하도록 하여 밸류 전송을 활성화해야 합니다. 이는 다 른 RPC API 호출인 subbridge_subscribeBridge
를 사용하여 수행할 수 있습니다.
> subbridge.subscribeBridge("0x27caeba831d98b5fbb1d81ce0ed20801702f443a", "0x22c41ae528627b790233d2e59ea520be12350eb5")null> subbridge.listBridge[{ localAddress: "0x27caeba831d98b5fbb1d81ce0ed20801702f443a", remoteAddress: "0x22c41ae528627b790233d2e59ea520be12350eb5", subscribed: true}]
전제 조건
구독이 완료되면 SCN은 사용자의 "밸류 전송 요청" 트랜잭션을 자동으로 처리합니다. 이 섹션에서는 브리지 컨트랙트 상태를 확인하는 방법을 설명합니다.
브리지 컨트랙트에는 두 개의 nonce, 즉 requestNonce
와 handleNonce
가 있습니다.
인체인 트랜잭션과 달리 서브 브리지는 상위 nonce 요청을 하위 nonce 요청보다 먼저 처리할 수 있습니다.
- requestNonce : 이 브리지 컨트랙트에 대한 사용자의 "크로스 체인 밸류 전송" 요청 횟수입니다.
- handleNonce : 서브 브리지가 처리한 가장 높은 nonce입니다.
- lowerHandleNonce : 서브 브리지가 처리해야 하는 가장 낮은 nonce.
따라서 nonce가 다음과 같이 업데이트되면 크로스 체인 밸류 전송이 올바르게 처리되었다고 말할 수 있습니다.
- 부모 체인 브리지 컨트랙트의 "handleNonce"와 "lowerHandleNonce"는 자식 체인 브리지 컨트랙트의 "requestNonce"에 계속 접근합니다.
- "handleNonce"와 "lowerHandleNonce"는 부모 체인 브리지 컨트랙트의 "requestNonce"에 계속 접근합니다.
"handleNonce"가 대응하는 브리지 컨트랙트의 "requestNonce"와 같고 "lowerHandleNonce"가 "handleNonce"보다 1보다 크면 사용자의 요청이 모두 처리된 것입니다.
로그
아래는 정상 작동 중 SCN의 일반적인 로그 출력입니다. 1초마다 브리지 컨트랙트의 상태가 출력됩니다.
INFO[10/16,19:37:40 +09] [45] VT : Parent -> Child Chain request=8699 handle=4826 lowerHandle=4826 pending=3873INFO[10/16,19:37:40 +09] [45] VT : Child -> Parent Chain request=7894 handle=4207 lowerHandle=4207 pending=3687
이 로그는 request, handle, lowerHandle, pending nonce를 보여줍니다. 각 값은 아래와 같은 의미를 가집니다.
- request: 가입된 모든 브리지 컨트랙트의 값 전송 요청 nonce의 합계입니다.
- handle: 가입된 모든 브리지 컨트랙트의 상위 핸들 nonce의 합입니다.
- lowerHandle: 가입된 모든 브리지 컨트랙트의 하위 핸들 nonce의 합입니다.
- pending :
request
와lowerHandle
의 차이입니다.
RPC API
아래와 같이 브리지 컨트랙트의 상태를 확인할 수 있습니다. You can refer to the subbridge API for more details.
> subbridge.getBridgeInformation("0x27caeba831d98b5fbb1d81ce0ed20801702f443a"){ counterPart: "0x22c41ae528627b790233d2e59ea520be12350eb5", handleNonce: 0, lowerHandleNonce: 0, isRunning: true, isSubscribed: true, onServiceChain: true, pendingEventSize: 0, requestNonce: 0}
ERC-20 토큰 전송(2단계)
서비스체인은 ERC-20/721 밸류 전송도 지원합니다. 이를 지원하려면 서비스 체인과 호환되는 ERC-20/721 토큰 컨트랙트를 부모 체인 및 자식 체인 모두에 배포해야 합니다. ERC-20/721 토큰 컨트랙트 코드의 경우, 토큰 표준을 참조하세요.
배포
SCN은 아직 ERC-20/721 토큰을 배포하는 API를 지원하지 않습니다. caver-js를 통해 토큰을 배포해야 합니다. ERC-20/721 컨트랙트를 배포할 때는 올바른 브리지 오퍼레이터 계정을 사용해야 합니다. 메인 체인 배포에는 부모 오퍼레이터 계정을, 서비스 체인 배포에는 자식 오퍼레이터 계정을 사용하세요. 잘못된 계정으로 토큰 컨트랙트를 배포한 경우 밸류 전송이 작동하지 않으므로 올바른 계정으로 토큰 컨트랙트를 다시 배포해야 합니다.
등록
토큰 컨트랙트를 배포한 후에는 아래와 같이 부모/자식 체인에 있는 브리지 컨트랙트에 토큰 컨트랙트를 등록해야 합니다.
> subbridge.registerToken("0x27caeba831d98b5fbb1d81ce0ed20801702f443a", "0x22c41ae528627b790233d2e59ea520be12350eb5", "0x376b72abe1b29cace831bd3f5acdfa967814c9cd", "0x53160735f7cc6ff75e48619f368bb94daff66a1b")null
이 명령은 자식 체인 토큰("0x376b72abe1b29cace831bd3f5acdfa967814c9cd")을 자식 체인 브리지 컨트랙트("0x27caeba831d98b5fbb1d81ce0ed20801702f443a")와 함께 등록합니다. 이 단계에서는 부모 체인뿐만 아니라 자식 체인에 브리지 컨트랙트와 토큰 컨트랙트를 모두 배포합니다.
자세한 내용은 Service Chain API를 참조하세요.
밸류 전송 요청
이 섹션에서는 사용자가 밸류 전송을 요청하기 위해 호출할 컨트랙트 메서드에 대해 설명합니다. 요청 트랜잭션은 0 값을 허용하지 않습니다(KLAY/ERC-20).