ICS-20 for Corda¶
ICS-20概要¶
ICS-20 はIBC仕様の一部であり、 ブロックチェーン間のトークン転送を実現するIBC/APPプロトコルである。 パケット送受信とトークンのlock/unlock/burn/mint処理を同時実行することでブロックチェーン間のトークン送受信を実現する。 その手順は以下のとおりである。
Src: IBCパケット送信 + senderからescrowへトークンをlock
Dst: IBCパケット受信 + escrowからreceiverへバウチャートークンをmint
Dst: バウチャートークンを任意に所有権移転
Dst: IBCパケット送信 + sender’のバウチャートークンをburn
Src: IBCパケット受信 + escrowからreceiver’へトークンをunlock
ICS-20 for Corda設計(既存のCash stateを用いる場合)¶
要点¶
ICS-20では、escrowの役割を、特定のユーザではなく中立的機械であるスマートコントラクトに負わせることが前提になっている。
しかしCordaの既存asset(e.g. Cash)は、特定のユーザ(Node)によって所有されることしか想定されておらず、スマートコントラクトにlockしたりmintさせることは難しい。
そこで特定のNode(金融機関等)を信頼し、そのNodeにescrowの役割を演じてもらう。
以下ではこのNodeをBankと呼ぶこととする。
セキュリティ仮定¶
Srcチェーンにおいては、Cash発行は発行元によって適切に実施されているものとする(発行元への信頼)
Bank nodeはICS-20を通じてのみCashをlock(move)/unlock(move)/mint(issue)/burn(exit)するものとする(Bank nodeへの信頼)
手順¶
Src: IBCパケット送信 + senderからBank@SrcへCash@Srcをmove
Dst: IBCパケット受信 + Bank@DstからreceiverへCash@Dstをissue+move
Dst: Cash@Dstの任意のmove
Dst: IBCパケット送信 + sender’からBank@DstへCash@Dstをmove+exit
Src: IBCパケット受信 + Bank@Srcからreceiver’へCash@Srcをmove
詳細仕様¶
States¶
追加state class無し
Commands¶
-
class
HandleTransfer
(msg: MsgTransfer) ICS-20送金を指示するcommand class
-
Input states
[readonly] Host
[readonly] ClientState
[readonly] IbcConnection
IbcChannel
[複数可] Cash(owner = senderUser)
-
Output states
IbcChannel(packets += Pair(sequence, packet), nextSequenceSend += 1)
[複数可] Cash(owner = bankUser)
-
Contract rules
全てのInput/Output statesが同一のbaseIdを共有していること
全てのInput states(readonlyを除く)がOutput statesにも含まれること(IBCのstateは作成後に消去されることはないため)
packetの内容がCashの内容(ownerやdenominationやamount)と整合すること
その他ICS-20のcreateOutgoingPacketで規定されているルールに準拠すること
-
-
class
HandlePacketRecv
(msg: MsgRecvPacket) ICS-20受信を指示するcommand class
-
Input states
[readonly] Host
[readonly] ClientState
[readonly] IbcConnection
IbcChannel
[複数可] Cash(owner = bankUser)
-
Output states
IbcChannel
[複数可] Cash(owner = receiverUser)
-
Contract rules
全てのInput/Output statesが同一のbaseIdを共有していること
全てのInput states(readonlyを除く)がOutput statesにも含まれること(IBCのstateは作成後に消去されることはないため)
packetの内容がCashの内容(ownerやdenominationやamount)と整合すること
その他ICS-20のonRecvPacket及びICS-4のrecvPacketで規定されているルールに準拠すること
-
-
class
HandlePacketAcknowledgement
(msg: MsgAcknowledgement) ICS-20 ACK受信を指示するcommand class
-
Input states
[readonly] Host
[readonly] ClientState
[readonly] IbcConnection
IbcChannel
[複数可] Cash(owner = bankUser)
送金先でパケット受信が失敗した場合のみ返金のためCashを処理する
-
Output states
IbcChannel(packets -= sequence, nextSequenceAck +=1)
ORDERED channelの場合のみnextSequenceAckをインクリメント
[複数可] Cash(owner = senderUser)
送金先でパケット受信が失敗した場合のみ返金のためCashを処理する
-
Contract rules
全てのInput/Output statesが同一のbaseIdを共有していること
全てのInput states(readonlyを除く)がOutput statesにも含まれること(IBCのstateは作成後に消去されることはないため)
packetの内容がCashの内容(ownerやdenominationやamount)と整合すること
その他ICS-20のonAcknowledgePacket及びICS-4のacknowledgePacketで規定されているルールに準拠すること
-
Corda-IBCでの実装(ICS20専用のassetを定義する場合)¶
要点¶
専用のassetであればIBC/TAOと連動してトークンをlock/unlock/mint/burnさせることができ、特定のNodeを信頼せずに済む。
以下ではこのassetをICS20Cashと呼ぶこととする。
ICS20Cashのlock/unlock/mint/burnの管理を担うStateをBank stateと呼ぶことにする。
セキュリティ仮定¶
Srcチェーンにおいては、ICS20Cash発行は発行元によって適切に実施されている前提とする(発行元への信頼)
手順¶
Src: IBCパケット送信 + senderからBank@SrcへICS20Cash@Srcをlock
TX inputs
Bank: ICS20Cashのlock残高はN
ICS20Cash: 額面はM、所有者はsender@Src
TX outputs
Bank: ICS20Cashのlock残高はN + M
ICS20Cash: None(outputsに含めない)
Dst: IBCパケット受信 + Bank@DstからreceiverへICS20Cash@Dstをmint
TX inputs
Bank: ICS20Cashのmint残高はN
TX outputs
Bank: ICS20Cashのmint残高はN + M
ICS20Cash: 額面はM、所有者はreceiver@Dst
Dst: ICS20Cash@Dstの任意のmove
Dst: IBCパケット送信 + sender’からBank@DstへICS20Cash@Dstをburn
TX inputs
Bank: ICS20Cashのmint残高はN + M
ICS20Cash: 額面はM、所有者はsender’@Dst
TX outputs
Bank: ICS20Cashのmint残高はN
ICS20Cash: None(outputsに含めない)
Src: IBCパケット受信 + Bank@Srcからreceiver’へICS20Cash@Srcをunlock
TX inputs
Bank: ICS20Cashのlock残高はN + M’
TX outputs
Bank: ICS20Cashのmint残高はN
ICS20Cash: 額面はM’、所有者はreceiver’@Src
詳細仕様¶
States¶
Commands¶
-
class
HandleTransfer
(msg: MsgTransfer) ICS-20送金を指示するcommand class
-
Input states
[readonly] Host
[readonly] ClientState
[readonly] IbcConnection
IbcChannel
Bank
[複数可] ICS20Cash(owner = senderUser)
-
Output states
IbcChannel(packets += Pair(sequence, packet), nextSequenceSend += 1)
Bank(locked += Pair(denom, amount) または minted -= Pair(denom, amount))
-
Contract rules
全てのInput/Output statesが同一のbaseIdを共有していること
全てのInput states(readonlyを除く)がOutput statesにも含まれること(IBCのstateは作成後に消去されることはないため)
packetの内容がICS20Cashの内容(ownerやdenominationやamount)と整合すること
その他ICS-20のcreateOutgoingPacketで規定されているルールに準拠すること
-
-
class
HandlePacketRecv
(msg: MsgRecvPacket) ICS-20受信を指示するcommand class
-
Input states
[readonly] Host
[readonly] ClientState
[readonly] IbcConnection
IbcChannel
Bank
-
Output states
IbcChannel
Bank(minted += Pair(denom, amount) または locked -= Pair(denom, amount))
ICS20Cash(owner = receiverUser)
-
Contract rules
全てのInput/Output statesが同一のbaseIdを共有していること
全てのInput states(readonlyを除く)がOutput statesにも含まれること(IBCのstateは作成後に消去されることはないため)
packetの内容がICS20Cashの内容(ownerやdenominationやamount)と整合すること
その他ICS-20のonRecvPacket及びICS-4のrecvPacketで規定されているルールに準拠すること
-
-
class
HandlePacketAcknowledgement
(msg: MsgAcknowledgement) ICS-20 ACK受信を指示するcommand class
-
Input states
[readonly] Host
[readonly] ClientState
[readonly] IbcConnection
IbcChannel
Bank
送金先でパケット受信が失敗した場合のみ返金のためBank/ICS20Cashを処理する
-
Output states
IbcChannel(packets -= sequence, nextSequenceAck +=1)
ORDERED channelの場合のみnextSequenceAckをインクリメント
Bank(locked -= Pair(denom, amount) または minted += Pair(denom, amount))
ICS20Cash(owner = senderUser)
送金先でパケット受信が失敗した場合のみ返金のためBank/ICS20Cashを処理する
-
Contract rules
全てのInput/Output statesが同一のbaseIdを共有していること
全てのInput states(readonlyを除く)がOutput statesにも含まれること(IBCのstateは作成後に消去されることはないため)
packetの内容がICS20Cashの内容(ownerやdenominationやamount)と整合すること
その他ICS-20のonAcknowledgePacket及びICS-4のacknowledgePacketで規定されているルールに準拠すること
-