Network Security Internet Technology Development Database Servers Mobile Phone Android Software Apple Software Computer Software News IT Information

In addition to Weibo, there is also WeChat

Please pay attention

WeChat public account

Shulou

How to use Hyperledger Fabric to develop ERC20 standard tokens

2025-03-28 Update From: SLTechnology News&Howtos shulou NAV: SLTechnology News&Howtos > Internet Technology >

Share

Shulou(Shulou.com)06/01 Report--

This article is about how to use Hyperledger Fabric to develop tokens for the ERC20 standard. The editor thinks it is very practical, so share it with you as a reference and follow the editor to have a look.

Using Hyperledger Fabric to develop ERC20 standard tokens

Use ca identity user name as token address (obtained through stub.GetCreator)

All the ways to implement the standard of ERC20

Go directly to the chaincode source code

Package mainimport ("fmt"strconv"github.com/hyperledger/fabric/core/chaincode/shim" pb "github.com/hyperledger/fabric/protos/peer"encoding/json"bytes"encoding/pem"crypto/x509") const (TokenId = "MyToken" TokenOwner = TokenId + "- Owner" TokenBalance = TokenId + "-% s-Balance" TokenFreeze = TokenId + "-% s-Freeze" TokenApprove = TokenId + "-% s-Approve-%s") type TokenChaincode struct {} type ERC20Token struct {Name string `json: "name" `/ / name Symbol string `json: "symbol"` / / symbol Decimals uint8 `json: "decimals" `/ / decimal place TotalSupply float64 `json: "totalSupply" `/ / Total} func (t * TokenChaincode) Init (stub shim.ChaincodeStubInterface) pb.Response {fcn Args: = stub.GetFunctionAndParameters () fmt.Printf ("method:% s parameters:% s\ n", fcn, args) if len (args)! = 1 {return shim.Error ("number of parameters is not 1")} tokenBts: = [] byte (args [0]) var token ERC20Token err: = json.Unmarshal (tokenBts) & token) if err! = nil {return shim.Error (err.Error ())} / / check err = checkToken (token) if err! = nil {return shim.Error (err.Error ())} / / add token err = stub.PutState (TokenId TokenBts) if err! = nil {return shim.Error (err.Error ())} / / founder creator: = initiator (stub) err = stub.PutState (TokenOwner) [] byte (creator) if err! = nil {return shim.Error (err.Error ())} / / owner initializes all tokens err = stub.PutState (balanceKey (creator), parseDecimals (token.Decimals) Token.TotalSupply) if err! = nil {return shim.Error (err.Error ())} return shim.Success (nil)} func (t * TokenChaincode) Invoke (stub shim.ChaincodeStubInterface) pb.Response {/ / get the method name and method parameter fn to be called, args: = stub.GetFunctionAndParameters () fmt.Printf ("method:% s parameter:% s\ n", fn Args) if fn = = "tokenInfo" {return t.tokenInfo (stub)} else if fn = = "balanceOf" {return t.balanceOf (stub, args)} else if fn = = "minter" {return t.minter (stub, args)} else if fn = = "transfer" {return t.transfer (stub) Args)} else if fn = = "freezeAccount" {return t.freezeAccount (stub, args)} else if fn = = "approve" {return t.approve (stub, args)} else if fn = = "transferFrom" {return t.transferFrom (stub, args)} else if fn = = "allowance" {return t.allowance (stub) Args)} else if fn = = "transferOwner" {return t.transferOwner (stub, args)} else if fn = = "increaseAllowance" {return t.increaseAllowance (stub, args)} else if fn = = "decreaseAllowance" {return t.decreaseAllowance (stub, args)} else if fn = = "burn" {return t.burn (stub) Args)} return shim.Error ("method does not exist")} / / get token information func (t * TokenChaincode) tokenInfo (stub shim.ChaincodeStubInterface) pb.Response {token, err: = stub.GetState (TokenId) if err! = nil {return shim.Error (err.Error ())} return shim.Success (token)} / / enter the address You can get the balance of the address token func (t * TokenChaincode) balanceOf (stub shim.ChaincodeStubInterface, args [] string) pb.Response {if len (args)! = 1 {return shim.Error ("the number of parameters is not 1")} name: = args [0] balance Err: = stub.GetState (balanceKey (name)) if err! = nil {return shim.Error (err.Error ())} return shim.Success (balance)} / / Mining func (t * TokenChaincode) minter (stub shim.ChaincodeStubInterface) Args [] string) pb.Response {if len (args)! = 2 {return shim.Error ("the number of parameters is not 2")} to: = args [0] v, err: = strconv.ParseFloat (args [1], 64) / / v cannot be less than zero if v

< 0 { return shim.Error("v less than 0") } //检查是否是创建人 err = checkOwner(stub) if err != nil { return shim.Error(err.Error()) } //获取to的balance a, err := getBalance(stub, to) if err != nil { return shim.Error(err.Error()) } a += v if a < 0 { return shim.Error("a balance less than 0") } //代币总数增加 tks, err := stub.GetState(TokenId) if err != nil { return shim.Error(err.Error()) } var token ERC20Token err = json.Unmarshal(tks, &token) if err != nil { return shim.Error(err.Error()) } token.TotalSupply += v tks, err = json.Marshal(token) if err != nil { return shim.Error(err.Error()) } //跟新代币 err = stub.PutState(TokenId, tks) if err != nil { return shim.Error(err.Error()) } // 重新写回账本 err = stub.PutState(balanceKey(to), parseDecimals(token.Decimals, a)) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil)}//调用transfer函数将自己的token转账给to地址,value为转账个数func (t *TokenChaincode) transfer(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 2 { return shim.Error("参数个数不为2") } //to to := args[0] //交易数量 val := args[1] //from from := initiator(stub) //保留获取小数位 decimals, err := getDecimals(stub) if err != nil { return shim.Error(err.Error()) } //交易 err = deal(stub, from, to, val, decimals) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil)}//实现账户的冻结和解冻 (true 冻结,false 解冻)func (t *TokenChaincode) freezeAccount(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 2 { return shim.Error("参数个数不为2") } to := args[0] isFreeze := args[1] if isFreeze != "true" && isFreeze != "false" { return shim.Error("isFreeze is true or false") } //检查是否是创建人 err := checkOwner(stub) if err != nil { return shim.Error(err.Error()) } //账户冻结和解冻 err = stub.PutState(freezeKey(to), []byte(isFreeze)) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil)}//转移拥有者func (t *TokenChaincode) transferOwner(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 1 { return shim.Error("参数个数不为1") } toOwner := args[0] //检查是否是创建人 err := checkOwner(stub) if err != nil { return shim.Error(err.Error()) } //改变owner err = stub.PutState(TokenOwner, []byte(toOwner)) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil)}//批准spender账户从自己的账户转移value个token。可以分多次转移func (t *TokenChaincode) approve(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 2 { return shim.Error("参数个数不为2") } //授权人 spender := args[0] val := args[1] _, err := strconv.ParseFloat(val, 64) if err != nil { return shim.Error("Invalid transaction amount") } //发起人 sponsor := initiator(stub) //批准 err = stub.PutState(approveKey(sponsor, spender), []byte(val)) if err != nil { return shim.Error(err.Error()) } return shim.Success(nil)}//与approve搭配使用,approve批准之后,调用transferFrom函数来转移token。func (t *TokenChaincode) transferFrom(stub shim.ChaincodeStubInterface, args []string) pb.Response { if len(args) != 3 { return shim.Error("参数个数不为3") } //from sponsor := args[0] //to to := args[1] //val val := args[2] valf, err := strconv.ParseFloat(val, 64) if err != nil { return shim.Error("Invalid transaction amount") } //spender spender := initiator(stub) //授权数量 v, err := getApprove(stub, sponsor, spender) if err != nil { return shim.Error(err.Error()) } //超出授权 if valf >

Welcome to subscribe "Shulou Technology Information " to get latest news, interesting things and hot topics in the IT industry, and controls the hottest and latest Internet news, technology news and IT industry trends.

Views: 0

*The comments in the above article only represent the author's personal views and do not represent the views and positions of this website. If you have more insights, please feel free to contribute and share.

Share To

Internet Technology

Wechat

© 2024 shulou.com SLNews company. All rights reserved.

12
Report