Skip to content

Commit

Permalink
Merge pull request fractalplatform#529 from fractalplatform/dev
Browse files Browse the repository at this point in the history
v1.0.0
  • Loading branch information
erickyan86 authored Dec 9, 2019
2 parents 4a7b242 + ee9d2f6 commit 2351651
Show file tree
Hide file tree
Showing 95 changed files with 2,144 additions and 573 deletions.
5 changes: 4 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

# default target is 'all'
all:

SHELL:=/bin/bash
REPO := $(shell pwd)
GOFILES_NOVENDOR := $(shell GOFLAGS="-mod=vendor" go list -f "{{.Dir}}" ./...)
Expand All @@ -24,7 +27,7 @@ export GOFLAGS=-mod=vendor
define build
@go build -ldflags " \
-X github.com/fractalplatform/fractal/cmd/utils.commit=$(shell cat commit_hash.txt) \
-X github.com/fractalplatform/fractal/cmd/utils.date=$(shell date '+%Y-%m-%d') \
-X github.com/fractalplatform/fractal/cmd/utils.date=$(shell date '+%Y-%m-%d-%H:%M:%S') \
-X 'github.com/fractalplatform/fractal/cmd/utils.goversion=$(shell go version)'" \
-o ${REPO}/build/bin/$(1) ./cmd/$(1)
endef
Expand Down
60 changes: 54 additions & 6 deletions accountmanager/accountmanager.go
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,7 @@ func SetAccountNameConfig(config *Config) bool {
accountNameLength = config.AccountNameMaxLength
return true
}

func GetAccountNameRegExp() *regexp.Regexp {
return acctRegExp
}
Expand Down Expand Up @@ -619,6 +620,7 @@ func (am *AccountManager) getParentAccount(accountName common.Name, parentIndex

// RecoverTx Make sure the transaction is signed properly and validate account authorization.
func (am *AccountManager) RecoverTx(signer types.Signer, tx *types.Transaction) error {
authorVersion := make(map[common.Name]common.Hash)
for _, action := range tx.GetActions() {
pubs, err := types.RecoverMultiKey(signer, action, tx)
if err != nil {
Expand Down Expand Up @@ -646,7 +648,6 @@ func (am *AccountManager) RecoverTx(signer types.Signer, tx *types.Transaction)
}
}

authorVersion := make(map[common.Name]common.Hash)
for name, acctAuthor := range recoverRes.acctAuthors {
var count uint64
for _, weight := range acctAuthor.indexWeight {
Expand All @@ -664,6 +665,53 @@ func (am *AccountManager) RecoverTx(signer types.Signer, tx *types.Transaction)

types.StoreAuthorCache(action, authorVersion)
}
if tx.PayerExist() {
for _, action := range tx.GetActions() {
pubs, err := types.RecoverPayerMultiKey(signer, action, tx)
if err != nil {
return err
}

if uint64(len(pubs)) > params.MaxSignLength {
return fmt.Errorf("exceed max sign length, want most %d, actual is %d", params.MaxSignLength, len(pubs))
}

sig := action.PayerSignature()
if sig == nil {
return fmt.Errorf("payer signature is nil")
}
parentIndex := sig.ParentIndex
signSender, err := am.getParentAccount(action.Payer(), parentIndex)
if err != nil {
return err
}
recoverRes := &recoverActionResult{make(map[common.Name]*accountAuthor)}
for i, pub := range pubs {
index := sig.SignData[uint64(i)].Index
if uint64(len(index)) > params.MaxSignDepth {
return fmt.Errorf("exceed max sign depth, want most %d, actual is %d", params.MaxSignDepth, len(index))
}

if err := am.ValidSign(signSender, pub, index, recoverRes); err != nil {
return err
}
}

for name, acctAuthor := range recoverRes.acctAuthors {
var count uint64
for _, weight := range acctAuthor.indexWeight {
count += weight
}
threshold := acctAuthor.threshold
if count < threshold {
return fmt.Errorf("account %s want threshold %d, but actual is %d", name, threshold, count)
}
authorVersion[name] = acctAuthor.version
}

types.StoreAuthorCache(action, authorVersion)
}
}
return nil
}

Expand Down Expand Up @@ -1337,12 +1385,12 @@ func (am *AccountManager) IssueAsset(fromName common.Name, asset IssueAsset, num
}

//IncAsset2Acct increase asset and add amount to accout balance
func (am *AccountManager) IncAsset2Acct(fromName common.Name, toName common.Name, assetID uint64, amount *big.Int) error {
func (am *AccountManager) IncAsset2Acct(fromName common.Name, toName common.Name, assetID uint64, amount *big.Int, forkID uint64) error {
if err := am.ast.CheckOwner(fromName, assetID); err != nil {
return err
}

if err := am.ast.IncreaseAsset(fromName, assetID, amount); err != nil {
if err := am.ast.IncreaseAsset(fromName, assetID, amount, forkID); err != nil {
return err
}
return nil
Expand All @@ -1365,7 +1413,7 @@ func (am *AccountManager) process(accountManagerContext *types.AccountManagerCon
var fromAccountExtra []common.Name
fromAccountExtra = append(fromAccountExtra, accountManagerContext.FromAccountExtra...)

if err := action.Check(accountManagerContext.ChainConfig); err != nil {
if err := action.Check(curForkID, accountManagerContext.ChainConfig); err != nil {
return nil, err
}

Expand Down Expand Up @@ -1458,7 +1506,7 @@ func (am *AccountManager) process(accountManagerContext *types.AccountManagerCon
return nil, ErrNegativeAmount
}

if err := am.IncAsset2Acct(action.Sender(), inc.To, inc.AssetID, inc.Amount); err != nil {
if err := am.IncAsset2Acct(action.Sender(), inc.To, inc.AssetID, inc.Amount, curForkID); err != nil {
return nil, err
}

Expand Down Expand Up @@ -1508,7 +1556,7 @@ func (am *AccountManager) process(accountManagerContext *types.AccountManagerCon
return nil, err
}

if err := am.ast.UpdateAsset(action.Sender(), asset.AssetID, asset.Founder); err != nil {
if err := am.ast.UpdateAsset(action.Sender(), asset.AssetID, asset.Founder, curForkID); err != nil {
return nil, err
}
case types.SetAssetOwner:
Expand Down
88 changes: 87 additions & 1 deletion accountmanager/accountmanager_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -1455,7 +1455,7 @@ func TestAccountManager_IncAsset2Acct(t *testing.T) {
sdb: tt.fields.sdb,
ast: tt.fields.ast,
}
if err := am.IncAsset2Acct(tt.args.fromName, tt.args.toName, tt.args.AssetID, tt.args.amount); (err != nil) != tt.wantErr {
if err := am.IncAsset2Acct(tt.args.fromName, tt.args.toName, tt.args.AssetID, tt.args.amount, 4); (err != nil) != tt.wantErr {
t.Errorf("%q. AccountManager.IncAsset2Acct() error = %v, wantErr %v", tt.name, err, tt.wantErr)
}
}
Expand Down Expand Up @@ -2226,3 +2226,89 @@ func Test_CheckAssetContract(t *testing.T) {
}
}
}

func TestAccountManager_CreateAccountFork1(t *testing.T) {
type fields struct {
sdb *state.StateDB
ast *asset.Asset
}
pubkey := new(common.PubKey)
pubkey2 := new(common.PubKey)
pubkey.SetBytes([]byte("abcde123456789"))

pubkey3, _ := GeneragePubKey()
type args struct {
fromName common.Name
accountName common.Name
founderName common.Name
pubkey common.PubKey
}
tests := []struct {
name string
fields fields
args args
wantErr bool
}{
{"createAccount", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("a111222332afork"), common.Name(""), pubkey3}, false},
{"createAccountSub", fields{sdb, ast}, args{common.Name("a111222332afork"), common.Name("a111222332afork.sub1"), common.Name(""), pubkey3}, false},
{"createAccountWithEmptyKey", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("a123456789fork"), common.Name(""), *pubkey2}, false},
{"createAccountWithEmptyKey", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("a123456789afork"), common.Name(""), *pubkey}, false},
{"createAccountWithInvalidName", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("a12345678-fork"), common.Name(""), *pubkey}, true},
{"createAccountWithInvalidName", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("a123456789aeeefork"), common.Name(""), *pubkey}, true},
{"createAccountNameInvalid", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("a12345678b"), common.Name(""), pubkey3}, true},
{"createinvalidAccount0", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("\ttesttestf1"), common.Name(""), *pubkey}, true},
{"createinvalidAccount1", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("testtestf1.."), common.Name(""), *pubkey}, true},
{"createinvalidAccount2", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("fractal.account"), common.Name(""), *pubkey}, true},
{"createinvalidAccount3", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("fractal.founder.1"), common.Name(""), *pubkey}, true},
{"createinvalidAccount4", fields{sdb, ast}, args{common.Name("fractal.founder"), common.Name("fractal.founder.12"), common.Name(""), *pubkey}, true},
{"createinvalidAccount5", fields{sdb, ast}, args{common.Name("a111222332afork"), common.Name("a111222332afork.founder1234"), common.Name(""), *pubkey}, true},
}
for _, tt := range tests {
am := &AccountManager{
sdb: tt.fields.sdb,
ast: tt.fields.ast,
}
if err := am.CreateAccount(tt.args.fromName, tt.args.accountName, tt.args.founderName, 0, 1, tt.args.pubkey, ""); (err != nil) != tt.wantErr {
t.Errorf("%q. AccountManager.CreateAccount() error = %v, wantErr %v", tt.name, err, tt.wantErr)
}
}
}

func TestAccountManager_AccountHaveCode(t *testing.T) {
type fields struct {
sdb *state.StateDB
ast *asset.Asset
}

field := &fields{sdb, ast}

pubkey, _ := GeneragePubKey()

am := &AccountManager{
sdb: field.sdb,
ast: field.ast,
}

err := am.CreateAccount(common.Name("fractal.founder"), common.Name("a111222332code"), common.Name(""), 0, 1, pubkey, "")
if err != nil {
t.Errorf("TestAccountManager_AccountHaveCode. AccountManager.CreateAccount() error = %v", err)
}

haveCode, err := am.AccountHaveCode(common.Name("a111222332code"))

if err != nil || haveCode == true {
t.Errorf("TestAccountManager_AccountHaveCode. account have code error = %v", err)
}

_, err = am.SetCode(common.Name("a111222332code"), []byte("abcde123456789"))

if err != nil {
t.Errorf("TestAccountManager_AccountHaveCode. set code error = %v", err)
}

haveCode, err = am.AccountHaveCode(common.Name("a111222332code"))

if err != nil || haveCode == false {
t.Errorf("TestAccountManager_AccountHaveCode. account not have code error = %v", err)
}
}
27 changes: 23 additions & 4 deletions asset/asset.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
"strconv"
"strings"

"github.com/ethereum/go-ethereum/common/math"
"github.com/ethereum/go-ethereum/log"
"github.com/fractalplatform/fractal/common"
"github.com/fractalplatform/fractal/params"
Expand Down Expand Up @@ -294,6 +295,11 @@ func (a *Asset) IssueAssetObject(ao *AssetObject) (uint64, error) {

//IssueAsset issue asset
func (a *Asset) IssueAsset(assetName string, number uint64, forkID uint64, symbol string, amount *big.Int, dec uint64, founder common.Name, owner common.Name, limit *big.Int, contract common.Name, description string) (uint64, error) {
if forkID >= params.ForkID4 {
if amount.Cmp(math.MaxBig256) > 0 {
return 0, ErrAmountOverMax256
}
}
_, err := a.GetAssetIDByName(assetName)
if err != nil && err != ErrAssetNotExist {
return 0, err
Expand Down Expand Up @@ -355,7 +361,7 @@ func (a *Asset) DestroyAsset(accountName common.Name, assetID uint64, amount *bi
}

//IncreaseAsset increase asset, upperlimit == 0 means no upper limit
func (a *Asset) IncreaseAsset(accountName common.Name, assetID uint64, amount *big.Int) error {
func (a *Asset) IncreaseAsset(accountName common.Name, assetID uint64, amount *big.Int, forkID uint64) error {
if accountName == "" {
return ErrAccountNameNull
}
Expand All @@ -372,6 +378,11 @@ func (a *Asset) IncreaseAsset(accountName common.Name, assetID uint64, amount *b
if asset == nil {
return ErrAssetNotExist
}
if forkID >= params.ForkID4 {
if (new(big.Int).Add(asset.GetAssetAmount(), amount)).Cmp(math.MaxBig256) > 0 {
return ErrAmountOverMax256
}
}
// if asset.GetAssetOwner() != accountName {
// return ErrOwnerMismatch
// }
Expand All @@ -398,7 +409,7 @@ func (a *Asset) IncreaseAsset(accountName common.Name, assetID uint64, amount *b
}

//UpdateAsset change asset info
func (a *Asset) UpdateAsset(accountName common.Name, assetID uint64, founderName common.Name) error {
func (a *Asset) UpdateAsset(accountName common.Name, assetID uint64, founderName common.Name, curForkID uint64) error {
if accountName == "" {
return ErrAccountNameNull
}
Expand All @@ -412,8 +423,16 @@ func (a *Asset) UpdateAsset(accountName common.Name, assetID uint64, founderName
// if asset.GetAssetOwner() != accountName {
// return ErrOwnerMismatch
// }

asset.SetAssetFounder(founderName)
if curForkID >= params.ForkID4 {
if len(founderName.String()) == 0 {
assetOwner := asset.GetAssetOwner()
asset.SetAssetFounder(assetOwner)
} else {
asset.SetAssetFounder(founderName)
}
} else {
asset.SetAssetFounder(founderName)
}
return a.SetAssetObject(asset)
}

Expand Down
Loading

0 comments on commit 2351651

Please sign in to comment.