From f9015613c246da655a57213fe270bb804da8d489 Mon Sep 17 00:00:00 2001 From: HAOYUatHZ Date: Wed, 22 May 2019 15:25:21 +0800 Subject: [PATCH] fix --- asset/builder.go | 50 +++++++++++++++++++++++++++----------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/asset/builder.go b/asset/builder.go index 09325bf6..8f53f9d8 100644 --- a/asset/builder.go +++ b/asset/builder.go @@ -29,16 +29,33 @@ type crossInAction struct { SourcePos uint64 `json:"source_pos"` Program chainjson.HexBytes `json:"control_program"` AssetDefinition map[string]interface{} `json:"asset_definition"` - UpdateAssetDef bool `json:"update_asset_definition"` Arguments []chainjson.HexBytes `json:"arguments"` } +// func (reg *Registry) DefineCrossInAsset(a *Asset, alias string) error { +// defHash := bc.NewHash(sha3.Sum256(rawDefinition)) +// a := &Asset{ +// DefinitionMap: definition, +// RawDefinitionByte: rawDefinition, +// VMVersion: vmver, +// IssuanceProgram: issuanceProgram, +// AssetID: bc.ComputeAssetID(issuanceProgram, vmver, &defHash), +// Alias: &alias, +// } +// return a, reg.SaveAsset(a, alias) +// } + // TODO: also need to hard-code mapTx +// TODO: iter cross-in and save asset +// TODO: federation can sign? check arguments length? func (a *crossInAction) Build(ctx context.Context, builder *txbuilder.TemplateBuilder) error { var missing []string if len(a.Program) == 0 { missing = append(missing, "control_program") } + if a.SourceID == "" { + missing = append(missing, "source_id") + } if a.AssetId.IsZero() { missing = append(missing, "asset_id") } @@ -49,42 +66,29 @@ func (a *crossInAction) Build(ctx context.Context, builder *txbuilder.TemplateBu return txbuilder.MissingFieldsError(missing...) } + asset := &Asset{} + var err error // Handle asset definition. // Asset issuance's legality is guaranteed by the federation. - rawDefinition, err := serializeAssetDef(a.AssetDefinition) - if err != nil { - return ErrSerializing - } - if preAsset, _ := a.assets.GetAsset(a.AssetId.String()); preAsset != nil { - // GetAsset() doesn't unmashall for RawDefinitionBytes, so we need to - // serialize DefinitionMap on our own - preRawDefinition, err := serializeAssetDef(preAsset.DefinitionMap) + if preAsset, _ := a.assets.GetAsset(a.AssetId.String()); preAsset == nil { + asset.RawDefinitionByte, err = serializeAssetDef(a.AssetDefinition) if err != nil { return ErrSerializing } - if !testutil.DeepEqual(preRawDefinition, rawDefinition) && !a.UpdateAssetDef { - return errors.New("asset definition mismatch with previous definition") - } else if !testutil.DeepEqual(preRawDefinition, rawDefinition) { - // update asset def - // TODO: maybe merge with save - if !chainjson.IsValidJSON(rawDefinition) { - return errors.New("asset definition is not in valid json format") - } + // TODO: save AssetDefinition + if !chainjson.IsValidJSON(asset.RawDefinitionByte) { + return errors.New("asset definition is not in valid json format") } } - // TODO: save AssetDefinition - if !chainjson.IsValidJSON(rawDefinition) { - return errors.New("asset definition is not in valid json format") - } - arguments := [][]byte{} for _, argument := range a.Arguments { arguments = append(arguments, argument) } sourceID := testutil.MustDecodeHash(a.SourceID) - txin := types.NewCrossChainInput(arguments, sourceID, *a.AssetId, a.Amount, a.SourcePos, a.Program, rawDefinition) + // TODO: refactor rawDefinition + txin := types.NewCrossChainInput(arguments, sourceID, *a.AssetId, a.Amount, a.SourcePos, a.Program, asset.RawDefinitionByte) log.Info("cross-chain input action build") builder.RestrictMinTime(time.Now()) return builder.AddInput(txin, &txbuilder.SigningInstruction{}) -- 2.11.0