test with invalid crypto-condition fulfillment
This commit is contained in:
@@ -1,40 +1,100 @@
|
||||
import sys
|
||||
import time
|
||||
import json
|
||||
import logging
|
||||
import binascii
|
||||
from testsupport import *
|
||||
|
||||
|
||||
def test_basic_spend():
|
||||
@fanout_input(0)
|
||||
def test_basic_spend(inp):
|
||||
spend0 = {
|
||||
'inputs': [
|
||||
{'txid': fanout, 'idx': 0, 'script': {'address': notary_addr}}
|
||||
],
|
||||
'inputs': [inp],
|
||||
"outputs": [
|
||||
{"amount": 500, "script": {"condition": cond_alice}},
|
||||
{"amount": 500, "script": {"address": notary_addr}}
|
||||
]
|
||||
}
|
||||
|
||||
spend0_txid = sign_and_submit(spend0)
|
||||
|
||||
spend0_txid = submit(sign(spend0))
|
||||
spend1 = {
|
||||
'inputs': [
|
||||
{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}},
|
||||
{'txid': spend0_txid, 'idx': 1, 'script': {'address': notary_addr}}
|
||||
],
|
||||
'outputs': [
|
||||
{"amount": 1000, "script": {"address": notary_addr}}
|
||||
]
|
||||
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
||||
}
|
||||
|
||||
spend1_txid = sign_and_submit(spend1)
|
||||
|
||||
spend1_txid = submit(sign(spend1))
|
||||
assert rpc.getrawtransaction(spend1_txid)
|
||||
|
||||
print("all done!")
|
||||
|
||||
@fanout_input(1)
|
||||
def test_fulfillment_wrong_signature(inp):
|
||||
spend0 = {
|
||||
'inputs': [inp],
|
||||
"outputs": [{"amount": 1000, "script": {"condition": cond_bob}}]
|
||||
}
|
||||
spend0_txid = submit(sign(spend0))
|
||||
spend1 = {
|
||||
'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}],
|
||||
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
||||
}
|
||||
|
||||
signed = sign(spend1)
|
||||
# Set the correct pubkey, signature is wrong
|
||||
signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk
|
||||
|
||||
try:
|
||||
assert not submit(sign(spend1)), 'should raise an error'
|
||||
except RPCError as e:
|
||||
assert '16: mandatory-script-verify-flag-failed' in str(e), str(e)
|
||||
|
||||
|
||||
@fanout_input(2)
|
||||
def test_fulfillment_wrong_pubkey(inp):
|
||||
spend0 = {
|
||||
'inputs': [inp],
|
||||
"outputs": [{"amount": 1000, "script": {"condition": cond_alice}}]
|
||||
}
|
||||
spend0_txid = submit(sign(spend0))
|
||||
spend1 = {
|
||||
'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': {"fulfillment": cond_alice}}],
|
||||
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
||||
}
|
||||
|
||||
signed = sign(spend1)
|
||||
# Set the wrong pubkey, signature is correct
|
||||
signed['tx']['inputs'][0]['script']['fulfillment']['publicKey'] = bob_pk
|
||||
|
||||
try:
|
||||
assert not submit(signed), 'should raise an error'
|
||||
except RPCError as e:
|
||||
assert '16: mandatory-script-verify-flag-failed' in str(e), str(e)
|
||||
|
||||
|
||||
@fanout_input(3)
|
||||
def test_fulfillment_invalid_fulfillment(inp):
|
||||
spend0 = {
|
||||
'inputs': [inp],
|
||||
"outputs": [{"amount": 1000, "script": {"condition": cond_alice}}]
|
||||
}
|
||||
spend0_txid = submit(sign(spend0))
|
||||
|
||||
# Create a valid script with an invalid fulfillment payload
|
||||
script = binascii.hexlify(b"\007invalid").decode('utf-8')
|
||||
|
||||
spend1 = {
|
||||
'inputs': [{'txid': spend0_txid, 'idx': 0, 'script': script}],
|
||||
'outputs': [{"amount": 1000, "script": {"address": notary_addr}}]
|
||||
}
|
||||
|
||||
try:
|
||||
assert not submit({'tx': spend1}), 'should raise an error'
|
||||
except RPCError as e:
|
||||
assert 'Crypto-Condition payload is invalid' in str(e), str(e)
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
fanout = setup()
|
||||
test_basic_spend()
|
||||
for name, f in globals().items():
|
||||
if name.startswith('test_'):
|
||||
logging.info("Running test: %s" % name)
|
||||
f()
|
||||
|
||||
Reference in New Issue
Block a user