目前,貨幣中心採用紙幣、硬幣或數字賬本的形式,由發行,一種被普遍接受的支付方式。過去,各種貨幣的出現,貨幣化形式,如金銀,甚至是彩色珠子和鹽。加密貨幣是一種以密碼學和區塊鏈技術為基礎的數字貨幣形式,主要方式化轉移平台,而不依賴於單一的價值,例如銀行。
在技術教程中,我們將討論本貨幣和通證之間的區別,您將學習如何開發自己的加密貨幣。
開始吧!
貨幣和通證的區別
幣種最重要的流行加密貨幣是作為一種交換價值的方式,例如它的有其他價值,還有其他許多通證,但除了作為一種有效的支持的作用之外,代表通證這些持有人不可擁有某種支配權還有NFT:那,所有的數字資產有什麼不同的權限呢?
從工程的角度來看,貨幣和通證之間的區別非常簡單。貨幣是區塊鏈的一部分,而通證以合約的形式在現有區塊鏈上運行。
例如,BTC 是比特幣區塊鏈的幣,ETH 是以太坊區塊鏈的幣。 BTC 和ETH 幣。再舉例子,USDC、AAVE 和WETH 都是通證,因為它們的本質是雙方在以太坊上的任何一條鏈上都有適用的智能合約。
要了解如何創建自己的通證,可查看此結果博客文章。要了解有關創建NFT 的更多信息,可以查看這個教程繼續閱讀可了解有關創建自己的加密貨幣的更多信息。
開始
這個項目是用去寫的,但不用以前有這種語言的經驗。我的加密貨幣文件夾下的Chainlink 智能合約示例存儲庫中的完整工作示例。
git clone https://github.com/smartcontractkit/smart-contract-examples.git cd smart-contract-examples/my-crypto-coin
下一步是在你的本地機器安裝上去,可以按照官方指令進行操作。這個過程大約需要10 分鐘,咖啡可以在時間煮點。
在繼續之前,需要驗證你的$GOPATH是否設置正確。這是一個必須的步驟。
一般約定源代碼存儲在$GOPATH/src中,將編譯後的程序文件存儲在$GOPATH/bin中。導航到$GOPATH/src並創建一個名為我的加密貨幣的新文件夾。
現在我們開始開發。
一切從創世區塊開始
貨幣是鍊子鏈也可以在鏈上列出本中的單位。我的加密貨幣項目中,創建一個新文件夾並將其命名為分類帳。在分類帳文件夾中,創建一個新文件,將其命名為創世紀.json,然後貼下面的代碼。我們將最終量為100 萬的供應加密貨幣分配給愛麗絲。
{ "genesis_time": "2022-04-12T00:00:00.000000000Z", "chain_id": "our-blockchain", "balances": { "alice": 1000000 } }
我們的區塊鏈創世節點出現故障,我們可以使用交易文件和交易來重新創建賬本並更改網絡的其餘部分同步狀態。
賬戶、交易和狀態
導航到萊德文件夾並創建一個tx.go每個帳戶將由帳戶結構表示。
package ledger type Account string type Tx struct { From Account `json:"from"` To Account `json:"to"` Value uint `json:"value"` } func NewAccount(value string) Account { return Account(value) } func NewTx(from Account, to Account, value uint) Tx { return Tx{from, to, value} }
交易將存儲在賬本中,所以讓我們手動添加幾個作為演示。分類帳目錄中,創建一個新的分類帳.db將文件下面的內容粘貼到那裡。
{"from":"alice","to":"bob","value":10} {"from":"alice","to":"alice","value":3} {"from":"alice","to":"alice","value":500} {"from":"alice","to":"bob","value":100} {"from":"bob","to":"alice","value":5} {"from":"bob","to":"carol","value":10}
創世狀態保持不變並保留在創世紀.json文件中。我們添加一種以編程方式加載其狀態的方法。創建一個創世網的新文件,該文件將存儲賬簿映射以及創世狀態下的相應貨幣餘額。
package ledger import ( "io/ioutil" "encoding/json" ) type Genesis struct { Balances map[Account]uint `json:"balances"` } func loadGenesis(path string) (Genesis, error) { genesisFileContent, err := ioutil.ReadFile(path) if err != nil { return Genesis{}, err } var loadedGenesis Genesis err = json.Unmarshal(genesisFileContent, &loadedGenesis) if err != nil { return Genesis{}, err } return loadedGenesis, nil }
核心業務邏輯將存儲在店鋪結構體中。創建一個名為state.go狀態結構體將包含所有賬戶餘額的詳細信息,誰將貨幣轉移給誰,以及轉移了貨幣。它必須知道如何從多少創世紀之後,通過文件讀取中順序最初重放的狀態。分類帳.db文件中的交易來創世餘額所有。
package ledger import ( "fmt" "os" "path/filepath" "bufio" "encoding/json" ) type State struct { Balances map[Account]uint txMempool []Tx dbFile *os.File } func SyncState() (*State, error) { cwd, err := os.Getwd() if err != nil { return nil, err } gen, err := loadGenesis(filepath.Join(cwd, "ledger", "genesis.json")) if err != nil { return nil, err } balances := make(map[Account]uint) for account, balance := range gen.Balances { balances[account] = balance } file, err := os.OpenFile(filepath.Join(cwd, "ledger", "ledger.db"), os.O_APPEND|os.O_RDWR, 0600) if err != nil { return nil, err } scanner := bufio.NewScanner(file) state := &State{balances, make([]Tx, 0), file} for scanner.Scan() { if err := scanner.Err(); err != nil { return nil, err } var transaction Tx json.Unmarshal(scanner.Bytes(), &transaction) if err := state.writeTransaction(transaction); err != nil { return nil, err } } return state, nil } func (s *State) writeTransaction(tx Tx) error { if s.Balances[tx.From] < tx.Value { return fmt.Errorf("insufficient balance") } s.Balances[tx.From] -= tx.Value s.Balances[tx.To] += tx.Value return nil } func (s *State) Close() { s.dbFile.Close() } func (s *State) WriteToLedger(tx Tx) error { if err := s.writeTransaction(tx); err != nil { return err } s.txMempool = append(s.txMempool, tx) mempool := make([]Tx, len(s.txMempool)) copy(mempool, s.txMempool) for i := 0; i < len(mempool); i++ { txJson, err := json.Marshal(mempool[i]) if err != nil { return err } if _, err = s.dbFile.Write(append(txJson, 'n')); err != nil { return err } s.txMempool = s.txMempool[1:] } return nil }
高性能鍵盤(CLI)
的新加密方法是開發一個最簡單的加密貨幣使用方法(CLI)。相關庫Cobra。要使用這個庫,我們需要為我們的項目初始化Go 的依賴管理器,稱為Go 模塊。 Go 模塊將自動獲取你在Go 文件中引用的任何庫。
echo $GOPATH cd $GOPATH/src/my-crypto-coin go mod init
現在讓我們創建一個新文件夾並將其命名為cli等等,我們還沒有正式命名我們的加密貨幣!我們暫時稱它為我的加密貨幣。cli文件夾並創建一個標題微控制器的新文件夾,它是My Crypto Coin的名字。導航到mcc文件夾。
創建一個名字main.go的新文件。這將是我們程序的主要入口。
package main import ( "github.com/spf13/cobra" "os" "fmt" ) func main() { var mccCmd = &cobra.Command{ Use: "mcc", Short: "My Crypto Coin CLI", Run: func(cmd *cobra.Command, args []string) { }, } mccCmd.AddCommand(versionCmd) mccCmd.AddCommand(balancesCmd()) mccCmd.AddCommand(txCmd()) err := mccCmd.Execute() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } }
創建一個直播版本.go文件並貼下面的內容。
package main import ( "fmt" "github.com/spf13/cobra" ) const Major = "0" const Minor = "1" const Fix = "0" const Verbal = "Genesis" var versionCmd = &cobra.Command{ Use: "version", Short: "Describes version.", Run: func(cmd *cobra.Command, args []string) { fmt.Println(fmt.Sprintf("Version: %s.%s.%s-beta %s", Major, Minor, Fix, Verbal)) }, }
之後,讓我們創建一個從賬本中讀取所有賬戶餘額的機制。餘額.go文件。
package main import ( "github.com/spf13/cobra" "my-crypto-coin/ledger" "fmt" "os" ) func balancesCmd() *cobra.Command { var balancesCmd = &cobra.Command{ Use: "balances", Short: "Interact with balances (list...).", Run: func(cmd *cobra.Command, args []string) { }, } balancesCmd.AddCommand(balancesListCmd) return balancesCmd } var balancesListCmd = &cobra.Command{ Use: "list", Short: "Lists all balances.", Run: func(cmd *cobra.Command, args []string) { state, err := ledger.SyncState() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer state.Close() fmt.Println("Accounts balances:") fmt.Println("__________________") fmt.Println("") for account, balance := range state.Balances { fmt.Println(fmt.Sprintf("%s: %d", account, balance)) } }, }
最後,讓我們添加一個將交易寫入賬本的命令。tx.go文件。
package main import ( "github.com/spf13/cobra" "my-crypto-coin/ledger" "fmt" "os" ) func txCmd() *cobra.Command { var txsCmd = &cobra.Command{ Use: "tx", Short: "Interact with transactions (new...).", Run: func(cmd *cobra.Command, args []string) { }, } txsCmd.AddCommand(newTxCmd()) return txsCmd } func newTxCmd() *cobra.Command { var cmd = &cobra.Command{ Use: "new", Short: "Adds new TX to the ledger.", Run: func(cmd *cobra.Command, args []string) { from, _ := cmd.Flags().GetString("from") to, _ := cmd.Flags().GetString("to") value, _ := cmd.Flags().GetUint("value") tx := ledger.NewTx(ledger.NewAccount(from), ledger.NewAccount(to), value) state, err := ledger.SyncState() if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } defer state.Close() err = state.WriteToLedger(tx) if err != nil { fmt.Fprintln(os.Stderr, err) os.Exit(1) } fmt.Println("TX successfully added to the ledger.") }, } cmd.Flags().String("from", "", "From what account to send coins") cmd.MarkFlagRequired("from") cmd.Flags().String("to", "", "To what account to send coins") cmd.MarkFlagRequired("to") cmd.Flags().Uint("value", 0, "How many coins to send") cmd.MarkFlagRequired("value") return cmd }
使用以下命令編譯程序:
go install $GOPATH/src/my-crypto-coin/cli/mcc/…
去檢測你之前獲取的庫並在編譯它們的自動程序。$GOPATH,生成的程序將保存在$GOPATH/bin文件夾中。
要驗證安裝是否成功,請運行以下命令:
which mcc
你應該在終端中看到這個類似的路徑:/Users/yourname/go/bin/mcc。讓我們看看所有可用的命令。運行:
mcc --help
要查看CLI 的當前版本,請運行:
mcc version
要查看當前用戶餘額,請運行以下命令:
mcc balances list
輸出應該是:
Accounts balances: __________________ alice: 999895 bob: 95 carol: 10
現在讓我們使用CLI 進行第一個交易。輸入以下命令:
mcc tx new --from alice --to carol --value 10
如果你打開分類帳/分類帳.db 文件,你應該能夠看到更多的行:
{"from":"alice","to":"carol","value":10}
讓我們再次使用 mcc 餘額列表 命令輸出應該是:餘額。
Accounts balances: __________________ alice: 999885 bob: 95 carol: 20
下一步是什麼?
目前,我們在帳本中用名字表示用戶。但是如果有兩個鮑勃會行嗎?
下一個問題是,任何人都可以使用轉移加密貨幣擁有自己的其他人的加密貨幣。
如果出現某種故障會發生什麼?由於我們是網絡中唯一的設備,因此我們無法重新啟動我們的網絡。通用的方法來確定哪些交易是有效的,有哪些,並驗證網絡當前狀態。我們需要一個共識的不是算法和機制。
總結
在本文中,你學習瞭如何使用開發基本的加密貨幣,並且我們已經介紹了更多的貨幣和通證之間的主要區別。要了解信息,可以前往Chainlink 智能合約示例存儲庫並開始這個和其他示例項目試驗。
通過訪問chain.link或閱讀docs.chain.link上的文檔可了解有關Chainlink的更多信息。要討論集成,可聯繫專家。
帖子 如何創建加密貨幣 首先出現在 Chainlink 博客.