Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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