Commit Graph

566 Commits

Author SHA1 Message Date
Andrew Poelstra 1d78dccb9e Checkpoint commit -- we're onto move errors :D 2015-04-10 13:34:31 -05:00
Andrew Poelstra e658ffaeea Rename ScriptBuilder to Builder as per rustc rfc PR 1036 2015-04-09 23:23:56 -05:00
Andrew Poelstra 5350207ff3 Remove hamcrest; add rust-serde (not compiling right now) 2015-04-09 23:23:53 -05:00
Andrew Poelstra e5a3e84c41 Checkpoint commit (nope, not yet to small commit sizes :))
This is mostly fixing compile errors in `cargo test`. We are down
to 3 in `cargo build` and 14 in `cargo test`, at least for this
round.
2015-04-08 17:23:45 -05:00
Andrew Poelstra 08a20f8764 Checkpoint commit
Work is stalled on some other library work (to give better lifetime
requirements on `eventual::Future` and avoid some unsafety), so
committing here.

There are only three errors left in this round :)

Also all the indenting is done, so there should be no more massive
rewrite commits. Depending how invasive the lifetime-error fixes
are, I may even be able to do sanely sized commits from here on.
2015-04-07 17:52:58 -05:00
Andrew Poelstra 200e0fe8e3 Checkpoint commit
27 files changed, 3944 insertions(+), 3812 deletions(-) :} I've
started doing whitespace changes as well, I want everything to
be 4-space tabs from now on.
2015-04-06 20:51:11 -05:00
Andrew Poelstra 811df8a713 Giant collection of fixes ... we are into lifetime errors now :) 2015-04-05 19:10:37 -05:00
Andrew Poelstra 7b89c15ed5 More changes, incl. dropping DumbHasher in favor of SipHasher
only json stuff left in this round of compiler errors :)
2015-04-05 14:43:44 -05:00
Andrew Poelstra 7738722ab5 Checkpoint commit; tons of disorganized changes for rustc
BTW after all this is done I'm gonna indent the entire codebase...
so `git blame` is gonna be totally broken anyway, hence my
capricious cadence of commits.
2015-04-05 12:58:49 -05:00
Andrew Poelstra 160f2f9ea6 Drop ThinVec, many other changes toward updating for librustc 2015-04-04 22:13:19 -05:00
Andrew Poelstra 7a2cfe95e7 Minor fixes to namespaces 2015-04-04 13:56:30 -05:00
Andrew Poelstra a62a7d736c Several more changes for librustc changes 2015-04-04 13:08:49 -05:00
Andrew Poelstra 467f76a37d MemReader/MemWriter become Cursor, other rustc changes 2015-04-04 12:56:40 -05:00
Andrew Poelstra f1aed644c6 More misc cleanup for rustc changes 2015-03-26 14:21:48 -05:00
Andrew Poelstra 0bf5809674 Add time crate 2015-03-26 11:53:49 -05:00
Andrew Poelstra 6db25db975 Bunch of error type changes 2015-03-26 11:52:20 -05:00
Andrew Poelstra 719f616218 Some more renames for librustc changes 2015-03-26 10:44:49 -05:00
Andrew Poelstra 11dbc717c4 Show -> Debug 2015-03-26 10:35:31 -05:00
Andrew Poelstra df065c143b fix attributes for compiler changes 2015-03-26 10:31:19 -05:00
Andrew Poelstra 2101e4a56d Rename bitcoin-secp256k1-rs to secp256k1 2015-03-26 10:08:36 -05:00
Andrew Poelstra c3377032f8 Many syntax changes for rustc, incomplete 2015-01-18 17:39:51 -06:00
Andrew Poelstra 97bfbe790b Add a `clone` to script sat-checker to satisfy new soundness rules
This was actually a soundness bug waiting to happen fwiw...but I'm
still not so happy about it.
2014-09-11 08:03:36 -05:00
Andrew Poelstra e0c9844ff2 Make UtxoSet store (height, txo) pairs rather than just the raw txo
Will take some experimentation to see if this is what I want the API
to be, if the memory usage is acceptable, etc.

This will force a total reindex for wizards-wallet users.

[breaking-change]
2014-09-10 19:58:58 -05:00
Andrew Poelstra 184721db61 Add wallet balance-checking support 2014-09-10 07:19:12 -05:00
Andrew Poelstra ef11e8273b Destroy socket listener on error rather than trying to reconnect; add #derivings
Reconnecting an existing socket simply was not working; the Rust socket
did not expose any methods for reconnection, so I simply tried calling
connect() again. As near as I can tell, this was a no-op --- which makes
sense because both the sending and receiving threads had their own copy
of the Socket, and it's not clear what the synchronization behaviour
should have been.

Instead if the connection fails, we relay this information to the main
thread, wait for an acknowledgement, then simply destroy the listening
thread. The caller can then simply call `start()` again.
2014-09-10 07:15:48 -05:00
Andrew Poelstra 1f41a67194 Make Address public 2014-09-06 11:47:18 -05:00
Andrew Poelstra 2aeb373e73 Fix encode/decode of ChildNumber so that hardened keys do not become normal ones 2014-09-06 11:35:36 -05:00
Andrew Poelstra a240d25611 Wallet support for address creation 2014-09-06 10:30:11 -05:00
Andrew Poelstra 9f56b9c57f Fix wallet serialization to not use "" as a key anywhere
Turns out TOML does not support tables named "", so we instead encode
the accounts list as an array rather than a name-keyed hashmap. This
is fine since the account name is in the account structure itself
anyway.
2014-09-05 11:55:25 -05:00
Andrew Poelstra bc7077fac4 Encodable/Decodable improvements; add `user_enum` macro for string enums 2014-09-05 09:16:22 -05:00
Andrew Poelstra 331e555e4c Use `verify_raw` rather than `verify` to check signatures
`verify` cannot handle illegally padded signatures because it takes an object
of type `Signature`, which is a fixed-size type. This should have been part
of the previous commit --- an important lesson about running the unit tests
before every push!
2014-09-04 20:34:58 -05:00
Andrew Poelstra 20ce3721b7 Fix for upstream 2014-09-04 19:06:52 -05:00
Andrew Poelstra c25862a107 Change UtxoSet to use full TXID as key
Sorry, this is needed to enable proper txid/vout lookups for the address index.
This means any users of wizards-wallet need to rebuild their utxo sets, and
will also mean an increase in RAM usage.
2014-09-02 09:37:31 -05:00
Andrew Poelstra 6250f4fd9c Checkpoint commit -- prefix-filtered address indexing works 2014-09-01 21:37:00 -05:00
Andrew Poelstra 4629472d69 Block in wallet support 2014-09-01 15:11:38 -05:00
Andrew Poelstra f66b4ff6b3 Fix for upstream, add some address generation benchmarks 2014-09-01 09:24:17 -07:00
Andrew Poelstra 931df9f68d Add Address support 2014-08-31 19:24:31 -07:00
Andrew Poelstra 853d644649 Minor cleanup for script analyzer 2014-08-31 19:20:11 -07:00
Andrew Poelstra a8ecf00e35 Fix recursion to carry the execution state stack 2014-08-31 16:55:39 -07:00
Andrew Poelstra 9d283150c9 Fix GT/LT/GTEQ/LTEQ handling to not compare bools
I was trying to do something clever by making sure that the numeric
bounds were consistent with whatever ordering relation we were checking,
AND that the boolean values were also consistent...this is Wrong is the
case of negative numbers, and pointless anyway since I recently fixed
`set_bool_value`, `set_num_lo` and `set_num_hi` to update both numeric
and boolean information if possible, so they will always contain the
same info.
2014-08-31 16:43:26 -07:00
Andrew Poelstra 1515f68748 Minor cleanup of utxoset input checking 2014-08-31 16:35:30 -07:00
Andrew Poelstra d880bd1ccc Ensure execution state stack is empty at the start
We had a single `true` on the execution state stack, which would
allow scripts to have one more OP_ENDIF than they are allowed.
2014-08-31 16:23:47 -07:00
Andrew Poelstra 340b569c73 Add much more agressive provably-false checker
Now unspendable outs are determined by attempting to create a minimal
satisfying input script. If this can't be done, the output is unspendable.
(Unfortunately this "minimal satisfying script" is not (yet) something
that can be shown to the user, since it is more a bundle of constraints
than actual data pushes.)

Current limitations:
  - OP_ADD and friends mean the checker gives the script a free pass.
    There is no fundamental reason for this, I just didn't get to it
    yet.

  - Pubkeys are checked for DER encoding but signatures aren't. This
    is because secp256k1 exposes a method for pubkeys, but not one
    for sigs :). Signatures are loosely length checked.
2014-08-31 16:01:24 -07:00
Andrew Poelstra 8f5c28a533 Fixes for rustc changes 2014-08-30 16:08:38 -07:00
Andrew Poelstra 38f8132067 Fix for upstream 2014-08-28 11:13:33 -07:00
Andrew Poelstra 6bf553c6fe Add BIP32 key support; unify array newtyping; improve base58 trait
Sorry for so many things in one commit ... it was an iterative
process depending as I worked on BIP32 to get the other stuff
working. (And I was too lazy to separate it out after the fact.)

A breaking change by the array newtyping is that Show for Sha256dHash
now outputs the slice Show. You have to use `{:x}` to get the old hex
output.
2014-08-28 09:49:03 -07:00
Andrew Poelstra 4ab69b8a77 script tracer: add `op_count` a running opcode count 2014-08-25 21:39:16 -07:00
Andrew Poelstra 46bffa304c script tracer: Put an obvious "opcode failed" message in the pre-execute stack 2014-08-25 16:09:00 -07:00
Andrew Poelstra 47c346be71 Add base58 decode/encode functionality 2014-08-24 23:03:47 -07:00
Andrew Poelstra 688a77ef38 Rename Hash->Uint functions to denote endianness 2014-08-24 12:28:02 -07:00
Andrew Poelstra 3a921e6b9c Add support for `tx` messages 2014-08-23 16:37:01 -07:00
Andrew Poelstra 4ba533514e Add Default impl to Script 2014-08-23 16:20:46 -07:00
Andrew Poelstra 6e6da2a756 Allow transaction inputs to be validated individually 2014-08-23 15:09:50 -07:00
Andrew Poelstra 7eadf72a1a Add serialize_hex method to do string conversion for serializations 2014-08-22 20:53:49 -07:00
Andrew Poelstra 18a61dd560 Add blockdata::constants::max_money 2014-08-22 20:29:16 -07:00
Andrew Poelstra e3445ebef7 Pull script tracing code out of Transcation so it can be used independently 2014-08-22 12:14:39 -07:00
Andrew Poelstra 611b1f57c9 Add a bunch of small hashtypes for cheap'n'collidey hashtables 2014-08-22 11:32:42 -07:00
Andrew Poelstra 1522ab841d Generalize consensus encode/decoders for HashMap 2014-08-18 19:49:09 -07:00
Andrew Poelstra e29fdb90c8 fix for upstream 2014-08-18 18:04:32 -07:00
Andrew Poelstra d3ef264b44 Add txid to transaction trace 2014-08-17 17:25:47 -07:00
Andrew Poelstra 7059c21ef4 tx trace: add `executed` boolean, add a trace even for ops that fail 2014-08-17 13:35:57 -07:00
Andrew Poelstra 09679b8d9f Add a copy of the script to ScriptTrace 2014-08-16 19:21:07 -07:00
Andrew Poelstra 62dd2e7cee Add transaction trace capability for debugging scripts 2014-08-16 19:04:57 -07:00
Andrew Poelstra 8d1a3e1f7c Some error improvements 2014-08-16 13:33:13 -07:00
Andrew Poelstra 4c99653933 Move TX validation into Transaction, call from UtxoSet 2014-08-16 12:57:39 -07:00
Andrew Poelstra 8a814e4331 Add P2SH support 2014-08-15 17:37:40 -07:00
Andrew Poelstra fa859b3490 Fix VERIFY-op handling in provably-unspendable code 2014-08-14 20:32:36 -07:00
Andrew Poelstra 07c3d335aa Return proper errors from UtxoSet::update 2014-08-14 20:17:41 -07:00
Andrew Poelstra 61969ce6ee Fix overflow in script 2014-08-14 20:09:54 -07:00
Andrew Poelstra c28c261b74 utxoset: Fix parallel script checking to use only as many threads as CPUs 2014-08-14 17:20:43 -07:00
Andrew Poelstra fc04462682 Implement pruning 2014-08-14 17:05:07 -07:00
Andrew Poelstra d9d7416e32 Fixes for recent stdlib changes 2014-08-14 15:20:39 -07:00
Andrew Poelstra 8e7d763310 Parallelize transaction verification in utxoset
We no longer confirm that chained transactions occur in the correct order
in blocks, which is a minor consensus regression and should be dealt with
in future.
2014-08-13 23:42:01 -07:00
Andrew Poelstra cfe7d5eb26 Use slices rather than allocations in most parts of script 2014-08-13 20:25:28 -07:00
Andrew Poelstra 886dd68eb7 Minor correction to opcode docs 2014-08-12 22:50:40 -07:00
Andrew Poelstra 526f9fc574 Remove -all- CODESEPARATORS before serializing the script, even though only one has effect
I can validate the whole testnet chain now :) onto P2SH!
2014-08-12 21:34:46 -07:00
Andrew Poelstra 29d0701faa Fix off-by-one error handling OP_CODESEPARATOR 2014-08-11 22:43:24 -07:00
Andrew Poelstra 38593dd2ab Remove entire signature push operation, not just signature data, when hashing for checksig 2014-08-11 21:40:30 -07:00
Andrew Poelstra dea6d457f4 Clean up `read_uint` as in PR #2 (thanks @jkozera) 2014-08-11 19:20:39 -07:00
Andrew Poelstra 3e25134b2f Added unit tests for three more testnet failures, the latter of which I'm still working on 2014-08-11 19:17:58 -07:00
Andrew Poelstra a87dd0042b Get OP_MULTISIG working 2014-08-10 21:37:12 -07:00
Andrew Poelstra bf09ab2754 Fix script bugs (can now fully validate testnet up to multisig) 2014-08-10 19:35:58 -07:00
Andrew Poelstra e01e9ad3be Implement CHECKSIG and CHECKSIGVERIFY
Still need the multisig ops, and p2sh
2014-08-10 13:51:05 -07:00
Andrew Poelstra ecdb750148 Implement script except for crypto opcodes, replace zero_hash by Default
Looks like to implement the crypto opcodes I may need to switch from
rust-crypto to rust-openssl.. or implement RIPEMD-160 for rust-crypto.
In either case I will need to generalize the hash.rs stuff to support
other hashes, so I'm committing here as a checkpoint before doing all
that.
2014-08-05 19:08:06 -07:00
Andrew Poelstra 2986e1f983 Fix for new partial-move rules; swap hash le_hex_string and be_hex_string
I noticed that the little/big endian hex string functions for Sha256dHash
did not match my intuition. What we should have is that the raw bytes
correspond to a little-endian representation (since we convert to Uint256
by transmuting, and Uint256's have little-endian representation) while
the reversed raw bytes are big-endian.

This means that the output from `sha256sum` is "little-endian", while the
standard "zeros on the left" output from bitcoind is "big-endian". This
is correct since we think of blockhashes as being "below the target" when
they have lots of zeros on the left, and we also notice that when hashing
Bitcoin objects with sha256sum that the output hashes are always reversed.

These two functions le_hex_string and be_hex_string should really not be
used outside of the library; the Encodable trait should give access to a
"big endian" representation while ConsensusEncodable gives access to a
"little endian" representation. That way we describe the split in terms
of user-facing/consensus code rather than big/little endian code, which
is a better way of thinking about it. After all, a hash is a collection
of bytes, not a number --- it doesn't have an intrinsic endianness.

Oh, and by the way, to compute a sha256d hash from sha256sum, you do

  echo -n 'data' | sha256sum | xxd -r -p | sha256dsum
2014-08-03 14:52:59 -07:00
Andrew Poelstra 474d04d154 Manually implement Encodable/Decodable/Show for Network
Since TOML will not encode C-like enums as strings, we do it
ourselves. This is also worthwhile so that we can get the
lowercase "bitcoin" and "testnet" as encodings for the actual
enum values, which are more verbose and camel case.
2014-08-03 06:29:19 -07:00
Andrew Poelstra a6eb33efd0 Actually encode network message
A pretty serious oversight :) this was not noticed because I was
simultaneously dealing with a serious tcp connection bug in rustc,
and I had thought bitcoind's angry disconnects were a further
symptom of that.
2014-08-02 18:22:27 -07:00
Andrew Poelstra 275c93ab6b Add docs for SimpleDecoder and SimpleEncoder traits 2014-08-01 11:16:18 -07:00
Andrew Poelstra c80ec9bda8 Sha256dHash: add string encoder/decoder 2014-08-01 10:52:10 -07:00
Andrew Poelstra a2ce000b2b Revamp Serializable interface to be similar to Encoder/Encodable
This is a massive simplification, fixes a couple endianness bugs (though
not all of them I don't think), should give a speedup, gets rid of the
`serialize_iter` crap.
2014-08-01 09:01:39 -07:00
Andrew Poelstra 020295f8c9 Add a bunch of traits to Network so I can use it as a HashMap key 2014-07-29 15:55:25 -07:00
Andrew Poelstra 8cd8947cf3 Implement some more ToJson's 2014-07-29 10:19:21 -07:00
Andrew Poelstra a34f2642f1 Implement ToJson for BlockHeader
I think this is what I want to do for everything json-visible...perhaps
I will not be able to keep the macro for it though, since there are
some clever variations on it (e.g. blocks should have their header's
hash as a field, txes should appear as txids unless vebose output is
requested, etc.)
2014-07-28 20:12:10 -07:00
Andrew Poelstra 1938959017 Add `genesis_hash` function to Blockchain 2014-07-28 12:30:45 -07:00
Andrew Poelstra 6f7e73d6b4 Fix nu_select! macro for borrowck 2014-07-26 19:36:38 -07:00
Andrew Poelstra 322c937c3c Fixed borrowck problems with nu_select! in an evil way 2014-07-26 11:28:55 -07:00
Andrew Poelstra b5b7a6b080 Another workaround for https://github.com/rust-lang/rust/issues/15763 2014-07-25 16:50:58 -07:00
Andrew Poelstra cc942a47f3 Workaround for rustc hiccup in `for` loop restructuring, remove assert from deserialization code
Thanks to the assert change there is a segfault happening :(
2014-07-25 15:52:48 -07:00
Andrew Poelstra 128ebcc6d5 Fix comment in UTXOset for stxo cache ordering 2014-07-25 14:35:46 -07:00
Andrew Poelstra 44dc29f013 Fix BIP30 rewind handling; add unsafe annotations to ThinVec::reserve 2014-07-25 12:44:54 -07:00
Andrew Poelstra fe9ca39736 Send new handshake on reconnect 2014-07-24 12:52:28 -07:00
Andrew Poelstra 809bad5ff5 Reconnect on network errors; use Mutexes to control Socket access more precisely 2014-07-24 08:27:40 -07:00
Andrew Poelstra 9be493eeaf Move Local::take() into a scope where it is guaranteed to be used
This was causing a mystery crash. Fixed.
2014-07-23 15:19:44 -07:00
Andrew Poelstra 1be45395da Store TxOuts directly in UtxoSet rather than in Boxes
This gives a significant speedup during deserialization since we
don't have to allocate for every output.
2014-07-23 11:27:03 -07:00
Andrew Poelstra b5c25ff768 Distinguish between network/decode errors in network message decode
It is now visible that EOF (i.e. peer hung up) is interpreted
as a message decode error. Probably what we want to do is reset
the connection on any error. TODO
2014-07-23 11:22:35 -07:00
Andrew Poelstra 9cb86dd21b Change InvalidInput to EndOfFile in several cases 2014-07-22 10:59:58 -07:00
Andrew Poelstra ca6d4cdde4 Workaround for https://github.com/rust-lang/rust/issues/15763 2014-07-21 19:40:29 -07:00
Andrew Poelstra 46969b3396 Replace PatriciaTree with HashMap for UTXO set
We get a speed up (~5%) and memory savings (~10%) on initial sync from
using a HashMap, though it's hard to tell precisely how much savings
because it's quite nonlinear.

I haven't tested de/serialization. Some work needs to be done there to
split up the UTXO set since it takes forever to saveload.
2014-07-20 16:52:00 -07:00
Andrew Poelstra 54e4ea4586 Rename Serializable::hash() to Serializable::bitcoin_hash()
We were conflicting with the Rust stdlib trait Hash, which is used
by various datastructures which need a general hash. Also implement
Hash for Sha256dHash so that we can use bitcoin hashes as keys for
such data structures.
2014-07-19 16:11:55 -07:00
Andrew Poelstra a3846965e3 blockchain: replace Rc mess with internal raw pointers 2014-07-19 15:23:04 -07:00
Andrew Poelstra 93dadd6a6e Add iterators to patricia tree 2014-07-19 13:02:25 -07:00
Andrew Poelstra 73e8b542c0 Add testnet blockspacing rule 2014-07-18 16:41:09 -07:00
Andrew Poelstra 51038f5810 Add alternate network support to `Blockchain`, `UtxoSet`, `Socket`
Still need to do alternate diffchange rules..
2014-07-18 14:38:35 -07:00
Andrew Poelstra 8f826a959d Introduce `BitcoinResult`, use it instead of boolean returns in blockchain 2014-07-18 12:40:04 -07:00
Andrew Poelstra b5fd47b334 Allow user to change network magic, add constant for testnet
We need to add a "difficulty back to 1 after 20 minutes" difficulty
rule to actually support testnet, but this is a start.
2014-07-18 12:03:38 -07:00
Andrew Poelstra c9ad7c0b58 Initial commit, move into Cargo 2014-07-18 06:56:17 -07:00