zoukankan      html  css  js  c++  java
  • 模仿以太坊 ERC20 规范的 Hyperledger Fabric 实现 Token 通证

    合约:

    package main 
    
    /* 
    --------------------------------------------------
    Author: netkiller <netkiller@msn.com>
    Home: http://www.netkiller.cn
    Data: 2018-03-20 11:00 PM
    --------------------------------------------------
    
    CORE_PEER_ADDRESS=peer:7051 CORE_CHAINCODE_ID_NAME=token3:1.0 chaincode/token/token3
    
    peer chaincode install -n token3 -v 1.0 -p chaincodedev/chaincode/token
    peer chaincode instantiate -C myc -n token3 -v 1.0 -c '{"Args":[""]}' -P "OR ('Org1MSP.member','Org2MSP.member')"
    
    
    peer chaincode invoke -C myc -n token3 -c '{"function":"createAccount","Args":["coinbase"]}'
    peer chaincode invoke -C myc -n token3 -v 1.0 -c '{"function":"showAccount","Args":["coinbase"]}'
    peer chaincode invoke -C myc -n token3 -c '{"function":"balanceAll","Args":["coinbase"]}'
    
    peer chaincode invoke -C myc -n token3 -c '{"function":"initCurrency","Args":["Netkiller Token","NKC","1000000","coinbase"]}'
    peer chaincode invoke -C myc -n token3 -c '{"function":"initCurrency","Args":["NEO Token","NEC","1000000","coinbase"]}'
    
    peer chaincode invoke -C myc -n token3 -c '{"function":"setLock","Args":["true"]}'
    peer chaincode invoke -C myc -n token3 -c '{"function":"setLock","Args":["false"]}'
    
    peer chaincode invoke -C myc -n token3 -c '{"function":"mintToken","Args":["NKC","5000","coinbase"]}'
    
    peer chaincode invoke -C myc -n token3 -c '{"function":"createAccount","Args":["netkiller"]}'
    peer chaincode invoke -C myc -n token3 -c '{"function":"transferToken","Args":["coinbase","netkiller","NKC","100"]}'		
    peer chaincode invoke -C myc -n token3 -c '{"function":"balance","Args":["netkiller","NKC"]}'
    
    peer chaincode invoke -C myc -n token3 -c '{"function":"frozenAccount","Args":["netkiller","true"]}'
    
    --------------------------------------------------
    
    */
    
    import (
    	"encoding/json"
    	"fmt"
    	"strconv"
    
    	"github.com/hyperledger/fabric/core/chaincode/shim"
    	pb "github.com/hyperledger/fabric/protos/peer"
    )
    
    type Msg struct{
    	Status 	bool	`json:"Status"`
    	Code 	int		`json:"Code"`
    	Message string	`json:"Message"`
    }
    
    type Currency struct{
    	TokenName 		string	`json:"TokenName"`
    	TokenSymbol 	string	`json:"TokenSymbol"`
    	TotalSupply 	float64	`json:"TotalSupply"`
    }
    
    type Token struct {
    	Lock		bool	`json:"Lock"`
    	Currency	map[string]Currency	`json:"Currency"`
    }
    
    func (token *Token) transfer (_from *Account, _to *Account, _currency string, _value float64) []byte{
    
    	var rev []byte
    	if (token.Lock){
    		msg := &Msg{Status: false, Code: 0, Message: "锁仓状态,停止一切转账活动"}
    		rev, _ = json.Marshal(msg)
    		return rev
    	}
    	if(_from.Frozen ) {
    		msg := &Msg{Status: false, Code: 0, Message: "From 账号冻结"}
    		rev, _ = json.Marshal(msg)
    		return rev
    	}
    	if( _to.Frozen) {
    		msg := &Msg{Status: false, Code: 0, Message: "To 账号冻结"}
    		rev, _ = json.Marshal(msg)
    		return rev
    	}
    	if(!token.isCurrency(_currency)){
    		msg := &Msg{Status: false, Code: 0, Message: "货币符号不存在"}
    		rev, _ = json.Marshal(msg)
    		return rev
    	}
    	if(_from.BalanceOf[_currency] >= _value){
    		_from.BalanceOf[_currency] -= _value;
    		_to.BalanceOf[_currency] += _value;
    
    		msg := &Msg{Status: true, Code: 0, Message: "转账成功"}
    		rev, _ = json.Marshal(msg)
    		return rev
    	}else{
    		msg := &Msg{Status: false, Code: 0, Message: "余额不足"}
    		rev, _ = json.Marshal(msg)
    		return rev
    	}
    	
    }
    func (token *Token) initialSupply(_name string, _symbol string, _supply float64, _account *Account) []byte{
    	if _,ok := token.Currency[_symbol]; ok {
    		msg := &Msg{Status: false, Code: 0, Message: "代币已经存在"}
    		rev, _ := json.Marshal(msg)
    		return rev
    	}
    
    	if _account.BalanceOf[_symbol] > 0 {
    		msg := &Msg{Status: false, Code: 0, Message: "账号中存在代币"}
    		rev, _ := json.Marshal(msg)
    		return rev
    	}else{
    		token.Currency[_symbol] = Currency{TokenName: _name, TokenSymbol: _symbol, TotalSupply: _supply}
    		_account.BalanceOf[_symbol] = _supply
    
    		msg := &Msg{Status: true, Code: 0, Message: "代币初始化成功"}
    		rev, _ := json.Marshal(msg)
    		return rev
    	}
    
    }
    
    func (token *Token) mint(_currency string, _amount float64, _account *Account) []byte{
    	if(!token.isCurrency(_currency)){
    		msg := &Msg{Status: false, Code: 0, Message: "货币符号不存在"}
    		rev, _ := json.Marshal(msg)
    		return rev
    	}
    	cur := token.Currency[_currency]
    	cur.TotalSupply += _amount;
    	token.Currency[_currency] = cur
    	_account.BalanceOf[_currency] += _amount;
    
    	msg := &Msg{Status: true, Code: 0, Message: "代币增发成功"}
    	rev, _ := json.Marshal(msg)
    	return rev
    	
    }
    func (token *Token) burn(_currency string, _amount float64, _account *Account) []byte{
    	if(!token.isCurrency(_currency)){
    		msg := &Msg{Status: false, Code: 0, Message: "货币符号不存在"}
    		rev, _ := json.Marshal(msg)
    		return rev
    	}
    	if(token.Currency[_currency].TotalSupply >= _amount){
    		cur := token.Currency[_currency]
    		cur.TotalSupply -= _amount;
    		token.Currency[_currency] = cur
    		_account.BalanceOf[_currency] -= _amount;
    
    		msg := &Msg{Status: false, Code: 0, Message: "代币回收成功"}
    		rev, _ := json.Marshal(msg)
    		return rev
    	}else{
    		msg := &Msg{Status: false, Code: 0, Message: "代币回收失败,回收额度不足"}
    		rev, _ := json.Marshal(msg)
    		return rev
    	}
    	
    }
    func (token *Token) isCurrency(_currency string) bool {
    	if _, ok := token.Currency[_currency]; ok {
    		return true
    	}else{
    		return false
    	}
    }
    func (token *Token) setLock(_look bool) bool {
    	token.Lock = _look
    	return token.Lock
    }
    type Account struct {
    	Name			string	`json:"Name"`
    	Frozen			bool	`json:"Frozen"`
    	BalanceOf		map[string]float64	`json:"BalanceOf"`
    }
    func (account *Account) balance (_currency string) map[string]float64{
    	bal	:= map[string]float64{_currency:account.BalanceOf[_currency]}
    	return bal
    }
    
    func (account *Account) balanceAll() map[string]float64{
    	return account.BalanceOf
    }
    
    // -----------
    const TokenKey = "Token"
    
    // Define the Smart Contract structure
    type SmartContract struct {
    	
    }
    
    func (s *SmartContract) Init(stub shim.ChaincodeStubInterface) pb.Response {
    
    	token := &Token{Currency: map[string]Currency{}}
    
    	tokenAsBytes, err := json.Marshal(token)
    	err = stub.PutState(TokenKey, tokenAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("Init Token %s 
    ", string(tokenAsBytes))
    	}
    	return shim.Success(nil)
    }
    
    func (s *SmartContract) Query(stub shim.ChaincodeStubInterface) pb.Response {
    	function, args := stub.GetFunctionAndParameters()
    	if function == "balance" {
    		return s.balance(stub, args)
    	} else if function == "balanceAll" {
    		return s.balanceAll(stub, args)
    	} else if function == "showAccount" {
    		return s.showAccount(stub, args)
    	}
    	return shim.Error("Invalid Smart Contract function name.")
    }
    
    func (s *SmartContract) Invoke(stub shim.ChaincodeStubInterface) pb.Response {
    
    	// Retrieve the requested Smart Contract function and arguments
    	function, args := stub.GetFunctionAndParameters()
    	// Route to the appropriate handler function to interact with the ledger appropriately
    	if function == "initLedger" {
    		return s.initLedger(stub, args)
    	} else if function == "createAccount" {
    		return s.createAccount(stub, args)
    	} else if function == "initCurrency" {
    		return s.initCurrency(stub, args)
    	} else if function == "setLock" {
    		return s.setLock(stub, args)
    	} else if function == "transferToken" {
    		return s.transferToken(stub, args)
    	} else if function == "frozenAccount" {
    		return s.frozenAccount(stub, args)
    	} else if function == "mintToken" {
    		return s.mintToken(stub, args)
    	} else if function == "balance" {
    		return s.balance(stub, args)
    	} else if function == "balanceAll" {
    		return s.balanceAll(stub, args)
    	} else if function == "showAccount" {
    		return s.showAccount(stub, args)
    	} else if function == "showToken" {
    		return s.showToken(stub, args)
    	}
    
    	return shim.Error("Invalid Smart Contract function name.")
    }
    
    func (s *SmartContract) createAccount(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    
    	if len(args) != 1 {
    		return shim.Error("Incorrect number of arguments. Expecting 1")
    	}
    
    	key  := args[0]
    	name  := args[0]
    	existAsBytes,err := stub.GetState(key)
    	fmt.Printf("GetState(%s) %s 
    ", key, string(existAsBytes))
    	if string(existAsBytes) != "" {
    		fmt.Println("Failed to create account, Duplicate key.")
    		return shim.Error("Failed to create account, Duplicate key.")
    	}
    
    	account := Account{
    		Name: name,
    		Frozen: false,
    		BalanceOf: map[string]float64{}}
    
    	accountAsBytes, _ := json.Marshal(account)
    	err = stub.PutState(key, accountAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("createAccount %s 
    ", string(accountAsBytes))
    
    	return shim.Success(accountAsBytes)
    }
    func (s *SmartContract) initLedger(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    	return shim.Success(nil)
    }
    func (s *SmartContract) showToken(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    	tokenAsBytes,err := stub.GetState(TokenKey)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("GetState(%s)) %s 
    ", TokenKey, string(tokenAsBytes))
    	}
    	return shim.Success(tokenAsBytes)
    }
    
    func (s *SmartContract) initCurrency(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    	if len(args) != 4 {
    		return shim.Error("Incorrect number of arguments. Expecting 4")
    	}
    
    	_name  := args[0]
    	_symbol:= args[1]
    	_supply,_:= strconv.ParseFloat(args[2], 64)
    	_account := args[3]
    
    	coinbaseAsBytes,err := stub.GetState(_account)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("Coinbase before %s 
    ", string(coinbaseAsBytes))
    
    	coinbase := &Account{}
    
    	json.Unmarshal(coinbaseAsBytes, &coinbase)
    
    	token := Token{}
    	existAsBytes,err := stub.GetState(TokenKey)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("GetState(%s)) %s 
    ", TokenKey, string(existAsBytes))
    	}
    	json.Unmarshal(existAsBytes, &token)
    	
    	result := token.initialSupply(_name,_symbol,_supply, coinbase)
    
    	tokenAsBytes, _ := json.Marshal(token)
    	err = stub.PutState(TokenKey, tokenAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("Init Token %s 
    ", string(tokenAsBytes))
    	}
    
    	coinbaseAsBytes, _ = json.Marshal(coinbase)
    	err = stub.PutState(_account, coinbaseAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("Coinbase after %s 
    ", string(coinbaseAsBytes))
    
    	
    
    	return shim.Success(result)
    }
    
    func (s *SmartContract) transferToken(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    
    	if len(args) != 4 {
    		return shim.Error("Incorrect number of arguments. Expecting 4")
    	}
    	_from 		:= args[0]
    	_to			:= args[1]
    	_currency 	:= args[2]
    	_amount,_	:= strconv.ParseFloat(args[3], 32)
    	
    	if(_amount <= 0){
    		return shim.Error("Incorrect number of amount")
    	}
    
    	fromAsBytes,err := stub.GetState(_from)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("fromAccount %s 
    ", string(fromAsBytes))
    	fromAccount := &Account{}
    	json.Unmarshal(fromAsBytes, &fromAccount)
    
    	toAsBytes,err := stub.GetState(_to)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("toAccount %s 
    ", string(toAsBytes))
    	toAccount := &Account{}
    	json.Unmarshal(toAsBytes, &toAccount)
    
    	tokenAsBytes,err := stub.GetState(TokenKey)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("Token %s 
    ", string(toAsBytes))
    	token := Token{Currency: map[string]Currency{}}
    	json.Unmarshal(tokenAsBytes, &token)
    
    	result := token.transfer(fromAccount, toAccount, _currency, _amount)
    	fmt.Printf("Result %s 
    ", string(result))
    
    	fromAsBytes, err = json.Marshal(fromAccount)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	err = stub.PutState(_from, fromAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("fromAccount %s 
    ", string(fromAsBytes))
    	}
    
    	toAsBytes, err = json.Marshal(toAccount)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	err = stub.PutState(_to, toAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("toAccount %s 
    ", string(toAsBytes))
    	}
    
    	return shim.Success(result)
    }
    func (s *SmartContract) mintToken(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    	
    	if len(args) != 3 {
    		return shim.Error("Incorrect number of arguments. Expecting 3")
    	}
    	_currency 	:= args[0]
    	_amount,_	:= strconv.ParseFloat(args[1], 32)
    	_account	:= args[2]
    
    	coinbaseAsBytes,err := stub.GetState(_account)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("Coinbase before %s 
    ", string(coinbaseAsBytes))
    	}
    
    	coinbase := &Account{}
    	json.Unmarshal(coinbaseAsBytes, &coinbase)
    
    	tokenAsBytes,err := stub.GetState(TokenKey)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("Token before %s 
    ", string(tokenAsBytes))
    
    	token := Token{}
    
    	json.Unmarshal(tokenAsBytes, &token)
    	
    	result := token.mint(_currency, _amount, coinbase)
    
    	tokenAsBytes, err = json.Marshal(token)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	err = stub.PutState(TokenKey, tokenAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("Token after %s 
    ", string(tokenAsBytes))
    
    	coinbaseAsBytes, _ = json.Marshal(coinbase)
    	err = stub.PutState(_account, coinbaseAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("Coinbase after %s 
    ", string(coinbaseAsBytes))
    	}
    
    	fmt.Printf("mintToken %s 
    ", string(tokenAsBytes))
    
    	return shim.Success(result)
    }
    
    func (s *SmartContract) setLock(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    	
    	if len(args) != 1 {
    		return shim.Error("Incorrect number of arguments. Expecting 2")
    	}
    
    	_look := args[0]
    
    	tokenAsBytes,err := stub.GetState(TokenKey)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	// fmt.Printf("setLock - begin %s 
    ", string(tokenAsBytes))
    
    	token := Token{}
    
    	json.Unmarshal(tokenAsBytes, &token)
    
    	if(_look == "true"){
    		token.setLock(true)
    	}else{
    		token.setLock(false)
    	}
    
    	tokenAsBytes, err = json.Marshal(token)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	err = stub.PutState(TokenKey, tokenAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	fmt.Printf("setLock - end %s 
    ", string(tokenAsBytes))
    
    	return shim.Success(nil)
    }
    func (s *SmartContract) frozenAccount(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    	
    	if len(args) != 2 {
    		return shim.Error("Incorrect number of arguments. Expecting 2")
    	}
    
    	_account	:= args[0]
    	_status		:= args[1]
    
    	accountAsBytes,err := stub.GetState(_account)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	// fmt.Printf("setLock - begin %s 
    ", string(tokenAsBytes))
    
    	account := Account{}
    
    	json.Unmarshal(accountAsBytes, &account)
    
    	var status bool
    	if(_status == "true"){
    		status = true;
    	}else{
    		status = false
    	}
    
    	account.Frozen = status
    	
    	accountAsBytes, err = json.Marshal(account)
    	if err != nil {
    		return shim.Error(err.Error())
    	}
    	err = stub.PutState(_account, accountAsBytes)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("frozenAccount - end %s 
    ", string(accountAsBytes))
    	}
    
    	return shim.Success(nil)
    }
    
    func (s *SmartContract) showAccount(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    
    	if len(args) != 1 {
    		return shim.Error("Incorrect number of arguments. Expecting 1")
    	}
    	_account 	:= args[0]
    
    	accountAsBytes,err := stub.GetState(_account)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("Account balance %s 
    ", string(accountAsBytes))
    	}
    	return shim.Success(accountAsBytes)
    }
    
    func (s *SmartContract) balance(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    
    	if len(args) != 2 {
    		return shim.Error("Incorrect number of arguments. Expecting 1")
    	}
    	_account 	:= args[0]
    	_currency 	:= args[1]
    
    	accountAsBytes,err := stub.GetState(_account)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("Account balance %s 
    ", string(accountAsBytes))
    	}
    
    	account := Account{}
    	json.Unmarshal(accountAsBytes, &account)
    	result := account.balance(_currency)
    
    	resultAsBytes, _ := json.Marshal(result)
    	fmt.Printf("%s balance is %s 
    ", _account, string(resultAsBytes))	
    
    	return shim.Success(resultAsBytes)
    }
    
    func (s *SmartContract) balanceAll(stub shim.ChaincodeStubInterface, args []string) pb.Response {
    
    	if len(args) != 1 {
    		return shim.Error("Incorrect number of arguments. Expecting 1")
    	}
    	_account 	:= args[0]
    
    	accountAsBytes,err := stub.GetState(_account)
    	if err != nil {
    		return shim.Error(err.Error())
    	}else{
    		fmt.Printf("Account balance %s 
    ", string(accountAsBytes))
    	}
    
    	account := Account{}
    	json.Unmarshal(accountAsBytes, &account)
    	result := account.balanceAll()
    	resultAsBytes, _ := json.Marshal(result)
    	fmt.Printf("%s balance is %s 
    ", _account, string(resultAsBytes))	
    
    	return shim.Success(resultAsBytes)
    }
    
    // The main function is only relevant in unit test mode. Only included here for completeness.
    func main() {
    
    	// Create a new Smart Contract
    	err := shim.Start(new(SmartContract))
    	if err != nil {
    		fmt.Printf("Error creating new Smart Contract: %s", err)
    	}
    }
    

    测试日志:

    2018-03-20 14:46:11.957 UTC [shim] SetupChaincodeLogging -> INFO 001 Chaincode log level not provided; defaulting to: INFO
    2018-03-20 14:46:11.957 UTC [shim] SetupChaincodeLogging -> INFO 002 Chaincode (build level: ) starting up ...
    Coinbase before {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":4000,"NBA":999900}} 
    Token before {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":20000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Token after {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":24000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Coinbase after {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":8000,"NBA":999900}} 
    mintToken {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":24000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Account balance {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":8000,"NBA":999900}} 
    jam balance is {"BBC":10000,"CCE":10000,"EJB":8000,"NBA":999900} 
    Coinbase before {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":8000,"NBA":999900}} 
    Token before {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":24000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Token after {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":28000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Coinbase after {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":12000,"NBA":999900}} 
    mintToken {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":28000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Account balance {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":8000,"NBA":999900}} 
    jam balance is {"BBC":10000,"CCE":10000,"EJB":8000,"NBA":999900} 
    
    
    Coinbase before {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":12000,"NBA":999900}} 
    Token before {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":28000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Token after {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":30000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Coinbase after {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":14000,"NBA":999900}} 
    mintToken {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":30000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    
    
    Account balance {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":14000,"NBA":999900}} 
    jam balance is {"BBC":10000,"CCE":10000,"EJB":14000,"NBA":999900} 
    Coinbase before {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":14000,"NBA":999900}} 
    Token before {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":30000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Token after {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":36000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Coinbase after {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":20000,"NBA":999900}} 
    mintToken {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":36000},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Account balance {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":14000,"NBA":999900}} 
    jam balance is {"BBC":10000,"CCE":10000,"EJB":14000,"NBA":999900} 
    
    
    
    frozenAccount - end {"Name":"netkiller","Frozen":true,"BalanceOf":{"NKC":300}} 
    fromAccount {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":20000,"NBA":999900}} 
    toAccount {"Name":"netkiller","Frozen":true,"BalanceOf":{"NKC":300}} 
    Token {"Name":"netkiller","Frozen":true,"BalanceOf":{"NKC":300}} 
    Result {"Status":false,"Code":0,"Message":"To 账号冻结"} 
    fromAccount {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":20000,"NBA":999900}} 
    toAccount {"Name":"netkiller","Frozen":true,"BalanceOf":{"NKC":300}} 
    frozenAccount - end {"Name":"netkiller","Frozen":false,"BalanceOf":{"NKC":300}} 
    fromAccount {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":20000,"NBA":999900}} 
    toAccount {"Name":"netkiller","Frozen":false,"BalanceOf":{"NKC":300}} 
    Token {"Name":"netkiller","Frozen":false,"BalanceOf":{"NKC":300}} 
    Result {"Status":true,"Code":0,"Message":"转账成功"} 
    fromAccount {"Name":"jam","Frozen":false,"BalanceOf":{"BBC":10000,"CCE":10000,"EJB":19900,"NBA":999900}} 
    toAccount {"Name":"netkiller","Frozen":false,"BalanceOf":{"EJB":100,"NKC":300}} 
    
    
    
    Account balance {"Name":"netkiller","Frozen":false,"BalanceOf":{"EJB":100,"NKC":300}} 
    netkiller balance is {"NKC":300} 
    Account balance {"Name":"netkiller","Frozen":false,"BalanceOf":{"EJB":100,"NKC":300}} 
    netkiller balance is {"NKCs":0} 
    Account balance {"Name":"netkiller","Frozen":false,"BalanceOf":{"EJB":100,"NKC":300}} 
    netkiller balance is {"NKC":300} 
    Coinbase before {"Name":"coinbase","Frozen":false,"BalanceOf":{"NKC":4600}} 
    GetState(Token)) {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":36400},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NAS":{"TokenName":"NAS Token","TokenSymbol":"NAS","TotalSupply":2000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Init Token {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":36400},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NAS":{"TokenName":"NAS Token","TokenSymbol":"NAS","TotalSupply":2000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Coinbase after {"Name":"coinbase","Frozen":false,"BalanceOf":{"NKC":4600}} 
    
    
    
    
    Coinbase before {"Name":"coinbase","Frozen":false,"BalanceOf":{"NKC":4600}} 
    GetState(Token)) {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":36400},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NAS":{"TokenName":"NAS Token","TokenSymbol":"NAS","TotalSupply":2000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Init Token {"Lock":false,"Currency":{"BBC":{"TokenName":"NEO Token","TokenSymbol":"BBC","TotalSupply":10000},"CCE":{"TokenName":"NEO Token","TokenSymbol":"CCE","TotalSupply":10000},"EJB":{"TokenName":"NEO Token","TokenSymbol":"EJB","TotalSupply":36400},"K8":{"TokenName":"888","TokenSymbol":"K8","TotalSupply":1000000},"NAS":{"TokenName":"NAS Token","TokenSymbol":"NAS","TotalSupply":2000},"NBA":{"TokenName":"NEO Token","TokenSymbol":"NBA","TotalSupply":1000000},"NEC":{"TokenName":"NEO Token","TokenSymbol":"NEC","TotalSupply":1000000},"NKC":{"TokenName":"Netkiller Token","TokenSymbol":"NKC","TotalSupply":1005000},"NKCKK":{"TokenName":"Netkillersss","TokenSymbol":"NKCKK","TotalSupply":1000000},"TTC":{"TokenName":"NEO Token","TokenSymbol":"TTC","TotalSupply":1000000}}} 
    Coinbase after {"Name":"coinbase","Frozen":false,"BalanceOf":{"NKC":4600}} 
  • 相关阅读:
    贝叶斯在机器学习中的应用(一)
    使用ajax发送的请求实现页面跳转
    关于welcom-file-list 失效
    在新的线程中使用session 出现的问题
    关于innerHtml= 与 html() 区别
    request.getAttribute()和 request.getParameter()有何区别?
    __STL_VOLATILE
    声明一个返回特定类型函数指针的函数
    关于vue的基础概念
    Vue.js结合vue-router和webpack编写单页路由项目
  • 原文地址:https://www.cnblogs.com/zhangmingcheng/p/9958512.html
Copyright © 2011-2022 走看看