// VulcanizeDB // Copyright © 2019 Vulcanize // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU Affero General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Affero General Public License for more details. // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . package ipld import ( "fmt" "github.com/ipfs/go-cid" node "github.com/ipfs/go-ipld-format" "github.com/multiformats/go-multihash" "github.com/ethereum/go-ethereum/core/types" ) // EthTxTrie (eth-tx-trie codec 0x92) represents // a node from the transaction trie in ethereum. type EthTxTrie struct { *TrieNode } // Static (compile time) check that EthTxTrie satisfies the node.Node interface. var _ node.Node = (*EthTxTrie)(nil) /* INPUT */ // To create a proper trie of the eth-tx-trie objects, it is required // to input all transactions belonging to a forest in a single step. // We are adding the transactions, and creating its trie on // block body parsing time. /* OUTPUT */ // DecodeEthTxTrie returns an EthTxTrie object from its cid and rawdata. func DecodeEthTxTrie(c cid.Cid, b []byte) (*EthTxTrie, error) { tn, err := decodeTrieNode(c, b, decodeEthTxTrieLeaf) if err != nil { return nil, err } return &EthTxTrie{TrieNode: tn}, nil } // decodeEthTxTrieLeaf parses a eth-tx-trie leaf // from decoded RLP elements func decodeEthTxTrieLeaf(i []interface{}) ([]interface{}, error) { t := new(types.Transaction) if err := t.UnmarshalBinary(i[1].([]byte)); err != nil { return nil, err } c, err := RawdataToCid(MEthTx, i[1].([]byte), multihash.KECCAK_256) if err != nil { return nil, err } return []interface{}{ i[0].([]byte), &EthTx{ Transaction: t, cid: c, rawdata: i[1].([]byte), }, }, nil } /* Block INTERFACE */ // RawData returns the binary of the RLP encode of the transaction. func (t *EthTxTrie) RawData() []byte { return t.rawdata } // Cid returns the cid of the transaction. func (t *EthTxTrie) Cid() cid.Cid { return t.cid } // String is a helper for output func (t *EthTxTrie) String() string { return fmt.Sprintf("", t.cid) } // Loggable returns in a map the type of IPLD Link. func (t *EthTxTrie) Loggable() map[string]interface{} { return map[string]interface{}{ "type": "eth-tx-trie", } } /* EthTxTrie functions */ // txTrie wraps a localTrie for use on the transaction trie. type txTrie struct { *localTrie } // newTxTrie initializes and returns a txTrie. func newTxTrie() *txTrie { return &txTrie{ localTrie: newLocalTrie(), } } // getNodes invokes the localTrie, which computes the root hash of the // transaction trie and returns its sql keys, to return a slice // of EthTxTrie nodes. func (tt *txTrie) getNodes() ([]*EthTxTrie, error) { keys, err := tt.getKeys() if err != nil { return nil, err } var out []*EthTxTrie for _, k := range keys { rawdata, err := tt.db.Get(k) if err != nil { return nil, err } tn := &TrieNode{ cid: keccak256ToCid(MEthTxTrie, k), rawdata: rawdata, } out = append(out, &EthTxTrie{TrieNode: tn}) } return out, nil }