Skip to content

Instantly share code, notes, and snippets.

@cgcardona
Created August 25, 2019 20:27
Show Gist options
  • Save cgcardona/be0ebe1b15758db4c98dae6ec27d4052 to your computer and use it in GitHub Desktop.
Save cgcardona/be0ebe1b15758db4c98dae6ec27d4052 to your computer and use it in GitHub Desktop.
Escrow CashScript Contract for blind escrow based on local.bitcoin.com
contract Escrow(
bytes20 sellerPHK, // Hash160 of seller's public key
bytes20 buyerPKH, // Hash160 of buyer's public key
bytes20 arbitratorPKH, // Hash160 of arbitrator's public key
bytes escrowKey // Nonce (just some unimportant random bytes unique per exchange)
) {
function spend(
sig spenderSig,
pubkey spenderPK,
datasig oracleSig,
pubkey oraclePK,
int actionByte
) {
bytes20 verifySpenderPKH = bytes20(0);
bytes20 verifyOraclePKH = bytes20(0);
if (actionByte == 1) {
// "releaseBySeller"
verifySpenderPKH = buyerPKH;
verifyOraclePKH = sellerPHK;
} else if (actionByte == 2) {
// "releaseByArbitrator"
verifySpenderPKH = buyerPKH;
verifyOraclePKH = arbitratorPKH;
require(spenderSig == spenderSig);
require(spenderPK == spenderPK);
require(oracleSig == oracleSig);
require(oraclePK == oraclePK);
require(actionByte == actionByte);
require(escrowKey == escrowKey);
} else if (actionByte == 3) {
// "returnByBuyer"
verifySpenderPKH = sellerPHK;
verifyOraclePKH = buyerPKH;
} else if (actionByte == 4) {
// "returnByArbitrator"
verifySpenderPKH = sellerPHK;
verifyOraclePKH = arbitratorPKH;
} else {
// Action byte is unknown; fail.
require(false);
}
require(hash160(oraclePK) == verifyOraclePKH);
require(hash160(spenderPK) == verifySpenderPKH);
// Construct message
bytes oracleMessage = escrowKey + bytes(actionByte);
// Verify oracle's signature
require(checkDataSig(oracleSig, oracleMessage, oraclePK));
// Verify spender's tx signature
require(checkSig(spenderSig, spenderPK));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment