package blockchain // thhis file implements code which controls output indexes // rewrites them during chain reorganisation import "fmt" import "encoding/binary" import "github.com/deroproject/derosuite/crypto" //import "github.com/deroproject/derosuite/crypto/ringct" type Output_index struct { Key crypto.Hash // stealth address key Commitment crypto.Hash // commitment public key Height uint64 // height to which this belongs } func (o *Output_index) Serialize() (result []byte) { result = append(o.Key[:], o.Commitment[:]...) result = append(result, itob(o.Height)...) return } func (o *Output_index) Deserialize(buf []byte) (err error) { if len(buf) != ( 32 + 32 + 8){ return fmt.Errorf("Output index needs to be 72 bytes in size but found to be %d bytes", len(buf)) } copy(o.Key[:],buf[:32]) copy(o.Commitment[:],buf[32:64]) o.Height = binary.BigEndian.Uint64(buf[64:]) return } // this function writes or overwrites the data related to outputs // the following data is collected from each output // the secret key, // the commitment ( for miner tx the commitment is created from scratch // 8 bytes blockheight to which this output belongs // this function should always succeed or panic showing something is not correct // NOTE: this function should only be called after all the tx and the block has been stored to DB func (chain *Blockchain)write_output_index(block_id crypto.Hash){ // load the block bl, err := chain.Load_BL_FROM_ID(block_id) if err != nil { panic(fmt.Sprintf("No such block %x\n", block_id)) } _ = bl }