如何經過構建以太坊智能合約來銷售商品?這是個問題。javascript
毫無疑問,比特幣已經改變了咱們看待和理解什麼是金錢,價值以及最近由智能合約產生的全部權的方式。這頗有趣,由於幾乎每一個人都據說過它或加密貨幣。來自許多業務領域的人,不只僅是咱們,IT工做者。php
在本文中,我將展現我關於以太坊的第一份智能合約,這是我對區塊鏈的我的研究的一部分。html
有許多涉及區塊鏈技術的概念,但在本節中我將嘗試解釋這種驚人的顛覆性技術。java
顧名思義,區塊鏈是使用它的哈希數據鏈接在一塊兒的數據鏈的塊,由用戶的私鑰簽名。一般,這些塊的大小限制爲1MB,而且因爲此限制而存儲儘量多的交易。node
區塊
:它們是存儲交易的塊。認爲這些塊是具備一些元組的表,每一個塊都存儲交易。
不對稱加密
,公鑰和私鑰對:每一個人均可以訪問咱們的公鑰,只需咱們訪問咱們的私鑰便可。而且,非對稱加密意味着:咱們使用其中一個密鑰編碼,它只能與另外一個密鑰進行解碼。沒有例外。真實性:若是咱們想簽署數據,咱們使用私鑰進行編碼,由於每一個人均可以使用咱們的公鑰解碼並安全地認證咱們。可是沒有人能夠改變數據並再次簽名,由於它會被命運所拒絕。當真實性成爲問題時使用。這是區塊鏈的狀況 。python
不可侵犯性質
在於連接塊的機制:當生成新塊時,從當前塊的數據生成哈希,包括它的簽名。而後,生成新塊,未來自前一塊的hash與當前塊的數據組合,並生成新的hash並使用用戶的私鑰進行簽名,依此類推。若是有人試圖更改塊的數據以僞造事務,則他或她必須在整個網絡開始使全部這些從新生成的塊無效以前快速生成全部後續塊。如同暗夜裏一開始沒有燈......android
一切都從創世塊開始,這個塊負責啓動區塊鏈網絡並設置許多參數值,例如挖掘代幣的難度。git
如何建立鏈?程序員
基於來自當前塊的全部數據(包括簽名),生成hash並將其包括在新生成的塊的頭中。此時此新塊將成爲當前塊並開始註冊交易。github
很驚人!是否是?
我選擇了一個很是常見的用例,爲使其易於理解,只留下了智能合約邏輯和技術細節的實現。
企業對企業——B2B
最精細的商業交易由三部分組成:買方(buyer),貨物(goods)和賣方(seller)。最基本的過程是轉移貨物的全部權以換取現金,從賣方到買方。你怎麼看待這件事?
咱們能夠將此模型稱爲:從賣家購買商品全部權(buy-goods-ownership-from-seller)或簡寫爲bogos
讓我展現一些例子,而後翻譯成bogos模型。
buyer
,「smartphone」是商品goods
,「local mart」是賣方seller
。在John支付以前,本地市場擁有智能手機,付款後全部權轉移給他。buyer
,「dish」是商品goods
,「Mama's Pasta」是賣家seller
。支付後,「菜」的全部權從「Mama's Pasta」轉移到「Maria」。buyer
,「car」是貨物goods
而「Joseph」是賣方seller
。支付後,全部權轉移到「Berta」。buyer
,是一家電子產品經銷商,有一家商店,他從賣家北京公司seller
訂購商品goods
。當貨物準備好運輸時,它們被打包,一名叫海外的快遞員將包裹運給Jong。當他收到貨物和發票時,將執行付款。正如咱們在案例研究部分所看到的,參與者之間的信任是傳統業務的主要關注點。這個概念證實的目標是使用以太坊區塊鏈網絡上的智能合約創建一種無信任的方式在參與者之間進行交易。
爲了定義一系列交易,外部交互和支付,我提出了案例研究的新流程。
Courier
智能合約的最佳運費。Courier
在將訂單交付給零售商(Retailer)後 ,標記了智能合約上的訂單。快遞員能夠是機器人,也能夠是無人機。想一想我!今天咱們有不少可能性。好的,足夠的理論,讓咱們看看如何寫代碼!
爲了加速咱們的發展,有一個很好的選擇叫作Truffle Framework。這個框架有不少東西能夠幫助咱們在以太坊編程語言Solidity中開發智能合約。
要快速查看Solidity,我建議你訪問如下網站:http://solidity.readthedocs.io/en/develop/solidity-by-example.html
Truffle是一個用於編譯,測試和部署用Solidity編寫的智能合約到以太坊區塊鏈的工具。要使用它,咱們須要nodejs。而後,檢查已安裝node tools的版本。
若是你的計算機中沒有nodejs,請按照這些說明操做 。
$ node -v v6.11.5 $ npm -v 3.10.10
使用如下命令全局安裝Truffle。
$ sudo npm install -g truffle
檢查Truffle的版本輸入truffle version
。
$ truffle version Truffle v4.0.5 (core: 4.0.5) Solidity v0.4.18 (solc-js)
全局安裝ganache CLI以在localhost上運行私有以太坊區塊鏈網絡。
$ sudo npm install -g ganache-cli
而後,嘗試在終端中輸入ganache-cli
。你必須在localhost上看到相似於如下內容的8545端口。
$ ganache-cli Ganache CLI v6.0.3 (ganache-core: 2.0.2) Available Accounts ================== (0) 0x8baae15bf75ffdb6fcde77ecc4e2aa8063ad820c (1) 0x1f6c6fa7aceb8124e9db0bd283dbe99489cd7b80 (2) 0x85e1e869e57004618481539c1ee8b2a55195892b (3) 0x05dd0af1306a4537ca25e651f97df23c68d9b2d7 (4) 0x84a9964a2a9d8136498b26f27311c1ecd244733a (5) 0x79e21b3f20eca854fa6ca822a8550b1fbdda3c30 ... HD Wallet ================== Mnemonic: stereo pistol pulp advance same transfer eight deal unhappy charge attitude lock Base HD Path: m/44'/60'/0'/0/{account_index} Listening on localhost:8545
開始以後,咱們有十個帳戶(或錢包或地址),每一個帳戶餘額爲100.00ETH,還有一個完整的工做和私人區塊鏈,能夠玩,試錯,用不完的以太幣,作咱們想作的一切,直到得到穩定的代碼。
你想要一個更直觀的方式來看看發生的事情,而後安裝Ganache而不是ganache-cli。這個工具能夠完成ganache-cli所作的工做,加上一個很是酷的GUI可使用鼠標點擊。
這些工具,ganache-cli和Ganache GUI在關機後不能維護狀態,它們須要咱們在每次重啓時從新部署智能合約。
MyEtherWallet是一個對初學者來講頗有趣的GUI,它比Ganache GUI更直觀,由於咱們能夠在下拉列表中選擇要調用的函數。它對於演示和截屏也很是有用。
MyEtherWallet只是與以太坊區塊鏈交互的附加工具。咱們必須先運行ganache-cli或Ganache GUI。在此處下載包,解壓縮並在你喜歡的瀏覽器中打開index.html文件,並添加指向正在運行的區塊鏈的自定義節點。
經過本文,我不會僞裝展現如何成爲Solidity程序員,但若是你想要啓動免費的項目,請按如下步驟操做。
$ mkdir my-contract $ cd my-contract $ truffle init Downloading... Unpacking... Setting up... Unbox successful. Sweet! Commands: Compile: truffle compile Migrate: truffle migrate Test contracts: truffle test
要有效地部署合約,咱們必須在migrations
目錄中建立遷移文件。下面我向你展現負責部署Deal.sol
合同的2_deploy_contract.js
文件的內容。經過這種方法,咱們能夠將參數傳遞給合約構造函數以及許多其餘可能性。
「use strict」; var Deal = artifacts.require(「./Deal.sol」); module.exports = function(deployer, network, accounts){ deployer.deploy(Deal, accounts[1]); };
建立一個工做目錄。如下命令將在你的主目錄中建立區塊鏈目錄。
$ mkdir -p ~/blockchain $ cd ~/blockchain
來吧看看代碼。將源代碼從https://github.com/fabiojose/ethereum-ex克隆到~/blockchain
目錄中。
$ git clone https://github.com/fabiojose/ethereum-ex.git $ cd ethereum-ex
安裝依賴項。
$ npm install
一個vanilla Truffle項目不須要npm安裝,但若是咱們想要更多的庫,只需建立一個package.json
文件並將依賴項放在那裏。
要執行Truffle命令,咱們須要訪問咱們的私有區塊鏈。爲此,編輯truffle.js
文件,添加如下行。
module.exports = { networks: { development: { host: "localhost", port: 8545, network_id: "*" } } };
默認狀況下,Ganache GUI在端口號7545上綁定。若是你選擇它而不是ganache-cli,請更改成此端口。在Solidity中,咱們須要編譯.sol
文件。爲此,咱們只需在項目目錄中鍵入如下命令便可:
$ truffle compile Compiling ./contracts/Deal.sol... Writing artifacts to ./build/contracts
要部署咱們編譯的.sol
文件,咱們必須使用migrate
命令。此命令將在truffle.js
文件中配置的網絡中部署智能合約。
$ truffle migrate Using network 'development'. Running migration: 1_initial_migration.js Deploying Migrations... ... 0xa74ff1912d2a53a3d77d2678e9fc617f9baa838a46e57a4182d1da6ff4a0cc4f Migrations: 0xd86037f19f3adac9bdf3331298b3e9709baabb2e Saving successful migration to network... ... 0x221758e993424fa81581100e2cdd278ed45f9c84820f3ced69362813e409a098 Saving artifacts... Running migration: 2_deploy_contracts.js Deploying Deal... ... 0x16f5149e71dd77f8891278e824c9d6e477f7408253fbc2f36560da4aa2a7c6f0 Deal: 0x3c7396d30e70b4deec5b33582b59766249b6ea83 Saving successful migration to network... ... 0x0631419bcf68146a50f524b1d6735f62fca5a825858e57458d4f8cf45e0e70aa Saving artifacts...
要更好地瞭解migration
,請閱讀:http://truffleframework.com/docs/getting_started/migrations
單元測試?:是的!咱們能夠經過智能合約進行單元測試。畢竟,一個簡單的錯誤可能致使咱們丟失全部代幣。
在幕後咱們有Mocha和Chai,主要區別在於使用關鍵字contract
代替describe
建立測試場景。
要執行測試,只需在項目目錄中輸入如下命令便可。
$ truffle test Using network 'development'. Contract: Deal ✓ should the seller account owns the contract (72ms) ✓ should the second account was the buyer (72ms) ✓ should first order was number 1 (154ms) ✓ should the shipment price was set (189ms) ✓ should the order's price was set (169ms) ✓ should the safe pay was correct (218ms) ✓ should the contract's balance was correct after the safepay (186ms) ✓ should the first invoice was number 1 (177ms) ✓ should the invoice 1 it is for order 1 (190ms) ✓ should the courier was correct (186ms) ✓ should the contract's balance was correct after the delivery (268ms) 11 passing (2s)
能夠像在本文中那樣在JavaScript中實現測試,並在Solidity中進行測試。你能夠在此處得到有關測試的更多詳細信息:http://truffleframework.com/docs/getting_started/testing。
爲了實施解決方案,我應用了泛化並使用這些實體:買方(buyer),賣方(seller),貨物(goods),訂單(order),發票(invoice)和稱爲Deal
的智能合約。你能夠經過克隆源代碼來查看具體實現。
賣方爲每一個想要與之進行交易的買方部署一個智能合約,即交易實例。爲此,咱們須要一個帶有一個參數的構造函數constructor
:Buyer賬戶地址。
/// The smart contract’s constructor 智能合約的構造函數 function Deal(address _buyerAddr) public payable { /// The seller is the contract’s owner 賣方是合約的全部者 owner = msg.sender; buyerAddr = _buyerAddr; }
請注意,與許多語言同樣,Solidity的構造函數具備相同的類名,或同名的合約。
contract Deal { /// ... }
要將參數傳遞給構造函數,咱們使用位於migrations/2_deploy_contracts.js
的部署文件來執行此操做,這是咱們調用truffle compile
或truffle test
時由migrations/2_deploy_contracts.js
使用的.js文件。
下面咱們有migration/2_deploy_contract.js
的內容。在第3行,咱們須要爲智能合約加載咱們的Solidity實現。在第6行,咱們使用由Truffle注入的部署實例來執行Deal
的部署。而deploy()
函數的第二個參數將傳遞給第一個構造函數參數。在這種狀況下,咱們從ganache提供的賬戶數組中傳遞第二個賬戶。
1. 「use strict」; 2. 3. var Deal = artifacts.require(「./Deal.sol」); 4. 5. module.exports = function(deployer, network, accounts){ 6. deployer.deploy(Deal, accounts[1]); 7. };
要發送商品訂單,咱們有sendOrder
功能。它是改變合約狀態的函數中無用的返回數據,由於它們啓動將異步處理(或挖掘)的交易。只是查詢合同狀態的函數能夠返回數據。
/// The function to send purchase orders 發送採購訂單的功能 /// requires fee 須要費用 /// Payable functions returns just the transaction object, with no custom field. 應付款函數只返回交易對象,沒有自定義字段。 /// To get field values listen to OrderSent event. 要獲取字段值,請監聽OrderSent事件。 function sendOrder(string goods, uint quantity) payable public { /// ... }
要獲取訂單號,在執行sendOrder
以後咱們必須監聽事件。在這種方法的狀況下,咱們必須使用如下簽名來監聽OrderSent
。
/// Event triggered for every new order 爲每一個新訂單觸發事件 event OrderSent(address buyer, string goods, uint quantity, uint orderno);
實際上,對於每一個更改合同狀態的函數,都會觸發事件以獲取新的數據狀態。對於序列圖中的每一個階段,咱們都有一個執行它的方法:sendPrice
,sendSafepay
,sendInvoice
和delivery
。零售商是買方,製造商是賣方。
完整的代碼被推送到個人Github:https://github.com/fabiojose/ethereum-ex 。
克隆它,玩得開心!
如今是時候體驗智能合約的功能,試圖解決現實世界的問題。去吧,試試看,讓我知道!咱們能夠分享咱們的實驗。
在這一點上,咱們應該關注一些模式。我注意到這兩個與部署方法有關。
======================================================================
分享一些以太坊、EOS、比特幣等區塊鏈相關的交互式在線編程實戰教程:
- 以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。
- 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
- java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
- python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
- php以太坊,主要是介紹使用php進行智能合約開發交互,進行帳號建立、交易、轉帳、代幣開發以及過濾器和交易等內容。
- C#以太坊,主要講解如何使用C#開發基於.Net的以太坊應用,包括帳戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。
- EOS教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、帳戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最後綜合運用各知識點完成一個便籤DApp的開發。
- java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
- php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如建立地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
- tendermint區塊鏈開發詳解,本課程適合但願使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操代碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
匯智網原創翻譯,轉載請標明出處。這裏是原文如何經過構建智能合約來銷售商品