func CreateReceipt(dbo interfaces.DBOverlay, entryID interfaces.IHash) (*Receipt, error) { receipt := new(Receipt) receipt.Entry = new(JSON) receipt.Entry.Key = entryID.String() //EBlock hash, err := dbo.FetchIncludedIn(entryID) if err != nil { return nil, err } if hash == nil { return nil, fmt.Errorf("Block containing entry not found") } eBlock, err := dbo.FetchEBlock(hash) if err != nil { return nil, err } if eBlock == nil { return nil, fmt.Errorf("EBlock not found") } hash = eBlock.DatabasePrimaryIndex() receipt.EntryBlockKeyMR = hash.(*primitives.Hash) entries := eBlock.GetEntryHashes() //fmt.Printf("eBlock entries - %v\n\n", entries) branch := primitives.BuildMerkleBranchForEntryHash(entries, entryID, true) blockNode := new(primitives.MerkleNode) left, err := eBlock.HeaderHash() if err != nil { return nil, err } blockNode.Left = left.(*primitives.Hash) blockNode.Right = eBlock.BodyKeyMR().(*primitives.Hash) blockNode.Top = hash.(*primitives.Hash) //fmt.Printf("eBlock blockNode - %v\n\n", blockNode) branch = append(branch, blockNode) receipt.MerkleBranch = append(receipt.MerkleBranch, branch...) //str, _ := eBlock.JSONString() //fmt.Printf("eBlock - %v\n\n", str) //DBlock hash, err = dbo.FetchIncludedIn(hash) if err != nil { return nil, err } if hash == nil { return nil, fmt.Errorf("Block containing EBlock not found") } dBlock, err := dbo.FetchDBlock(hash) if err != nil { return nil, err } if dBlock == nil { return nil, fmt.Errorf("DBlock not found") } //str, _ = dBlock.JSONString() //fmt.Printf("dBlock - %v\n\n", str) entries = dBlock.GetEntryHashesForBranch() //fmt.Printf("dBlock entries - %v\n\n", entries) //merkleTree := primitives.BuildMerkleTreeStore(entries) //fmt.Printf("dBlock merkleTree - %v\n\n", merkleTree) branch = primitives.BuildMerkleBranchForEntryHash(entries, receipt.EntryBlockKeyMR, true) blockNode = new(primitives.MerkleNode) left, err = dBlock.HeaderHash() if err != nil { return nil, err } blockNode.Left = left.(*primitives.Hash) blockNode.Right = dBlock.BodyKeyMR().(*primitives.Hash) blockNode.Top = hash.(*primitives.Hash) //fmt.Printf("dBlock blockNode - %v\n\n", blockNode) branch = append(branch, blockNode) receipt.MerkleBranch = append(receipt.MerkleBranch, branch...) //DirBlockInfo hash = dBlock.DatabasePrimaryIndex() receipt.DirectoryBlockKeyMR = hash.(*primitives.Hash) dirBlockInfo, err := dbo.FetchDirBlockInfoByKeyMR(hash) if err != nil { return nil, err } if dirBlockInfo != nil { dbi := dirBlockInfo.(*dbInfo.DirBlockInfo) receipt.BitcoinTransactionHash = dbi.BTCTxHash.(*primitives.Hash) receipt.BitcoinBlockHash = dbi.BTCBlockHash.(*primitives.Hash) } return receipt, nil }