def test_TestTransactionPushOutput(): handle = utils.makeEmptyTransaction() a = utils.makeAddress() assert skycoin.SKY_coin_Transaction_PushOutput( handle, a, 100, 150) == skycoin.SKY_OK err, count = skycoin.SKY_coin_Transaction_GetOutputsCount(handle) assert err == skycoin.SKY_OK assert count == 1 pOut1 = skycoin.coin__TransactionOutput() pOut = skycoin.coin__TransactionOutput() pOut1.Address = a pOut1.Coins = 100 pOut1.Hours = 150 assert skycoin.SKY_coin_Transaction_GetOutputAt( handle, 0, pOut) == skycoin.SKY_OK assert pOut == pOut1 for i in range(1, 20): a = utils.makeAddress() assert skycoin.SKY_coin_Transaction_PushOutput( handle, a, int(i * 100), int(i * 50)) == skycoin.SKY_OK err, count = skycoin.SKY_coin_Transaction_GetOutputsCount(handle) assert err == skycoin.SKY_OK assert count == int(i + 1) pOut1.Address = a pOut1.Coins = int(i * 100) pOut1.Hours = int(i * 150) assert skycoin.SKY_coin_Transaction_GetOutputAt( handle, i, pOut) == skycoin.SKY_OK assert pOut == pOut i += 1
def test_TestTransactionHashInner(): handle, tx = utils.makeTransaction() h = skycoin.cipher_SHA256() assert skycoin.SKY_coin_Transaction_HashInner(handle, h) == skycoin.SKY_OK assert h != skycoin.cipher_SHA256() # If tx.In is changed, hash should change handle2, tx2 = utils.copyTransaction(handle) ux = utils.makeUxOut() h = skycoin.cipher_SHA256() h1 = skycoin.cipher_SHA256() assert skycoin.SKY_coin_UxOut_Hash(ux, h) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_SetInputAt( handle2, 0, h) == skycoin.SKY_OK assert tx != tx2 assert skycoin.SKY_coin_UxOut_Hash(ux, h1) == skycoin.SKY_OK assert h == h1 assert skycoin.SKY_coin_Transaction_HashInner(handle, h) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_HashInner( handle2, h1) == skycoin.SKY_OK assert h != h1 # If tx.Out is changed, hash should change handle2, tx2 = utils.copyTransaction(handle) a = utils.makeAddress() a2 = skycoin.cipher__Address() pOut = skycoin.coin__TransactionOutput() assert skycoin.SKY_coin_Transaction_GetOutputAt( handle2, 0, pOut) == skycoin.SKY_OK pOut.Address = a assert skycoin.SKY_coin_Transaction_SetOutputAt( handle2, 0, pOut) == skycoin.SKY_OK assert tx != tx2 assert skycoin.SKY_coin_Transaction_GetOutputAt( handle2, 0, pOut) == skycoin.SKY_OK assert pOut.Address == a sha1 = skycoin.cipher_SHA256() sha2 = skycoin.cipher_SHA256() assert skycoin.SKY_coin_Transaction_HashInner( handle, sha1) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_HashInner( handle2, sha2) == skycoin.SKY_OK assert sha1 != sha2 # If tx.Head is changed, hash should not change handle2, tx2 = utils.copyTransaction(handle) sig = skycoin.cipher_Sig() assert skycoin.SKY_coin_Transaction_PushSignature( handle, sig) == skycoin.SKY_OK sha1 = skycoin.cipher_SHA256() sha2 = skycoin.cipher_SHA256() assert skycoin.SKY_coin_Transaction_HashInner( handle, sha1) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_HashInner( handle2, sha2) == skycoin.SKY_OK assert sha1 == sha2
def test_TestTransactionVerify(): # Mismatch header hash handle, tx = utils.makeTransaction() h = skycoin.cipher_SHA256() h.assignTo(tx.InnerHash) assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # No inputs handle, tx = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_ResetInputs( handle, 0) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # No outputs handle, _ = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_ResetOutputs( handle, 0) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # Invalid number of Sigs handle, _ = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_ResetSignatures( handle, 0) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR assert skycoin.SKY_coin_Transaction_ResetSignatures( handle, 20) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # Too many sigs & inputs handle, _ = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_ResetSignatures( handle, utils.MaxUint16) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_ResetInputs( handle, utils.MaxUint16) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # Duplicate inputs ux, s = utils.makeUxOutWithSecret() handle, _ = utils.makeTransactionFromUxOut(ux, s) h = skycoin.cipher_SHA256() assert skycoin.SKY_coin_Transaction_GetInputAt( handle, 0, h) == skycoin.SKY_OK err, _ = skycoin.SKY_coin_Transaction_PushInput(handle, h) assert err == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_ResetSignatures( handle, 0) == skycoin.SKY_OK secKeys = [] secKeys.append(s) secKeys.append(s) assert skycoin.SKY_coin_Transaction_SignInputs( handle, secKeys) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # Duplicate outputs handle, _ = utils.makeTransaction() pOutput = skycoin.coin__TransactionOutput() assert skycoin.SKY_coin_Transaction_GetOutputAt( handle, 0, pOutput) == skycoin.SKY_OK pOutput.Address = skycoin.cipher__Address() assert skycoin.SKY_coin_Transaction_ResetOutputs( handle, 0) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_PushOutput( handle, pOutput.Address, pOutput.Coins, pOutput.Hours) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_PushOutput( handle, pOutput.Address, pOutput.Coins, pOutput.Hours) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # Output coins are 0 handle, _ = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_GetOutputAt( handle, 0, pOutput) == skycoin.SKY_OK pOutput.Coins = 0 assert skycoin.SKY_coin_Transaction_ResetOutputs( handle, 0) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_PushOutput( handle, pOutput.Address, pOutput.Coins, pOutput.Hours) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # Output coin overflow handle, _ = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_GetOutputAt( handle, 0, pOutput) == skycoin.SKY_OK pOutput.Coins = int(utils.MaxUint64 - int(3e6)) assert skycoin.SKY_coin_Transaction_PushOutput( handle, pOutput.Address, pOutput.Coins, pOutput.Hours) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_ERROR # Output coins are not multiples of 1e6 (valid, decimal restriction is not # enforced here) handle, _ = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_GetOutputAt( handle, 0, pOutput) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_ResetOutputs( handle, 0) == skycoin.SKY_OK pOutput.Coins += 10 assert skycoin.SKY_coin_Transaction_PushOutput( handle, pOutput.Address, pOutput.Coins, pOutput.Hours) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_ResetSignatures( handle, 0) == skycoin.SKY_OK p = skycoin.cipher_PubKey() s = skycoin.cipher_SecKey() assert skycoin.SKY_cipher_GenerateKeyPair(p, s) == skycoin.SKY_OK secKeys = [] secKeys.append(s) assert skycoin.SKY_coin_Transaction_SignInputs( handle, secKeys) == skycoin.SKY_OK assert int(pOutput.Coins % int(1e6)) != int(0) assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_OK # Valid handle, _ = utils.makeTransaction() assert skycoin.SKY_coin_Transaction_GetOutputAt( handle, 0, pOutput) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_ResetOutputs( handle, 0) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_PushOutput( handle, pOutput.Address, int(10e6), pOutput.Hours) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_PushOutput( handle, pOutput.Address, int(1e6), pOutput.Hours) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_UpdateHeader(handle) == skycoin.SKY_OK assert skycoin.SKY_coin_Transaction_Verify(handle) == skycoin.SKY_OK