bitcoin double sha

Jump to: , This page describes the behavior of the reference client.The Bitcoin protocol is specified by the behavior of the reference client, not by this page.In particular, while this page is quite complete in describing the network protocol, it does not attempt to list all of the rules for block or transaction validity.Type names used in this documentation are from the C99 standard.For protocol used in mining, see getblocktemplate.Contents 1 2 3 4 5 6 Usually, when a hash is computed within bitcoin, it is computed twice.Most of the time SHA-256 hashes are used, however RIPEMD-160 is also used when a shorter hash is desirable (for example when creating a bitcoin address).Example of double-SHA-256 encoding of string "hello": For bitcoin addresses (RIPEMD-160) this would give: Merkle trees are binary trees of hashes.Merkle trees in bitcoin use a double SHA-256, the SHA-256 hash of the SHA-256 hash of something.If, when forming a row in the tree (other than the root of the tree), it would have an odd number of elements, the final double-hash is duplicated to ensure that the row has an even number of hashes.

First form the bottom row of the tree with the ordered double-SHA-256 hashes of the byte streams of the transactions in the block.Then the row above it consists of half that number of hashes.Each entry is the double-SHA-256 of the 64-byte concatenation of the corresponding two hashes below it in the tree.This procedure repeats recursively until we reach a row consisting of just a single double-hash.This is the Merkle root of the tree.For example, imagine a block with three transactions a, b and c. The Merkle tree is: d7 is the Merkle root of the 3 transactions in this block.Note: Hashes in Merkle Tree displayed in the Block Explorer are of little-endian notation.For some implementations and calculations, the bits need to be reversed before they are hashed, and again after the hashing operation.Bitcoin uses Elliptic Curve Digital Signature Algorithm (ECDSA) to sign transactions.Public keys (in scripts) are given as 04
where x and y are 32 byte big-endian integers representing the coordinates of a point on the curve or in compressed form given as where is 0x02 if y is even and 0x03 if y is odd.

Signatures use DER encoding to pack the r and s components into a single byte stream (this is also what OpenSSL produces by default).Transactions are cryptographically signed records that reassign ownership of Bitcoins to new addresses.Transactions have inputs - records which reference the funds from other previous transactions - and outputs - records which determine the new owner of the transferred Bitcoins, and which will be referenced as inputs in future transactions as those funds are respent.Each input must have a cryptographic digital signature that unlocks the funds from the prior transaction.Only the person possessing the appropriate private key is able to create a satisfactory signature; this in effect ensures that funds can only be spent by their owners.Each output determines which Bitcoin address (or other criteria, see Script) is the recipient of the funds.In a transaction, the sum of all inputs must be equal to or greater than the sum of all outputs.If the inputs exceed the outputs, the difference is considered a transaction fee, and is redeemable by whoever first includes the transaction into the block chain.

A special kind of transaction, called a coinbase transaction, has no inputs.It is created by miners, and there is one coinbase transaction per block.Because each block comes with a reward of newly created Bitcoins (e.g.50 BTC for the first 210,000 blocks), the first transaction of a block is, with few exceptions, the transaction that grants those coins to their recipient (the miner).
bitcoin 24 shutdownIn addition to the newly created Bitcoins, the coinbase transaction is also used for assigning the recipient of any transaction fees that were paid within the other transactions being included in the same block.
bitcoin litecoin farmerThe coinbase transaction can assign the entire reward to a single Bitcoin address, or split it in portions among multiple addresses, just like any other transaction.
ethereum windows client

Coinbase transactions always contain outputs totalling the sum of the block reward plus all transaction fees collected from the other transactions in the same block.The coinbase transaction in block zero cannot be spent.This is due to a quirk of the reference client implementation that would open the potential for a block chain fork if some nodes accepted the spend and others did not[1].
bitcoin al jazeeraMost Bitcoin outputs encumber the newly transferred coins with a single ECDSA private key.
aml for bitcoinThe actual record saved with inputs and outputs isn't necessarily a key, but a script.
börse frankfurt bitcoinBitcoin uses an interpreted scripting system to determine whether an output's criteria have been satisfied, with which more complex operations are possible, such as outputs that require two ECDSA signatures, or two-of-three-signature schemes.

An output that references a single Bitcoin address is a typical output; an output actually contains this information in the form of a script that requires a single ECDSA signature (see OP_CHECKSIG).The output script specifies what must be provided to unlock the funds later, and when the time comes in the future to spend the transaction in another input, that input must provide all of the thing(s) that satisfy the requirements defined by the original output script.A bitcoin address is in fact the hash of a ECDSA public key, computed this way: The Base58 encoding used is home made, and has some differences.Especially, leading zeroes are kept as single zeroes when conversion happens.Almost all integers are encoded in little endian.Only IP or port number are encoded big endian.Integer can be encoded depending on the represented value to save space.Variable length integers always precede an array/vector of a type of data that may vary in length.Longer numbers are encoded in little endian.

If you're reading the Satoshi client code (BitcoinQT) it refers to this encoding as a "CompactSize".Modern BitcoinQT also has the CVarInt class which implements an even more compact integer for the purpose of local storage (which is incompatible with "CompactSize" described here).CVarInt is not a part of the protocol.Variable length string can be stored using a variable length integer followed by the string itself.When a network address is needed somewhere, this structure is used.Network addresses are not prefixed with a timestamp in the version message.Field Size Description Data type Comments 4 time uint32 the Time (version >= 31402).Not present in version message.8 services uint64_t same service(s) listed in version 16 IPv6/4 char[16] IPv6 address.The original client only supported IPv4 and only read the last 4 bytes to get the IPv4 address.However, the IPv4 address is written into the message as a 16 byte IPv4-mapped IPv6 address (12 bytes 00 00 00 00 00 00 00 00 00 00 FF FF, followed by the 4 bytes of the IPv4 address).

2 port uint16_t port number, network byte order Hexdump example of Network address structure Inventory vectors are used for notifying other nodes about objects they have or data which is being requested.Inventory vectors consist of the following data format: The object type is currently defined as one of the following possibilities: Other Data Type values are considered reserved for future implementations.Block headers are sent in a headers packet in response to a getheaders message.Several uses of CompactSize below are "differentially encoded".For these, instead of using raw indexes, the number encoded is the difference between the current index and the previous index, minus one.For example, a first index of 0 implies a real index of 0, a second index of 0 thereafter refers to a real index of 1, etc. A PrefilledTransaction structure is used in HeaderAndShortIDs to provide a list of a few transactions explicitly.See BIP 152 for more information.A HeaderAndShortIDs structure is used to relay a block header, the short transactions IDs used for matching already-available transactions, and a select few transactions which we expect a peer may be missing.

A BlockTransactionsRequest structure is used to list transaction indexes in a block being requested.A BlockTransactions structure is used to provide some of the transactions in a block, as requested.Short transaction IDs are used to represent a transaction without sending a full 256-bit hash.They are calculated by: See BIP 152 for more information.When a node creates an outgoing connection, it will immediately advertise its version.The remote node will respond with its version.No further communication is possible until both peers have exchanged their version.A "verack" packet shall be sent if the version packet was accepted.The following services are currently assigned: Hexdump example of version message (OBSOLETE EXAMPLE: This example lacks a checksum and user-agent): And here's a modern (60002) protocol version client advertising itself to a local peer... Newer protocol includes the checksum now, this is from a mainline (satoshi) client during an outgoing connection to another local client, notice that it does not fill out the address information at all when the source or destination is "unroutable".

The verack message is sent in reply to version.This message consists of only a message header with the command string "verack".Hexdump of the verack message: Provide information on known nodes of the network.Non-advertised nodes should be forgotten after typically 3 hours Note: Starting version 31402, addresses are prefixed with a timestamp.If no timestamp is present, the addresses should not be relayed to other peers, unless it is indeed confirmed they are up.Hexdump example of addr message: Allows a node to advertise its knowledge of one or more objects.It can be received unsolicited, or in reply to getblocks.Payload (maximum 50,000 entries, which is just over 1.8 megabytes): getdata is used in response to inv, to retrieve the content of a specific object, and is usually sent after receiving an inv packet, after filtering known elements.It can be used to retrieve transactions, but only if they are in the memory pool or relay set - arbitrary access to transactions in the chain is not allowed to avoid having clients start to depend on nodes having full transaction indexes (which modern nodes do not).

Payload (maximum 50,000 entries, which is just over 1.8 megabytes): notfound is a response to a getdata, sent if any requested data items could not be relayed, for example, because the requested transaction was not in the memory pool or relay set.Return an inv packet containing the list of blocks starting right after the last known hash in the block locator object, up to hash_stop or 500 blocks, whichever comes first.The locator hashes are processed by a node in the order as they appear in the message.If a block hash is found in the node's main chain, the list of its children is returned back via the inv message and the remaining locators are ignored, no matter if the requested limit was reached, or not.To receive the next blocks hashes, one needs to issue getblocks again with a new block locator object.Keep in mind that some clients may provide blocks which are invalid if the block locator object contains a hash on the invalid branch.To create the block locator hashes, keep pushing hashes until you go back to the genesis block.

After pushing 10 hashes back, the step backwards doubles every loop: Note that it is allowed to send in fewer known hashes down to a minimum of just one hash.However, the purpose of the block locator object is to detect a wrong branch in the caller's main chain.If the peer detects that you are off the main chain, it will send in block hashes which are earlier than your last known block.So if you just send in your last known hash and it is off the main chain, the peer starts over at block #1.Return a headers packet containing the headers of blocks starting right after the last known hash in the block locator object, up to hash_stop or 2000 blocks, whichever comes first.To receive the next block headers, one needs to issue getheaders again with a new block locator object.The getheaders command is used by thin clients to quickly download the block chain where the contents of the transactions would be irrelevant (because they are not ours).Keep in mind that some clients may provide headers of blocks which are invalid if the block locator object contains a hash on the invalid branch.

For the block locator object in this packet, the same rules apply as for the getblocks packet.tx describes a bitcoin transaction, in reply to getdata Field Size Description Data type Comments 4 version int32_t Transaction data format version (note, this is signed) 1+ tx_in count var_int Number of Transaction inputs 41+ tx_in tx_in[] A list of 1 or more transaction inputs or sources for coins 1+ tx_out count var_int Number of Transaction outputs 9+ tx_out tx_out[] A list of 1 or more transaction outputs or destinations for coins 4 lock_time uint32_t The block number or timestamp at which this transaction is unlocked: Value Description 0 Not locked < 500000000 Block number at which this transaction is unlocked >= 500000000 UNIX timestamp at which this transaction is unlocked If all TxIn inputs have final (0xffffffff) sequence numbers then lock_time is irrelevant.

Otherwise, the transaction may not be added to a block until after lock_time (see NLockTime).TxIn consists of the following fields: The OutPoint structure consists of the following fields: The Script structure consists of a series of pieces of information and operations related to the value of the transaction.(Structure to be expanded in the future… see script.h and script.cpp and Script for more information) The TxOut structure consists of the following fields: The block message is sent in response to a getdata message which requests transaction information from a block hash.The SHA256 hash that identifies each block (and which must have a run of 0 bits) is calculated from the first 6 fields of this structure (version, prev_block, merkle_root, timestamp, bits, nonce, and standard SHA256 padding, making two 64-byte chunks in all) and not from the complete block.To calculate the hash, only two chunks need to be processed by the SHA256 algorithm.Since the nonce field is in the second chunk, the first chunk stays constant during mining and therefore only the second chunk needs to be processed.

However, a Bitcoin hash is the hash of the hash, so two SHA256 rounds are needed for each mining iteration.See Block hashing algorithm for details and an example.The headers packet returns block headers in response to a getheaders packet.Note that the block headers in this packet include a transaction count (a var_int, so there can be more than 81 bytes per header) as opposed to the block headers that are hashed by miners.The getaddr message sends a request to a node asking for information about known active peers to help with finding potential nodes in the network.The response to receiving this message is to transmit one or more addr messages with one or more peers from a database of known active peers.The typical presumption is that a node is likely to be active if it has been sending a message within the last three hours.No additional data is transmitted with this message.The mempool message sends a request to a node asking for information about transactions it has verified but which have not yet confirmed.

The response to receiving this message is an inv message containing the transaction hashes for all the transactions in the node's mempool.It is specified in BIP 35.Since BIP 37, if a bloom filter is loaded, only transactions matching the filter are replied.This message was used for IP Transactions.As IP transactions have been deprecated, it is no longer used.The ping message is sent primarily to confirm that the TCP/IP connection is still valid.An error in transmission is presumed to be a closed connection and the address is removed as a current peer.The pong message is sent in response to a ping message.In modern protocol versions, a pong response is generated using a nonce included in the ping.The reject message is sent when messages are rejected.These messages are related to Bloom filtering of connections and are defined in BIP 0037.The filterload command is defined as follows: See below for a description of the Bloom filter algorithm and how to select nHashFuncs and filter size for a desired false positive rate.

Upon receiving a filterload command, the remote peer will immediately restrict the broadcast transactions it announces (in inv packets) to transactions matching the filter, where the matching algorithm is specified below.The flags control the update behaviour of the matching algorithm.The filteradd command is defined as follows: The data field must be smaller than or equal to 520 bytes in size (the maximum size of any potentially matched object).The given data element will be added to the Bloom filter.A filter must have been previously provided using filterload.This command is useful if a new key or script is added to a clients wallet whilst it has connections to the network open, it avoids the need to re-calculate and send an entirely new filter to every peer (though doing so is usually advisable to maintain anonymity).The filterclear command has no arguments at all.After a filter has been set, nodes don't merely stop announcing non-matching transactions, they can also serve filtered blocks.

A filtered block is defined by the merkleblock message and is defined like this: Note: Support for alert messages has been removed from bitcoin core in March 2016.Read more here An alert is sent between nodes to send a general notification message throughout the network.If the alert can be confirmed with the signature as having come from the core development group of the Bitcoin software, the message is suggested to be displayed for end-users.Attempts to perform transactions, particularly automated transactions through the client, are suggested to be halted.The text in the Message string should be relayed to log files and any user interfaces.The developers of Satoshi's client use this public key for signing alerts: The payload is serialized into a uchar[] to ensure that versions using incompatible alert formats can still relay alerts among one another.The current alert payload format is: Note: set
in the table above is a variable length integer followed by the number of fields of the given type (either int32_t or variable length string) Sample alert (no message header): Request for Direct headers announcement.

Upon receipt of this message, the node is be permitted, but not required, to announce new blocks by headers command (instead of inv command).This message is supported by the protocol version >= 70012 or Bitcoin Core version >= 0.12.0.See BIP 130 for more information.The payload is always 8 bytes long and it encodes 64 bit integer value (LSB / little endian) of feerate.The value represents a minimal fee and is expressed in satoshis per 1000 bytes.Upon receipt of a "feefilter" message, the node will be permitted, but not required, to filter transaction invs for transactions that fall below the feerate provided in the feefilter message interpreted as satoshis per kilobyte.The fee filter is additive with a bloom filter for transactions so if an SPV client were to load a bloom filter and send a feefilter message, transactions would only be relayed if they passed both filters.Inv's generated from a mempool message are also subject to a fee filter if it exists.Feature discovery is enabled by checking protocol version >= 70013 See BIP 133 for more information.