X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=wallet%2Fannotated.go;h=4bcc507d3801111fb20d25b960c3de601a15632f;hb=1390401e918e7297f2747ae5bfe98d4a26a67dc6;hp=5f327df2efb48f9b63499ba2524f87e7c9d5173b;hpb=08281341c2cb02ba11d4218576256688854790fc;p=bytom%2Fvapor.git diff --git a/wallet/annotated.go b/wallet/annotated.go index 5f327df2..4bcc507d 100644 --- a/wallet/annotated.go +++ b/wallet/annotated.go @@ -5,19 +5,17 @@ import ( "fmt" log "github.com/sirupsen/logrus" - "github.com/tendermint/tmlibs/db" "github.com/vapor/account" "github.com/vapor/asset" "github.com/vapor/blockchain/query" - "github.com/vapor/blockchain/signers" "github.com/vapor/common" "github.com/vapor/consensus" "github.com/vapor/consensus/segwit" "github.com/vapor/crypto/sha3pool" + dbm "github.com/vapor/database/leveldb" "github.com/vapor/protocol/bc" "github.com/vapor/protocol/bc/types" - "github.com/vapor/protocol/vm/vmutil" ) // annotateTxs adds asset data to transactions @@ -51,11 +49,10 @@ func (w *Wallet) getExternalDefinition(assetID *bc.AssetID) json.RawMessage { Alias: &alias, DefinitionMap: definitionMap, RawDefinitionByte: definitionByte, - Signer: &signers.Signer{Type: "external"}, } if err := w.AssetReg.SaveAsset(externalAsset, alias); err != nil { - log.WithFields(log.Fields{"err": err, "assetID": alias}).Warning("fail on save external asset to internal asset DB") + log.WithFields(log.Fields{"module": logModule, "err": err, "assetID": alias}).Warning("fail on save external asset to internal asset DB") } return definitionByte } @@ -85,7 +82,7 @@ func (w *Wallet) getAliasDefinition(assetID bc.AssetID) (string, json.RawMessage } // annotateTxs adds account data to transactions -func annotateTxsAccount(txs []*query.AnnotatedTx, walletDB db.DB) { +func annotateTxsAccount(txs []*query.AnnotatedTx, walletDB dbm.DB) { for i, tx := range txs { for j, input := range tx.Inputs { //issue asset tx input SpentOutputID is nil @@ -110,7 +107,7 @@ func annotateTxsAccount(txs []*query.AnnotatedTx, walletDB db.DB) { } } -func getAccountFromACP(program []byte, walletDB db.DB) (*account.Account, error) { +func getAccountFromACP(program []byte, walletDB dbm.DB) (*account.Account, error) { var hash common.Hash accountCP := account.CtrlProgram{} localAccount := account.Account{} @@ -140,12 +137,6 @@ func getAccountFromACP(program []byte, walletDB db.DB) (*account.Account, error) var emptyJSONObject = json.RawMessage(`{}`) -func isValidJSON(b []byte) bool { - var v interface{} - err := json.Unmarshal(b, &v) - return err == nil -} - func (w *Wallet) buildAnnotatedTransaction(orig *types.Tx, b *types.Block, statusFail bool, indexInBlock int) *query.AnnotatedTx { tx := &query.AnnotatedTx{ ID: orig.ID, @@ -183,59 +174,54 @@ func (w *Wallet) BuildAnnotatedInput(tx *types.Tx, i uint32) *query.AnnotatedInp in.InputID = id e := tx.Entries[id] switch e := e.(type) { - case *bc.Spend: - in.Type = "spend" + case *bc.CrossChainInput: + in.Type = "cross_chain_in" in.ControlProgram = orig.ControlProgram() - in.Address = w.getAddressFromControlProgram(in.ControlProgram) - in.SpentOutputID = e.SpentOutputId + in.Address = w.getAddressFromControlProgram(in.ControlProgram, true) + in.SpentOutputID = e.MainchainOutputId arguments := orig.Arguments() for _, arg := range arguments { in.WitnessArguments = append(in.WitnessArguments, arg) } - case *bc.Issuance: - in.Type = "issue" - in.IssuanceProgram = orig.IssuanceProgram() + + case *bc.Spend: + in.Type = "spend" + in.ControlProgram = orig.ControlProgram() + in.Address = w.getAddressFromControlProgram(in.ControlProgram, false) + in.SpentOutputID = e.SpentOutputId arguments := orig.Arguments() for _, arg := range arguments { in.WitnessArguments = append(in.WitnessArguments, arg) } - if assetDefinition := orig.AssetDefinition(); isValidJSON(assetDefinition) { - assetDefinition := json.RawMessage(assetDefinition) - in.AssetDefinition = &assetDefinition - } + case *bc.Coinbase: in.Type = "coinbase" in.Arbitrary = e.Arbitrary - case *bc.Claim: - in.Type = "claim" - in.ControlProgram = orig.ControlProgram() - in.Address = w.getAddressFromControlProgram(in.ControlProgram) - in.SpentOutputID = e.SpentOutputId - in.Peginwitness = orig.Peginwitness - arguments := orig.Arguments() - for _, arg := range arguments { - in.WitnessArguments = append(in.WitnessArguments, arg) - } } return in } -func (w *Wallet) getAddressFromControlProgram(prog []byte) string { +func (w *Wallet) getAddressFromControlProgram(prog []byte, isMainchain bool) string { + netParams := &consensus.ActiveNetParams + if isMainchain { + netParams = &consensus.MainNetParams + } + if segwit.IsP2WPKHScript(prog) { if pubHash, err := segwit.GetHashFromStandardProg(prog); err == nil { - return buildP2PKHAddress(pubHash) + return buildP2PKHAddress(pubHash, netParams) } } else if segwit.IsP2WSHScript(prog) { if scriptHash, err := segwit.GetHashFromStandardProg(prog); err == nil { - return buildP2SHAddress(scriptHash) + return buildP2SHAddress(scriptHash, netParams) } } return "" } -func buildP2PKHAddress(pubHash []byte) string { - address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams) +func buildP2PKHAddress(pubHash []byte, netParams *consensus.Params) string { + address, err := common.NewAddressWitnessPubKeyHash(pubHash, netParams) if err != nil { return "" } @@ -243,8 +229,8 @@ func buildP2PKHAddress(pubHash []byte) string { return address.EncodeAddress() } -func buildP2SHAddress(scriptHash []byte) string { - address, err := common.NewAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams) +func buildP2SHAddress(scriptHash []byte, netParams *consensus.Params) string { + address, err := common.NewAddressWitnessScriptHash(scriptHash, netParams) if err != nil { return "" } @@ -259,17 +245,28 @@ func (w *Wallet) BuildAnnotatedOutput(tx *types.Tx, idx int) *query.AnnotatedOut out := &query.AnnotatedOutput{ OutputID: *outid, Position: idx, - AssetID: *orig.AssetId, + AssetID: *orig.AssetAmount().AssetId, AssetDefinition: &emptyJSONObject, - Amount: orig.Amount, - ControlProgram: orig.ControlProgram, - Address: w.getAddressFromControlProgram(orig.ControlProgram), + Amount: orig.AssetAmount().Amount, + ControlProgram: orig.ControlProgram(), } - if vmutil.IsUnspendable(out.ControlProgram) { - out.Type = "retire" - } else { + var isMainchainAddress bool + switch e := tx.Entries[*outid].(type) { + case *bc.IntraChainOutput: out.Type = "control" + isMainchainAddress = false + + case *bc.CrossChainOutput: + out.Type = "cross_chain_out" + isMainchainAddress = true + + case *bc.VoteOutput: + out.Type = "vote" + out.Vote = e.Vote + isMainchainAddress = false } + + out.Address = w.getAddressFromControlProgram(orig.ControlProgram(), isMainchainAddress) return out }