tendermint/types
Jae Kwon c4ed55d801 Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
..
README.md tendermint/block -> tendermint/types and tendermint/blockchain 2015-03-22 19:00:08 -07:00
block.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
block_meta.go ProposalPOLRound... 2015-06-22 19:04:31 -07:00
config.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
events.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
keys.go Use ResetFor... callback instead of EventSwitch for mempool new blocks 2015-09-29 12:31:34 -04:00
log.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
names.go update namereg with longer names, more allowed chars 2015-09-15 19:43:22 -04:00
node.go more versioning 2015-09-16 05:08:06 +00:00
part_set.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
part_set_test.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
priv_validator.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
proposal.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
proposal_test.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
tx.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
tx_test.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
tx_utils.go SNativeTx -> PermissionTx, consolidate permissions and native contracts 2015-07-22 10:49:53 -04:00
validator.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
validator_set.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
validator_set_test.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
vote.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
vote_set.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00
vote_set_test.go Refactor to move common libraries out of project 2015-10-22 17:39:06 -07:00

README.md

tendermint/block

Block

TODO: document

Header

Validation

Data

PartSet

PartSet is used to split a byteslice of data into parts (pieces) for transmission. By splitting data into smaller parts and computing a Merkle root hash on the list, you can verify that a part is legitimately part of the complete data, and the part can be forwarded to other peers before all the parts are known. In short, it's a fast way to propagate a large file over a gossip network.

PartSet was inspired by the LibSwift project.

Usage:

data := RandBytes(2 << 20) // Something large

partSet := NewPartSetFromData(data)
partSet.Total()     // Total number of 4KB parts
partSet.Count()     // Equal to the Total, since we already have all the parts
partSet.Hash()      // The Merkle root hash
partSet.BitArray()  // A BitArray of partSet.Total() 1's

header := partSet.Header() // Send this to the peer
header.Total        // Total number of parts
header.Hash         // The merkle root hash

// Now we'll reconstruct the data from the parts
partSet2 := NewPartSetFromHeader(header)
partSet2.Total()    // Same total as partSet.Total()
partSet2.Count()    // Zero, since this PartSet doesn't have any parts yet.
partSet2.Hash()     // Same hash as in partSet.Hash()
partSet2.BitArray() // A BitArray of partSet.Total() 0's

// In a gossip network the parts would arrive in arbitrary order, perhaps
// in response to explicit requests for parts, or optimistically in response
// to the receiving peer's partSet.BitArray().
for !partSet2.IsComplete() {
    part := receivePartFromGossipNetwork()
    added, err := partSet2.AddPart(part)
    if err != nil {
		// A wrong part,
        // the merkle trail does not hash to partSet2.Hash()
    } else if !added {
        // A duplicate part already received
    }
}

data2, _ := ioutil.ReadAll(partSet2.GetReader())
bytes.Equal(data, data2) // true