发布时间:2025-12-10 23:24:49 浏览次数:1
我发现用以太坊思维,将以太坊代币合约搬到 hyperledger 上,一样可以实现代币的功能,这个代币除了不能上交易所,基本满足我们替代积分系统的需求,下面是我写了这样一个合约,在超级账本上实现类似以太坊的代币转账功能。
packagemainimport("bytes""encoding/json""fmt""strconv""github.com/hyperledger/fabric/core/chaincode/shim"sc"github.com/hyperledger/fabric/protos/peer")//DefinetheSmartContractstructuretypeSmartContractstruct{}typeTokenstruct{Ownerstring`json:"Owner"`TotalSupplyuint`json:"TotalSupply"`TokenNamestring`json:"TokenName"`TokenSymbolstring`json:"TokenSymbol"`BalanceOfmap[string]uint`json:"BalanceOf"`}func(token*Token)initialSupply(){token.BalanceOf[token.Owner]=token.TotalSupply;}func(token*Token)transfer(_fromstring,_tostring,_valueuint){if(token.BalanceOf[_from]>=_value){token.BalanceOf[_from]-=_value;token.BalanceOf[_to]+=_value;}}func(token*Token)balance(_fromstring)uint{returntoken.BalanceOf[_from]}func(token*Token)burn(_valueuint){if(token.BalanceOf[token.Owner]>=_value){token.BalanceOf[token.Owner]-=_value;token.TotalSupply-=_value;}}func(token*Token)burnFrom(_fromstring,_valueuint){if(token.BalanceOf[_from]>=_value){token.BalanceOf[_from]-=_value;token.TotalSupply-=_value;}}func(token*Token)mint(_valueuint){token.BalanceOf[token.Owner]+=_value;token.TotalSupply+=_value;}func(s*SmartContract)Init(stubshim.ChaincodeStubInterface)sc.Response{returnshim.Success(nil)}func(s*SmartContract)initLedger(stubshim.ChaincodeStubInterface)sc.Response{token:=&Token{Owner:"netkiller",TotalSupply:10000,TokenName:"代币通正",TokenSymbol:"COIN",BalanceOf:map[string]uint{}}token.initialSupply()tokenAsBytes,_:=json.Marshal(token)stub.PutState("Token",tokenAsBytes)fmt.Println("Added",tokenAsBytes)returnshim.Success(nil)}func(s*SmartContract)transferToken(stubshim.ChaincodeStubInterface,args[]string)sc.Response{iflen(args)!=3{returnshim.Error("Incorrectnumberofarguments.Expecting2")}tokenAsBytes,_:=stub.GetState(args[0])token:=Token{}json.Unmarshal(tokenAsBytes,&token)token.transfer(args[1],args[2],args[3])tokenAsBytes,_=json.Marshal(token)stub.PutState(args[0],tokenAsBytes)returnshim.Success(nil)}func(s*SmartContract)balanceToken(stubshim.ChaincodeStubInterface,args[]string)sc.Response{iflen(args)!=1{returnshim.Error("Incorrectnumberofarguments.Expecting1")}tokenAsBytes,_:=stub.GetState(args[0])token:=Token{}json.Unmarshal(tokenAsBytes,&token)amount:=token.balance(args[1])returnshim.Success(amount)}func(s*SmartContract)Invoke(stubshim.ChaincodeStubInterface)sc.Response{//RetrievetherequestedSmartContractfunctionandargumentsfunction,args:=stub.GetFunctionAndParameters()//Routetotheappropriatehandlerfunctiontointeractwiththeledgerappropriatelyiffunction=="balanceToken"{returns.balanceToken(stub,args)}elseiffunction=="initLedger"{returns.initLedger(stub)}elseiffunction=="transferToken"{returns.transferToken(stub,args)}returnshim.Error("InvalidSmartContractfunctionname.")}//Themainfunctionisonlyrelevantinunittestmode.Onlyincludedhereforcompleteness.funcmain(){//CreateanewSmartContracterr:=shim.Start(new(SmartContract))iferr!=nil{fmt.Printf("ErrorcreatingnewSmartContract:%s",err)}}合约代码的测试
funcmain(){token:=&Token{Owner:"netkiller",//代币管理者TotalSupply:10000,//代币发行总量TokenName:"积分连",//代币名称TokenSymbol:"NEO",//代币符号NEOBalanceOf:map[string]uint{}}token.initialSupply()//初始化代币fmt.Println(token.balance("netkiller"))//查询余额token.transfer("netkiller","neo",100)//转账,这里账号使用用户ID,没有使用以太坊钱包那样的哈希值,因为哈希值不便于记忆。fmt.Println(token.balance("netkiller"))fmt.Println(token.balance("neo"))}我们可以建立很多套这样的比,例如水果币,蔬菜币,流量币...
开发一个小型交易所难度也不大,让用户在交易所中交易这些币。