OSDN Git Service

Remove annotated struct (#242)
authorPaladz <yzhu101@uottawa.ca>
Fri, 5 Jan 2018 01:54:50 +0000 (09:54 +0800)
committerGitHub <noreply@github.com>
Fri, 5 Jan 2018 01:54:50 +0000 (09:54 +0800)
* tmp save

* all I wanna for Xmas is you

* edit format for test

* fix issue program display issue

blockchain/account/accounts.go
blockchain/account/builder.go
blockchain/account/receivers.go
blockchain/asset/asset.go
blockchain/signers/signers.go
cmd/bytomcli/commands/transaction.go
integration_test/standard_transaction_test.go

index 422ec62..37b4321 100755 (executable)
@@ -111,6 +111,7 @@ func (m *Manager) ExpireReservations(ctx context.Context, period time.Duration)
 // Account is structure of Bytom account
 type Account struct {
        *signers.Signer
+       ID    string                 `json:"id"`
        Alias string                 `json:"alias"`
        Tags  map[string]interface{} `json:"tags"`
 }
@@ -121,21 +122,21 @@ func (m *Manager) Create(ctx context.Context, xpubs []chainkd.XPub, quorum int,
                return nil, ErrDuplicateAlias
        }
 
-       signer, err := signers.Create(ctx, m.db, "account", xpubs, quorum, accessToken)
+       id, signer, err := signers.Create(ctx, m.db, "account", xpubs, quorum, accessToken)
        if err != nil {
                return nil, errors.Wrap(err)
        }
 
-       account := &Account{Signer: signer, Alias: alias, Tags: tags}
+       account := &Account{Signer: signer, ID: id, Alias: alias, Tags: tags}
        rawAccount, err := json.Marshal(account)
        if err != nil {
                return nil, ErrMarshalAccount
        }
        storeBatch := m.db.NewBatch()
 
-       accountID := Key(signer.ID)
+       accountID := Key(id)
        storeBatch.Set(accountID, rawAccount)
-       storeBatch.Set(aliasKey(alias), []byte(signer.ID))
+       storeBatch.Set(aliasKey(alias), []byte(id))
        storeBatch.Write()
 
        return account, nil
@@ -181,7 +182,7 @@ func (m *Manager) UpdateTags(ctx context.Context, accountInfo string, tags map[s
 }
 
 // FindByAlias retrieves an account's Signer record by its alias
-func (m *Manager) FindByAlias(ctx context.Context, alias string) (*signers.Signer, error) {
+func (m *Manager) FindByAlias(ctx context.Context, alias string) (*Account, error) {
        m.cacheMu.Lock()
        cachedID, ok := m.aliasCache.Get(alias)
        m.cacheMu.Unlock()
@@ -202,12 +203,12 @@ func (m *Manager) FindByAlias(ctx context.Context, alias string) (*signers.Signe
 }
 
 // findByID returns an account's Signer record by its ID.
-func (m *Manager) findByID(ctx context.Context, id string) (*signers.Signer, error) {
+func (m *Manager) findByID(ctx context.Context, id string) (*Account, error) {
        m.cacheMu.Lock()
-       cachedSigner, ok := m.cache.Get(id)
+       cachedAccount, ok := m.cache.Get(id)
        m.cacheMu.Unlock()
        if ok {
-               return cachedSigner.(*signers.Signer), nil
+               return cachedAccount.(*Account), nil
        }
 
        rawAccount := m.db.Get(Key(id))
@@ -215,15 +216,15 @@ func (m *Manager) findByID(ctx context.Context, id string) (*signers.Signer, err
                return nil, ErrFindAccount
        }
 
-       var account Account
-       if err := json.Unmarshal(rawAccount, &account); err != nil {
+       account := &Account{}
+       if err := json.Unmarshal(rawAccount, account); err != nil {
                return nil, err
        }
 
        m.cacheMu.Lock()
-       m.cache.Add(id, account.Signer)
+       m.cache.Add(id, account)
        m.cacheMu.Unlock()
-       return account.Signer, nil
+       return account, nil
 }
 
 // GetAliasByID return the account alias by given ID
@@ -266,12 +267,12 @@ func (m *Manager) CreateAddress(ctx context.Context, accountID string, change bo
        return cp, nil
 }
 
-func (m *Manager) createP2PKH(ctx context.Context, account *signers.Signer, change bool, expiresAt time.Time) (*CtrlProgram, error) {
+func (m *Manager) createP2PKH(ctx context.Context, account *Account, change bool, expiresAt time.Time) (*CtrlProgram, error) {
        idx, err := m.nextIndex(ctx)
        if err != nil {
                return nil, err
        }
-       path := signers.Path(account, signers.AccountKeySpace, idx)
+       path := signers.Path(account.Signer, signers.AccountKeySpace, idx)
        derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
        derivedPK := derivedXPubs[0].PublicKey()
        pubHash := crypto.Ripemd160(derivedPK)
@@ -297,13 +298,13 @@ func (m *Manager) createP2PKH(ctx context.Context, account *signers.Signer, chan
        }, nil
 }
 
-func (m *Manager) createP2SH(ctx context.Context, account *signers.Signer, change bool, expiresAt time.Time) (*CtrlProgram, error) {
+func (m *Manager) createP2SH(ctx context.Context, account *Account, change bool, expiresAt time.Time) (*CtrlProgram, error) {
        idx, err := m.nextIndex(ctx)
        if err != nil {
                return nil, err
        }
 
-       path := signers.Path(account, signers.AccountKeySpace, idx)
+       path := signers.Path(account.Signer, signers.AccountKeySpace, idx)
        derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
        derivedPKs := chainkd.XPubKeys(derivedXPubs)
        signScript, err := vmutil.P2SPMultiSigProgram(derivedPKs, account.Quorum)
@@ -344,7 +345,7 @@ func (m *Manager) createControlProgram(ctx context.Context, accountID string, ch
                return nil, err
        }
 
-       path := signers.Path(account, signers.AccountKeySpace, idx)
+       path := signers.Path(account.Signer, signers.AccountKeySpace, idx)
        derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
        derivedPKs := chainkd.XPubKeys(derivedXPubs)
        control, err := vmutil.P2SPMultiSigProgram(derivedPKs, account.Quorum)
@@ -401,17 +402,17 @@ func (m *Manager) insertAccountControlProgram(ctx context.Context, progs ...*Ctr
 
 // GetCoinbaseControlProgram will return a coinbase script
 func (m *Manager) GetCoinbaseControlProgram(height uint64) ([]byte, error) {
-       signerIter := m.db.IteratorPrefix([]byte(accountPrefix))
-       if !signerIter.Next() {
+       accountIter := m.db.IteratorPrefix([]byte(accountPrefix))
+       defer accountIter.Release()
+       if !accountIter.Next() {
                log.Warningf("GetCoinbaseControlProgram: can't find any account in db")
                return vmutil.CoinbaseProgram(nil, 0, height)
        }
-       rawSigner := signerIter.Value()
-       signerIter.Release()
+       rawAccount := accountIter.Value()
 
-       signer := &signers.Signer{}
-       if err := json.Unmarshal(rawSigner, signer); err != nil {
-               log.Errorf("GetCoinbaseControlProgram: fail to unmarshal signer %v", err)
+       account := &Account{}
+       if err := json.Unmarshal(rawAccount, account); err != nil {
+               log.Errorf("GetCoinbaseControlProgram: fail to unmarshal account %v", err)
                return vmutil.CoinbaseProgram(nil, 0, height)
        }
 
@@ -421,17 +422,17 @@ func (m *Manager) GetCoinbaseControlProgram(height uint64) ([]byte, error) {
                log.Errorf("GetCoinbaseControlProgram: fail to get nextIndex %v", err)
                return vmutil.CoinbaseProgram(nil, 0, height)
        }
-       path := signers.Path(signer, signers.AccountKeySpace, idx)
-       derivedXPubs := chainkd.DeriveXPubs(signer.XPubs, path)
+       path := signers.Path(account.Signer, signers.AccountKeySpace, idx)
+       derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
        derivedPKs := chainkd.XPubKeys(derivedXPubs)
 
-       script, err := vmutil.CoinbaseProgram(derivedPKs, signer.Quorum, height)
+       script, err := vmutil.CoinbaseProgram(derivedPKs, account.Quorum, height)
        if err != nil {
                return script, err
        }
 
        err = m.insertAccountControlProgram(ctx, &CtrlProgram{
-               AccountID:      signer.ID,
+               AccountID:      account.ID,
                KeyIndex:       idx,
                ControlProgram: script,
                Change:         false,
index 019f436..be1a7d8 100755 (executable)
@@ -63,7 +63,7 @@ func (a *spendAction) Build(ctx context.Context, b *txbuilder.TemplateBuilder) e
        b.OnRollback(canceler(ctx, a.accounts, res.ID))
 
        for _, r := range res.UTXOs {
-               txInput, sigInst, err := UtxoToInputs(acct, r, a.ReferenceData)
+               txInput, sigInst, err := UtxoToInputs(acct.Signer, r, a.ReferenceData)
                if err != nil {
                        return errors.Wrap(err, "creating inputs")
                }
@@ -116,18 +116,12 @@ func (a *spendUTXOAction) Build(ctx context.Context, b *txbuilder.TemplateBuilde
        }
        b.OnRollback(canceler(ctx, a.accounts, res.ID))
 
-       var acct *signers.Signer
-       if res.Source.AccountID == "" {
-               //TODO coinbase
-               acct = &signers.Signer{}
-       } else {
-               acct, err = a.accounts.findByID(ctx, res.Source.AccountID)
-               if err != nil {
-                       return err
-               }
+       account, err := a.accounts.findByID(ctx, res.Source.AccountID)
+       if err != nil {
+               return err
        }
 
-       txInput, sigInst, err := UtxoToInputs(acct, res.UTXOs[0], a.ReferenceData)
+       txInput, sigInst, err := UtxoToInputs(account.Signer, res.UTXOs[0], a.ReferenceData)
        if err != nil {
                return err
        }
@@ -144,12 +138,12 @@ func canceler(ctx context.Context, m *Manager, rid uint64) func() {
 }
 
 // UtxoToInputs convert an utxo to the txinput
-func UtxoToInputs(account *signers.Signer, u *UTXO, refData []byte) (*legacy.TxInput, *txbuilder.SigningInstruction, error) {
+func UtxoToInputs(signer *signers.Signer, u *UTXO, refData []byte) (*legacy.TxInput, *txbuilder.SigningInstruction, error) {
        txInput := legacy.NewSpendInput(nil, u.SourceID, u.AssetID, u.Amount, u.SourcePos, u.ControlProgram, u.RefDataHash, refData)
-       path := signers.Path(account, signers.AccountKeySpace, u.ControlProgramIndex)
+       path := signers.Path(signer, signers.AccountKeySpace, u.ControlProgramIndex)
        sigInst := &txbuilder.SigningInstruction{}
        if u.Address == "" {
-               sigInst.AddWitnessKeys(account.XPubs, path, account.Quorum)
+               sigInst.AddWitnessKeys(signer.XPubs, path, signer.Quorum)
                return txInput, sigInst, nil
        }
 
@@ -160,17 +154,17 @@ func UtxoToInputs(account *signers.Signer, u *UTXO, refData []byte) (*legacy.TxI
 
        switch address.(type) {
        case *common.AddressWitnessPubKeyHash:
-               sigInst.AddRawWitnessKeys(account.XPubs, path, account.Quorum)
-               derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
+               sigInst.AddRawWitnessKeys(signer.XPubs, path, signer.Quorum)
+               derivedXPubs := chainkd.DeriveXPubs(signer.XPubs, path)
                derivedPK := derivedXPubs[0].PublicKey()
                sigInst.WitnessComponents = append(sigInst.WitnessComponents, txbuilder.DataWitness([]byte(derivedPK)))
 
        case *common.AddressWitnessScriptHash:
-               sigInst.AddWitnessKeys(account.XPubs, path, account.Quorum)
-               path := signers.Path(account, signers.AccountKeySpace, u.ControlProgramIndex)
-               derivedXPubs := chainkd.DeriveXPubs(account.XPubs, path)
+               sigInst.AddWitnessKeys(signer.XPubs, path, signer.Quorum)
+               path := signers.Path(signer, signers.AccountKeySpace, u.ControlProgramIndex)
+               derivedXPubs := chainkd.DeriveXPubs(signer.XPubs, path)
                derivedPKs := chainkd.XPubKeys(derivedXPubs)
-               script, err := vmutil.P2SPMultiSigProgram(derivedPKs, account.Quorum)
+               script, err := vmutil.P2SPMultiSigProgram(derivedPKs, signer.Quorum)
                if err != nil {
                        return nil, nil, err
                }
index 44312fc..2021272 100755 (executable)
@@ -55,7 +55,8 @@ func (m *Manager) CreateAddressReceiver(ctx context.Context, accountInfo string,
        }
 
        return &txbuilder.Receiver{
-               Address:   program.Address,
-               ExpiresAt: expiresAt,
+               ControlProgram: program.ControlProgram,
+               Address:        program.Address,
+               ExpiresAt:      expiresAt,
        }, nil
 }
index 8a935fb..2f31560 100755 (executable)
@@ -3,7 +3,6 @@ package asset
 import (
        "context"
        "encoding/json"
-       "fmt"
        "sync"
 
        "github.com/golang/groupcache/lru"
@@ -16,6 +15,7 @@ import (
        "github.com/bytom/consensus"
        "github.com/bytom/crypto/ed25519"
        "github.com/bytom/crypto/ed25519/chainkd"
+       chainjson "github.com/bytom/encoding/json"
        "github.com/bytom/errors"
        "github.com/bytom/protocol"
        "github.com/bytom/protocol/bc"
@@ -73,15 +73,15 @@ type Registry struct {
 
 //Asset describe asset on bytom chain
 type Asset struct {
-       AssetID          bc.AssetID
-       Alias            *string
-       VMVersion        uint64
-       IssuanceProgram  []byte
-       InitialBlockHash bc.Hash
        *signers.Signer
-       Tags              map[string]interface{}
-       RawDefinitionByte []byte
-       DefinitionMap     map[string]interface{}
+       AssetID           bc.AssetID             `json:"id"`
+       Alias             *string                `json:"alias"`
+       VMVersion         uint64                 `json:"vm_version"`
+       IssuanceProgram   chainjson.HexBytes     `json:"issue_program"`
+       InitialBlockHash  bc.Hash                `json:"init_blockhash"`
+       Tags              map[string]interface{} `json:"tags"`
+       RawDefinitionByte []byte                 `json:"raw_definition_byte"`
+       DefinitionMap     map[string]interface{} `json:"definition"`
 }
 
 //RawDefinition return asset in the raw format
@@ -95,7 +95,7 @@ func (reg *Registry) Define(ctx context.Context, xpubs []chainkd.XPub, quorum in
                return nil, ErrDuplicateAlias
        }
 
-       assetSigner, err := signers.Create(ctx, reg.db, "asset", xpubs, quorum, clientToken)
+       _, assetSigner, err := signers.Create(ctx, reg.db, "asset", xpubs, quorum, clientToken)
        if err != nil {
                return nil, err
        }
@@ -261,62 +261,19 @@ func (reg *Registry) GetAliasByID(id string) string {
        return *asset.Alias
 }
 
-type annotatedAsset struct {
-       AssetID          string           `json:"id"`
-       Alias            string           `json:"alias"`
-       VMVersion        uint64           `json:"vm_version"`
-       IssuanceProgram  string           `json:"issue_program"`
-       InitialBlockHash string           `json:"init_blockhash"`
-       XPubs            []chainkd.XPub   `json:"xpubs"`
-       Quorum           int              `json:"quorum"`
-       KeyIndex         uint64           `json:"key_index"`
-       Definition       *json.RawMessage `json:"definition"`
-       Tags             *json.RawMessage `json:"tags"`
-}
-
 // ListAssets returns the accounts in the db
-func (reg *Registry) ListAssets(id string) ([]annotatedAsset, error) {
-       asset := Asset{}
-       tmpAsset := annotatedAsset{}
-       assets := make([]annotatedAsset, 0)
-       jsonTags := json.RawMessage(`{}`)
-       jsonDefinition := json.RawMessage(`{}`)
-
+func (reg *Registry) ListAssets(id string) ([]*Asset, error) {
+       assets := []*Asset{}
        assetIter := reg.db.IteratorPrefix([]byte(assetPrefix + id))
        defer assetIter.Release()
 
        for assetIter.Next() {
-               if err := json.Unmarshal(assetIter.Value(), &asset); err != nil {
+               asset := &Asset{}
+               if err := json.Unmarshal(assetIter.Value(), asset); err != nil {
                        return nil, err
                }
-
-               tmpAsset.AssetID = asset.AssetID.String()
-               tmpAsset.Alias = *asset.Alias
-               tmpAsset.VMVersion = asset.VMVersion
-               tmpAsset.InitialBlockHash = asset.InitialBlockHash.String()
-               tmpAsset.IssuanceProgram = fmt.Sprintf("%x", asset.IssuanceProgram)
-               tmpAsset.XPubs = asset.XPubs
-               tmpAsset.Quorum = asset.Quorum
-               tmpAsset.KeyIndex = asset.KeyIndex
-
-               // a.RawDefinition is the asset definition as it appears on the
-               // blockchain, so it's untrusted and may not be valid json.
-               if isValidJSON(asset.RawDefinition()) {
-                       jsonDefinition = json.RawMessage(asset.RawDefinition())
-               }
-               tmpAsset.Definition = &jsonDefinition
-               if asset.Tags != nil {
-                       t, err := json.Marshal(asset.Tags)
-                       if err != nil {
-                               return nil, err
-                       }
-                       jsonTags = t
-               }
-               tmpAsset.Tags = &jsonTags
-
-               assets = append(assets, tmpAsset)
+               assets = append(assets, asset)
        }
-
        return assets, nil
 }
 
index 067b808..b748348 100755 (executable)
@@ -46,7 +46,6 @@ var (
 // which is composed of a set of keys as well as
 // the amount of signatures needed for quorum.
 type Signer struct {
-       ID       string         `json:"id"`
        Type     string         `json:"type"`
        XPubs    []chainkd.XPub `json:"xpubs"`
        Quorum   int            `json:"quorum"`
@@ -68,20 +67,20 @@ func Path(s *Signer, ks keySpace, itemIndexes ...uint64) [][]byte {
 }
 
 // Create creates and stores a Signer in the database
-func Create(ctx context.Context, db dbm.DB, signerType string, xpubs []chainkd.XPub, quorum int, clientToken string) (*Signer, error) {
+func Create(ctx context.Context, db dbm.DB, signerType string, xpubs []chainkd.XPub, quorum int, clientToken string) (string, *Signer, error) {
        if len(xpubs) == 0 {
-               return nil, errors.Wrap(ErrNoXPubs)
+               return "", nil, errors.Wrap(ErrNoXPubs)
        }
 
        sort.Sort(sortKeys(xpubs)) // this transforms the input slice
        for i := 1; i < len(xpubs); i++ {
                if bytes.Equal(xpubs[i][:], xpubs[i-1][:]) {
-                       return nil, errors.WithDetailf(ErrDupeXPub, "duplicated key=%x", xpubs[i])
+                       return "", nil, errors.WithDetailf(ErrDupeXPub, "duplicated key=%x", xpubs[i])
                }
        }
 
        if quorum == 0 || quorum > len(xpubs) {
-               return nil, errors.Wrap(ErrBadQuorum)
+               return "", nil, errors.Wrap(ErrBadQuorum)
        }
 
        var xpubBytes [][]byte
@@ -90,15 +89,8 @@ func Create(ctx context.Context, db dbm.DB, signerType string, xpubs []chainkd.X
                xpubBytes = append(xpubBytes, key[:])
        }
 
-       var (
-               id       string
-               keyIndex uint64
-       )
-
-       id, keyIndex = IdGenerate()
-
-       return &Signer{
-               ID:       id,
+       id, keyIndex := IdGenerate()
+       return id, &Signer{
                Type:     signerType,
                XPubs:    xpubs,
                Quorum:   quorum,
@@ -106,20 +98,6 @@ func Create(ctx context.Context, db dbm.DB, signerType string, xpubs []chainkd.X
        }, nil
 }
 
-func New(id, typ string, xpubs [][]byte, quorum int, keyIndex uint64) (*Signer, error) {
-       keys, err := ConvertKeys(xpubs)
-       if err != nil {
-               return nil, errors.WithDetail(errors.New("bad xpub in databse"), errors.Detail(err))
-       }
-       return &Signer{
-               ID:       id,
-               Type:     typ,
-               XPubs:    keys,
-               Quorum:   quorum,
-               KeyIndex: keyIndex,
-       }, nil
-}
-
 // Find retrieves a Signer from the database
 // using the type and id.
 func Find(ctx context.Context, db dbm.DB, typ, id string) (*Signer, error) {
index 6953b02..2fbf241 100644 (file)
@@ -93,8 +93,8 @@ var buildControlAddressReqFmt = `
 var buildControlAddressReqFmtByAlias = `
        {"actions": [
                {"type": "spend_account", "asset_id": "ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff", "amount":%s, "account_alias": "%s"},
-               {"type": "spend_account", "asset_id": "%s","amount": %s, "account_alias": "%s"},
-               {"type": "control_address", "asset_id": "%s", "amount": %s,"address": "%s"}
+               {"type": "spend_account", "asset_alias": "%s","amount": %s, "account_alias": "%s"},
+               {"type": "control_address", "asset_alias": "%s", "amount": %s,"address": "%s"}
        ]}`
 
 var buildTransactionCmd = &cobra.Command{
index 85330fb..aa84c3a 100644 (file)
@@ -53,7 +53,7 @@ func TestP2PKH(t *testing.T) {
                t.Fatal(err)
        }
 
-       controlProg, err := accountManager.CreateAddress(nil, testAccount.Signer.ID, false, time.Now())
+       controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false, time.Now())
        if err != nil {
                t.Fatal(err)
        }
@@ -109,7 +109,7 @@ func TestP2SH(t *testing.T) {
                t.Fatal(err)
        }
 
-       controlProg, err := accountManager.CreateAddress(nil, testAccount.Signer.ID, false, time.Now())
+       controlProg, err := accountManager.CreateAddress(nil, testAccount.ID, false, time.Now())
        if err != nil {
                t.Fatal(err)
        }