- dev
script:
- - make test
+ - make ci
functional-tests:
@go test -v -timeout=30m -tags=functional ./test
+ci: test functional-tests
+
.PHONY: all target release-all clean test benchmark
pubHash := crypto.Ripemd160(derivedPK)
// TODO: pass different params due to config
- address, err := common.NewAddressWitnessPubKeyHash(pubHash, consensus.ActiveNetParams)
+ address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams)
if err != nil {
return nil, err
}
scriptHash := crypto.Sha256(signScript)
// TODO: pass different params due to config
- address, err := common.NewAddressWitnessScriptHash(scriptHash, consensus.ActiveNetParams)
+ address, err := common.NewAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
if err != nil {
return nil, err
}
return txInput, sigInst, nil
}
- address, err := common.DecodeAddress(u.Address, consensus.ActiveNetParams)
+ address, err := common.DecodeAddress(u.Address, &consensus.ActiveNetParams)
if err != nil {
return nil, nil, err
}
Vaild: false,
IsLocal: false,
}
- address, err := common.DecodeAddress(ins.Address, consensus.ActiveNetParams)
+ address, err := common.DecodeAddress(ins.Address, &consensus.ActiveNetParams)
if err != nil {
return NewSuccessResponse(resp)
}
m.Handle("/create-asset", jsonHandler(a.createAsset))
m.Handle("/update-asset-alias", jsonHandler(a.updateAssetAlias))
+ m.Handle("/get-asset", jsonHandler(a.getAsset))
m.Handle("/list-assets", jsonHandler(a.listAssets))
m.Handle("/create-key", jsonHandler(a.pseudohsmCreateKey))
return NewSuccessResponse(annotatedAccounts)
}
-// POST /list-assets
-func (a *API) listAssets(ctx context.Context, filter struct {
+// POST /get-asset
+func (a *API) getAsset(ctx context.Context, filter struct {
ID string `json:"id"`
}) Response {
- assets, err := a.wallet.AssetReg.ListAssets(filter.ID)
+ asset, err := a.wallet.AssetReg.GetAsset(filter.ID)
+ if err != nil {
+ log.Errorf("getAsset: %v", err)
+ return NewErrorResponse(err)
+ }
+
+ return NewSuccessResponse(asset)
+}
+
+// POST /list-assets
+func (a *API) listAssets(ctx context.Context) Response {
+ assets, err := a.wallet.AssetReg.ListAssets()
if err != nil {
log.Errorf("listAssets: %v", err)
return NewErrorResponse(err)
return NewSuccessResponse(tx)
}
+type unconfirmedTxsResp struct {
+ Total uint64 `json:"total"`
+ TxIDs []bc.Hash `json:"tx_ids"`
+}
+
// POST /list-unconfirmed-transactions
func (a *API) listUnconfirmedTxs(ctx context.Context) Response {
txIDs := []bc.Hash{}
txIDs = append(txIDs, bc.Hash(txDesc.Tx.ID))
}
- return NewSuccessResponse(txIDs)
+ return NewSuccessResponse(&unconfirmedTxsResp{
+ Total: uint64(len(txIDs)),
+ TxIDs: txIDs,
+ })
}
// POST /list-unspent-outputs
return *asset.Alias
}
+// GetAsset get asset by assetID
+func (reg *Registry) GetAsset(id string) (*Asset, error) {
+ asset := &Asset{}
+
+ if strings.Compare(id, DefaultNativeAsset.AssetID.String()) == 0 {
+ return DefaultNativeAsset, nil
+ }
+
+ if interAsset := reg.db.Get([]byte(assetPrefix + id)); interAsset != nil {
+ if err := json.Unmarshal(interAsset, asset); err != nil {
+ return nil, err
+ }
+ return asset, nil
+ }
+
+ if extAsset := reg.db.Get([]byte(ExternalAssetPrefix + id)); extAsset != nil {
+ if err := json.Unmarshal(extAsset, asset); err != nil {
+ return nil, err
+ }
+ }
+ return asset, nil
+}
+
// ListAssets returns the accounts in the db
-func (reg *Registry) ListAssets(id string) ([]*Asset, error) {
+func (reg *Registry) ListAssets() ([]*Asset, error) {
assets := []*Asset{DefaultNativeAsset}
assetIter := reg.db.IteratorPrefix(assetPrefix)
defer assetIter.Release()
}
assets = append(assets, asset)
}
+
return assets, nil
}
wantAssets := []*Asset{DefaultNativeAsset, firstAsset, secondAsset}
- gotAssets, err := reg.ListAssets("")
+ gotAssets, err := reg.ListAssets()
if err != nil {
testutil.FatalErr(t, err)
}
"sync"
"time"
+ log "github.com/sirupsen/logrus"
+
"github.com/bytom/crypto/ed25519/chainkd"
)
func (kc *keyCache) reload() {
keys, err := kc.scan()
if err != nil {
- fmt.Printf("can't load keys: %v\n", err.Error())
+ log.WithField("load keys error", err).Error("can't load keys")
}
kc.all = keys
sort.Sort(kc.all)
for _, k := range keys {
kc.byPubs[k.XPub] = append(kc.byPubs[k.XPub], k)
}
- fmt.Printf("reloaded keys, cache has %d keys\n", len(kc.all))
+ log.WithField("cache has keys:", len(kc.all)).Debug("reloaded keys")
}
func (kc *keyCache) scan() ([]XPub, error) {
err = json.NewDecoder(buf).Decode(&keyJSON)
switch {
case err != nil:
- fmt.Printf("can't decode key %s: %v", path, err)
+ log.WithField("decode json err", err).Errorf("can't decode key %s: %v", path, err)
case (keyJSON.Alias == ""):
- fmt.Printf("can't decode key %s: missing or void alias", path)
+ log.WithField("can't decode key, key path:", path).Warn("missing or void alias")
default:
keys = append(keys, XPub{XPub: keyJSON.XPub, Alias: keyJSON.Alias, File: path})
}
return MissingFieldsError(missing...)
}
- address, err := common.DecodeAddress(a.Address, consensus.ActiveNetParams)
+ address, err := common.DecodeAddress(a.Address, &consensus.ActiveNetParams)
if err != nil {
return err
}
createAssetCmd.PersistentFlags().IntVarP(&assetQuorum, "quorom", "q", 1, "quorum must be greater than 0 and less than or equal to the number of signers")
createAssetCmd.PersistentFlags().StringVarP(&assetToken, "access", "a", "", "access token")
createAssetCmd.PersistentFlags().StringVarP(&assetDefiniton, "definition", "d", "", "definition for the asset")
-
- listAssetsCmd.PersistentFlags().StringVar(&assetID, "id", "", "ID of asset")
}
var (
- assetID = ""
assetQuorum = 1
assetToken = ""
assetDefiniton = ""
},
}
+var getAssetCmd = &cobra.Command{
+ Use: "get-asset <assetID>",
+ Short: "get asset by assetID",
+ Args: cobra.ExactArgs(1),
+ Run: func(cmd *cobra.Command, args []string) {
+ filter := struct {
+ ID string `json:"id"`
+ }{ID: args[0]}
+
+ data, exitCode := util.ClientCall("/get-asset", &filter)
+ if exitCode != util.Success {
+ os.Exit(exitCode)
+ }
+
+ printJSON(data)
+ },
+}
+
var listAssetsCmd = &cobra.Command{
Use: "list-assets",
Short: "List the existing assets",
Args: cobra.NoArgs,
Run: func(cmd *cobra.Command, args []string) {
- filter := struct {
- ID string `json:"id"`
- }{ID: assetID}
-
- data, exitCode := util.ClientCall("/list-assets", &filter)
+ data, exitCode := util.ClientCall("/list-assets")
if exitCode != util.Success {
os.Exit(exitCode)
}
BytomcliCmd.AddCommand(validateAddressCmd)
BytomcliCmd.AddCommand(createAssetCmd)
+ BytomcliCmd.AddCommand(getAssetCmd)
BytomcliCmd.AddCommand(listAssetsCmd)
BytomcliCmd.AddCommand(updateAssetAliasCmd)
os.Exit(exitCode)
}
- printJSONList(data)
+ printJSON(data)
},
}
Bech32HRPSegwit string
}
-var ActiveNetParams = &MainNetParams
+var ActiveNetParams = MainNetParams
+
+// NetParams is the correspondence between chain_id and Params
+var NetParams = map[string]Params{
+ "mainnet": MainNetParams,
+ "testnet": TestNetParams,
+}
// MainNetParams is the config for production
var MainNetParams = Params{
func NewNode(config *cfg.Config) *Node {
ctx := context.Background()
- if config.ChainID == "testnet" {
- consensus.ActiveNetParams = &consensus.TestNetParams
- }
+ initActiveNetParams(config)
// Get store
txDB := dbm.NewDB("txdb", config.DBBackend, config.DBDir())
store := leveldb.NewStore(txDB)
return node
}
+func initActiveNetParams(config *cfg.Config) {
+ var exist bool
+ consensus.ActiveNetParams, exist = consensus.NetParams[config.ChainID]
+ if !exist {
+ cmn.Exit(cmn.Fmt("chain_id[%v] don't exist", config.ChainID))
+ }
+}
+
func initOrRecoverAccount(hsm *pseudohsm.HSM, wallet *w.Wallet) error {
xpubs := hsm.ListKeys()
}
tp.newTxCh <- tx
- log.WithField("tx_id", tx.Tx.ID.String()).Info("Add tx to mempool")
+ log.WithField("tx_id", tx.Tx.ID.String()).Debug("Add tx to mempool")
return txD, nil
}
delete(tp.pool, *txHash)
atomic.StoreInt64(&tp.lastUpdated, time.Now().Unix())
- log.WithField("tx_id", txHash).Info("remove tx from mempool")
+ log.WithField("tx_id", txHash).Debug("remove tx from mempool")
}
// GetTransaction return the TxDesc by hash
}
func buildP2PKHAddress(pubHash []byte) string {
- address, err := common.NewAddressWitnessPubKeyHash(pubHash, consensus.ActiveNetParams)
+ address, err := common.NewAddressWitnessPubKeyHash(pubHash, &consensus.ActiveNetParams)
if err != nil {
return ""
}
}
func buildP2SHAddress(scriptHash []byte) string {
- address, err := common.NewAddressWitnessScriptHash(scriptHash, consensus.ActiveNetParams)
+ address, err := common.NewAddressWitnessScriptHash(scriptHash, &consensus.ActiveNetParams)
if err != nil {
return ""
}