//AnnotatedTx means an annotated transaction.
type AnnotatedTx struct {
- ID bc.Hash `json:"id"`
- Timestamp time.Time `json:"timestamp"`
- BlockID bc.Hash `json:"block_id"`
- BlockHeight uint64 `json:"block_height"`
- Position uint32 `json:"position"`
- BlockTransactionsCount uint32 `json:"block_transactions_count,omitempty"`
- ReferenceData *json.RawMessage `json:"reference_data"`
- Inputs []*AnnotatedInput `json:"inputs"`
- Outputs []*AnnotatedOutput `json:"outputs"`
- StatusFail bool `json:"status_fail"`
+ ID bc.Hash `json:"id"`
+ Timestamp time.Time `json:"timestamp"`
+ BlockID bc.Hash `json:"block_id"`
+ BlockHeight uint64 `json:"block_height"`
+ Position uint32 `json:"position"`
+ BlockTransactionsCount uint32 `json:"block_transactions_count,omitempty"`
+ ReferenceData *chainjson.HexBytes `json:"reference_data"`
+ Inputs []*AnnotatedInput `json:"inputs"`
+ Outputs []*AnnotatedOutput `json:"outputs"`
+ StatusFail bool `json:"status_fail"`
}
//AnnotatedInput means an annotated transaction input.
type AnnotatedInput struct {
- Type string `json:"type"`
- AssetID bc.AssetID `json:"asset_id"`
- AssetAlias string `json:"asset_alias,omitempty"`
- AssetDefinition *json.RawMessage `json:"asset_definition"`
- Amount uint64 `json:"amount"`
- IssuanceProgram chainjson.HexBytes `json:"issuance_program,omitempty"`
- ControlProgram chainjson.HexBytes `json:"-"`
- SpentOutputID *bc.Hash `json:"spent_output_id,omitempty"`
- AccountID string `json:"account_id,omitempty"`
- AccountAlias string `json:"account_alias,omitempty"`
- ReferenceData *json.RawMessage `json:"reference_data"`
- Arbitrary chainjson.HexBytes `json:"arbitrary,omitempty"`
+ Type string `json:"type"`
+ AssetID bc.AssetID `json:"asset_id"`
+ AssetAlias string `json:"asset_alias,omitempty"`
+ AssetDefinition *chainjson.HexBytes `json:"asset_definition"`
+ Amount uint64 `json:"amount"`
+ IssuanceProgram chainjson.HexBytes `json:"issuance_program,omitempty"`
+ ControlProgram chainjson.HexBytes `json:"-"`
+ SpentOutputID *bc.Hash `json:"spent_output_id,omitempty"`
+ AccountID string `json:"account_id,omitempty"`
+ AccountAlias string `json:"account_alias,omitempty"`
+ ReferenceData *chainjson.HexBytes `json:"reference_data"`
+ Arbitrary chainjson.HexBytes `json:"arbitrary,omitempty"`
}
//AnnotatedOutput means an annotated transaction output.
type AnnotatedOutput struct {
- Type string `json:"type"`
- OutputID bc.Hash `json:"id"`
- TransactionID *bc.Hash `json:"transaction_id,omitempty"`
- Position int `json:"position"`
- AssetID bc.AssetID `json:"asset_id"`
- AssetAlias string `json:"asset_alias,omitempty"`
- AssetDefinition *json.RawMessage `json:"asset_definition"`
- Amount uint64 `json:"amount"`
- AccountID string `json:"account_id,omitempty"`
- AccountAlias string `json:"account_alias,omitempty"`
- ControlProgram chainjson.HexBytes `json:"control_program"`
- ReferenceData *json.RawMessage `json:"reference_data"`
+ Type string `json:"type"`
+ OutputID bc.Hash `json:"id"`
+ TransactionID *bc.Hash `json:"transaction_id,omitempty"`
+ Position int `json:"position"`
+ AssetID bc.AssetID `json:"asset_id"`
+ AssetAlias string `json:"asset_alias,omitempty"`
+ AssetDefinition *chainjson.HexBytes `json:"asset_definition"`
+ Amount uint64 `json:"amount"`
+ AccountID string `json:"account_id,omitempty"`
+ AccountAlias string `json:"account_alias,omitempty"`
+ ControlProgram chainjson.HexBytes `json:"control_program"`
+ ReferenceData *chainjson.HexBytes `json:"reference_data"`
}
//AnnotatedAccount means an annotated account.
dbm "github.com/tendermint/tmlibs/db"
"github.com/bytom/blockchain/query"
+ chainjson "github.com/bytom/encoding/json"
"github.com/bytom/errors"
"github.com/bytom/protocol"
"github.com/bytom/protocol/bc"
return nil
}
-var emptyJSONObject = json.RawMessage(`{}`)
+var emptyJSONObject = chainjson.HexBytes(`{}`)
func buildAnnotatedTransaction(orig *legacy.Tx) *query.AnnotatedTx {
tx := &query.AnnotatedTx{
"github.com/bytom/common"
"github.com/bytom/consensus"
"github.com/bytom/crypto/sha3pool"
+ chainjson "github.com/bytom/encoding/json"
"github.com/bytom/protocol/bc"
"github.com/bytom/protocol/bc/legacy"
"github.com/bytom/protocol/vm/vmutil"
func annotateTxsAsset(w *Wallet, txs []*query.AnnotatedTx) {
for i, tx := range txs {
for j, input := range tx.Inputs {
- alias, definition, err := w.getAliasDefinition(input.AssetID)
- if err != nil {
- continue
- }
- txs[i].Inputs[j].AssetAlias = alias
- txs[i].Inputs[j].AssetDefinition = &definition
+ txs[i].Inputs[j].AssetAlias, txs[i].Inputs[j].AssetDefinition =
+ w.getAliasDefinition(input.AssetID)
}
- for j, output := range tx.Outputs {
- alias, definition, err := w.getAliasDefinition(output.AssetID)
- if err != nil {
- continue
- }
- txs[i].Outputs[j].AssetAlias = alias
- txs[i].Outputs[j].AssetDefinition = &definition
+ for k, output := range tx.Outputs {
+ txs[i].Outputs[k].AssetAlias, txs[i].Outputs[k].AssetDefinition =
+ w.getAliasDefinition(output.AssetID)
}
}
}
-func (w *Wallet) getExternalDefinition(assetID *bc.AssetID) (json.RawMessage, error) {
+func (w *Wallet) getExternalDefinition(assetID *bc.AssetID) *chainjson.HexBytes {
definitionByte := w.DB.Get(asset.CalcExtAssetKey(assetID))
if definitionByte == nil {
- return nil, nil
+ return nil
}
definitionMap := make(map[string]interface{})
if err := json.Unmarshal(definitionByte, &definitionMap); err != nil {
- return nil, err
+ return nil
}
saveAlias := assetID.String()
storeBatch.Set(asset.AliasKey(saveAlias), []byte(assetID.String()))
storeBatch.Write()
- return definitionByte, nil
+ d := chainjson.HexBytes(definitionByte)
+ return &d
}
-func (w *Wallet) getAliasDefinition(assetID bc.AssetID) (string, json.RawMessage, error) {
+func (w *Wallet) getAliasDefinition(assetID bc.AssetID) (string, *chainjson.HexBytes) {
//btm
if assetID.String() == consensus.BTMAssetID.String() {
alias := consensus.BTMAlias
- definition := []byte(asset.DefaultNativeAsset.RawDefinitionByte)
+ definition := &asset.DefaultNativeAsset.RawDefinitionByte
- return alias, definition, nil
+ return alias, definition
}
//local asset and saved external asset
if localAsset, err := w.AssetReg.FindByID(nil, &assetID); err == nil {
alias := *localAsset.Alias
- definition := []byte(localAsset.RawDefinitionByte)
- return alias, definition, nil
+ definition := &localAsset.RawDefinitionByte
+ return alias, definition
}
//external asset
- if definition, err := w.getExternalDefinition(&assetID); definition != nil {
- return assetID.String(), definition, err
+ if definition := w.getExternalDefinition(&assetID); definition != nil {
+ return assetID.String(), definition
}
- return "", nil, fmt.Errorf("look up asset %s :not found ", assetID.String())
+ return "", nil
}
// annotateTxs adds account data to transactions
return &localAccount, nil
}
-var emptyJSONObject = json.RawMessage(`{}`)
+var emptyJSONObject = chainjson.HexBytes(`{}`)
func isValidJSON(b []byte) bool {
var v interface{}
StatusFail: statusFail,
}
if isValidJSON(orig.ReferenceData) {
- referenceData := json.RawMessage(orig.ReferenceData)
+ referenceData := chainjson.HexBytes(orig.ReferenceData)
tx.ReferenceData = &referenceData
}
for i := range orig.Inputs {
in.Amount = orig.Amount()
}
if isValidJSON(orig.ReferenceData) {
- referenceData := json.RawMessage(orig.ReferenceData)
+ referenceData := chainjson.HexBytes(orig.ReferenceData)
in.ReferenceData = &referenceData
}
ReferenceData: &emptyJSONObject,
}
if isValidJSON(orig.ReferenceData) {
- referenceData := json.RawMessage(orig.ReferenceData)
+ referenceData := chainjson.HexBytes(orig.ReferenceData)
out.ReferenceData = &referenceData
}
if vmutil.IsUnspendable(out.ControlProgram) {
for _, tx := range annotatedTxs {
rawTx, err := json.Marshal(tx)
if err != nil {
- return errors.Wrap(err, "inserting annotated_txs to db")
+ log.WithField("err", err).Error("inserting annotated_txs to db")
+ return err
}
batch.Set(calcAnnotatedKey(formatKey(b.Height, uint32(tx.Position))), rawTx)