The interfaces in this proposal model a functional transaction scheme to establish a secure delivery-versus-payment
across two blockchains, where a) no intermediary is required and b) one of the two chains
can securely interact with a stateless “decryption oracle”. Here, delivery-versus-payment refers to the exchange of,
e.g., an asset against a payment; however, the concept is generic to make a transfer of one token on one
chain (e.g., the payment) conditional to the successful transfer of another token on another chain (e.g., the asset).
The scheme is realized by two smart contracts, one on each chain.
One smart contract implements the ILockingContract interface on one chain (e.g. the “asset chain”), and another smart contract implements the IDecryptionContract interface on the other chain (e.g., the “payment chain”).
The smart contract implementing ILockingContract locks a token (e.g., the asset) on its chain until a key is presented to encrypt to one of two given values.
The smart contract implementing IDecryptionContract, decrypts one of two keys (via the decryption oracle) conditional to the success or failure of the token transfer (e.g., the payment). A stateless decryption oracle is attached to the chain running IDecryptionContract for the decryption.
Motivation
Within the domain of financial transactions and distributed ledger technology (DLT), the Hash-Linked Contract (HLC) concept has been recognized as valuable and has been thoroughly investigated.
The concept may help to solve the challenge of delivery-versus-payment (DvP), especially in cases where the asset chain and payment system (which may be a chain, too) are separated.
A prominent application of smart contracts realizing a secure DvP is that of buying an asset, where the asset is managed on one chain (the asset chain), but the payments are executed on another chain (the payment chain).
Proposed solutions are based on an API-based interaction mechanism which bridges the communication between a so-called asset chain and a corresponding
payment system or requires complex and problematic time-locks.1
Here, we propose a protocol that facilitates secure delivery-versus-payment with less overhead, especially with a stateless oracle.2
Specification
Methods
Smart Contract on the chain that performs the locking (e.g. the asset chain)
The following methods specify the functionality of the smart contract implementing
the locking. For further information, please also look at the interface
documentation ILockingContract.sol.
Called from the buyer of the token to initiate token transfer. Emits a TransferIncepted event.
The parameter id is an identifier of the trade. The parameter from is the address of the seller (the address of the buyer is msg.sender).
The parameter keyEncryptedSeller is an encryption of the key that can be used by the seller to (re-)claim the token. See below on “encryption”.
Called from the seller of the token to confirm token transfer. Emits a TransferConfirmed event.
The parameter id is an identifier of the trade. The parameter to is the address of the buyer (the address of the seller is msg.sender).
The parameter keyEncryptedBuyer is an encryption of the key that can be used by the buyer to claim the token.
If the trade specification, that is, the quadruppel (id, amount, from, to), in a call to confirmTransfer
matches that of a previous call to inceptTransfer, and the balance is sufficient, the corresponding amount
of tokens is locked (transferred from from to the smart contract) and TransferConfirmed is emitted.
Called from either the buyer or the seller of the token
of the trade with id id.
If the method is called from the buyer (to) and the encryption of key matches keyEncryptedBuyer,
then the locked tokens are transferred to the buyer (to). This emits TokenClaimed.
If the method is called from the seller (from) and the encryption of key matches keyEncryptedSeller,
then the locked tokens are transferred (back) to the seller (to). This emits TokenReclaimed.
Smart Contract on the other chain that performs the conditional decryption (e.g. the payment chain)
The following methods specify the functionality of the smart contract implementing
the conditional decryption. For further information, please also look at the interface
documentation IDecryptionContract.sol.
Called from the receiver of the amount to initiate payment transfer. Emits a PaymentTransferIncepted.
The parameter id is an identifier of the trade. The parameter from is the address of the sender of the payment (the address of the receiver is msg.sender).
The parameter keyEncryptedSuccess is an encryption of the key and will be decrypted if the transfer is successful in a call to transferAndDecrypt.
The parameter keyEncryptedFailure is an encryption of the key and will be decrypted if the transfer fails in a call to transferAndDecrypt or if cancelAndDecryptis successful.
Called from the sender of the amount to initiate completion of the payment transfer. Emits a TransferKeyRequested and TransferKeyReleased with keys depending on completion success.
The parameter id is an identifier of the trade. The parameter to is the address of the receiver of the payment (the sender of the payment (from) is implicitly the msg.sender).
The parameter keyEncryptedSuccess is an encryption of the key and will be decrypted if the transfer is successful.
The parameter keyEncryptedFailure is an encryption of the key and will be decrypted if the transfer failed.
The method will not decrypt any key and not perfrom a transfer of a payment if the values (id, amount, fromto, keyEncryptedSuccess, keyEncryptedFailure)
do not match a previous call to inceptTransfer.
The linkage of the two smart contract relies on use of a key and encryptedKey.
The implementation is free to support several encryption methods for
as long as the decryption oracle supports it.
The encryption is performed with the public key of
the decryption oracle, which is known to both parties.
It is implicitly assumed that the two parties may check that
the strings keyEncryptedBuyer and keyEncryptedSeller are
in a valid format.
Sequence diagram of delivery versus payment
The interplay of the two smart contracts is summarized
in the following sequence diagram:
Rationale
The protocol tries to be parsimonious. The transfer
is associated with a (preferable unique) id possibly
generated by some additional interaction of the trading
parties.
The key and the encryptedKey arguments are strings to
allow the flexible use of different encryption schemes.
The decryption/encryption scheme should be inferable from the contents
of the encryptedKey.