如何通過以太坊構(gòu)建智能合約來銷售商品

如何通過構(gòu)建以太坊智能合約來銷售商品?這是個問題。

毫無疑問,比特幣已經(jīng)改變了我們看待和理解什么是金錢,價值以及最近由智能合約產(chǎn)生的所有權(quán)的方式。這很有趣,因為幾乎每個人都聽說過它或加密貨幣。來自許多業(yè)務領域的人,不僅僅是我們,IT工作者。

在本文中,我將展示我關(guān)于以太坊的第一份智能合約,這是我對區(qū)塊鏈的個人研究的一部分。

區(qū)塊鏈適合初學者

有許多涉及區(qū)塊鏈技術(shù)的概念,但在本節(jié)中我將嘗試解釋這種驚人的顛覆性技術(shù)。

顧名思義,區(qū)塊鏈是使用它的哈希數(shù)據(jù)連接在一起的數(shù)據(jù)鏈的塊,由用戶的私鑰簽名。通常,這些塊的大小限制為1MB,并且由于此限制而存儲盡可能多的交易。

  • 概念1區(qū)塊:它們是存儲交易的塊。認為這些塊是具有一些元組的表,每個塊都存儲交易。
區(qū)塊
  • 概念2不對稱加密,公鑰和私鑰對:每個人都可以訪問我們的公鑰,只需我們訪問我們的私鑰即可。并且,非對稱加密意味著:我們使用其中一個密鑰編碼,它只能與另一個密鑰進行解碼。沒有例外。

真實性:如果我們想簽署數(shù)據(jù),我們使用私鑰進行編碼,因為每個人都可以使用我們的公鑰解碼并安全地認證我們。但是沒有人可以改變數(shù)據(jù)并再次簽名,因為它會被命運所拒絕。當真實性成為問題時使用。這是區(qū)塊鏈的情況 。

簽署數(shù)據(jù)以保證真實性
  • 使用私鑰,所有者對數(shù)據(jù)進行編碼,或者更好地對數(shù)據(jù)進行簽名 。 通過此操作,所有者保證沒有人偽造他或她的身份。

  • 使用公鑰,每個人都可以解碼數(shù)據(jù),或者更好地檢查 簽名 。 通過這種操作,起源就是我們所期待的。

  • 概念3區(qū)塊鏈的不可侵犯性質(zhì)在于鏈接塊的機制:當生成新塊時,從當前塊的數(shù)據(jù)生成哈希,包括它的簽名。然后,生成新塊,將來自前一塊的hash與當前塊的數(shù)據(jù)組合,并生成新的hash并使用用戶的私鑰進行簽名,依此類推。如果有人試圖更改塊的數(shù)據(jù)以偽造事務,則他或她必須在整個網(wǎng)絡開始使所有這些重新生成的塊無效之前快速生成所有后續(xù)塊。

如同暗夜里一開始沒有燈......

一切都從創(chuàng)世塊開始,這個塊負責啟動區(qū)塊鏈網(wǎng)絡并設置許多參數(shù)值,例如挖掘代幣的難度。

如何創(chuàng)建鏈?

基于來自當前塊的所有數(shù)據(jù)(包括簽名),生成hash并將其包括在新生成的塊的頭中。此時此新塊將成為當前塊并開始注冊交易。

很驚人!是不是?

案例分析

我選擇了一個非常常見的用例,為使其易于理解,只留下了智能合約邏輯和技術(shù)細節(jié)的實現(xiàn)。

企業(yè)對企業(yè)——B2B

  • 零售商(retailer)從制造商(manufacturer)處訂購貨物。制造商檢查庫存數(shù)量,收集產(chǎn)品,包裝,準備和運輸。零售商和制造商有可信賴的商業(yè)關(guān)系。
  • 貨物(shipment)由制造商要求的快遞公司(courier)發(fā)貨,他們也有可信賴的商業(yè)關(guān)系。
  • 零售商(retailer)和快遞(courier)之間可信賴的商業(yè)關(guān)系(relationship)是可傳遞的(transitive),因為為制造商提供了共同的關(guān)系。
  • 值得信賴(trusted)的商業(yè)關(guān)系(relationship)非常重要,因為傳統(tǒng)市場需要這種關(guān)系。從零售商到制造商的付款是在收到貨物后幾天發(fā)生的。并且,從發(fā)貨人到快遞員的付款在交貨確認后幾天發(fā)生。如果沒有信任,他們就不會互相信任,也不會做出交易。這并不會促進最佳價格,服務和產(chǎn)品的競爭。

概括

最精細的商業(yè)交易由三部分組成:買方(buyer),貨物(goods)和賣方(seller)。最基本的過程是轉(zhuǎn)移貨物的所有權(quán)以換取現(xiàn)金,從賣方到買方。你怎么看待這件事?

我們可以將此模型稱為:從賣家購買商品所有權(quán)(buy-goods-ownership-from-seller)或簡寫為bogos

購買-所有權(quán)-商品-賣方圖表模型

讓我展示一些例子,然后翻譯成bogos模型。

  • B2C——商品:John想要一部新的智能手機,他去了當?shù)氐氖袌霾⑻暨x了最好的智能手機并用他的信用卡付款。在這個例子中,“John”是買方buyer,“smartphone”是商品goods ,“l(fā)ocal mart”是賣方seller。在John支付之前,本地市場擁有智能手機,付款后所有權(quán)轉(zhuǎn)移給他。
  • B2C——服務:Maria很餓,她去了媽媽的意大利面并訂購了很多意大利面條。廚師接受她的訂單細節(jié),準備菜肴,服務員為此服務。當Maria滿意時,她付賬并回家。在這個例子中,“Maria”是買家buyer,“dish”是商品goods,“Mama's Pasta”是賣家seller。支付后,“菜”的所有權(quán)從“Mama's Pasta”轉(zhuǎn)移到“Maria”。
  • C2C——貨物:Joseph在賣他的車。幾周后,Berta想要從他那里買車。他們完成交易,Berta支付了有價值的價值,而Joseph將所有權(quán)轉(zhuǎn)讓給了她。 在這種情況下,“Berta”是買方buyer,“car”是貨物goods而“Joseph”是賣方seller。支付后,所有權(quán)轉(zhuǎn)移到“Berta”。
  • B2B——商品:Jong,買家buyer,是一家電子產(chǎn)品經(jīng)銷商,有一家商店,他從賣家北京公司seller訂購商品goods。當貨物準備好運輸時,它們被打包,一名叫海外的快遞員將包裹運給Jong。當他收到貨物和發(fā)票時,將執(zhí)行付款。

智能合約解決方案

正如我們在案例研究部分所看到的,參與者之間的信任是傳統(tǒng)業(yè)務的主要關(guān)注點。這個概念證明的目標是使用以太坊區(qū)塊鏈網(wǎng)絡上的智能合約建立一種無信任的方式在參與者之間進行交易。

帶智能解決方案的序列圖

為了定義一系列交易,外部交互和支付,我提出了案例研究的新流程。

  • 制造商(Manufacturer)專門為零售商(Retailer)的帳戶部署智能合約。
  • 零售商(Retailer)在(Manufacturer)的智能合約中訂購產(chǎn)品X,其數(shù)量等于N.通過所謂的訂單發(fā)送活動,制造商(Manufacturer)可以接收訂單數(shù)據(jù)并對其進行處理。
  • 制造商(Manufacturer)尋找Courier智能合約的最佳運費。
  • 制造商(Manufacturer)發(fā)送訂單價格,零售商(Retailer)通過發(fā)送的稱為價格的事件收到訂單價格。
  • 制造商(Manufacturer)發(fā)送裝運價格,零售商(Retailer)通過發(fā)送的稱為價格的事件接收此價格。
  • 零售商(Retailer)執(zhí)行總額的安全支付:訂單價格+裝運價格。這些代幣進入智能合約賬戶并等到那里直到交貨。
  • 制造商(Manufacturer)發(fā)送包含交貨日期和一些其他數(shù)據(jù)的發(fā)票。零售商(Retailer)通過發(fā)送的稱為發(fā)票的事件接收發(fā)票數(shù)據(jù)。
  • Courier在將訂單交付給零售商(Retailer)后 ,標記了智能合約上的訂單??爝f員可以是機器人,也可以是無人機。想想我!今天我們有很多可能性。
  • 智能合約為訂單支付制造商的費用。
  • 智能合約向快遞公司(Courier)支付為了發(fā)貨。

好的,足夠的理論,讓我們看看如何寫代碼!

開發(fā)工具

為了加速我們的發(fā)展,有一個很好的選擇叫做Truffle Framework。這個框架有很多東西可以幫助我們在以太坊編程語言Solidity中開發(fā)智能合約。

要快速查看Solidity,我建議你訪問以下網(wǎng)站:http://solidity.readthedocs.io/en/develop/solidity-by-example.html

Truffle

Truffle是一個用于編譯,測試和部署用Solidity編寫的智能合約到以太坊區(qū)塊鏈的工具。要使用它,我們需要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

全局安裝ganache CLI以在localhost上運行私有以太坊區(qū)塊鏈網(wǎng)絡。

$ sudo npm install -g ganache-cli

然后,嘗試在終端中輸入ganache-cli。你必須在localhost上看到類似于以下內(nèi)容的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,還有一個完整的工作和私人區(qū)塊鏈,可以玩,試錯,用不完的以太幣,做我們想做的一切,直到獲得穩(wěn)定的代碼。

你想要一個更直觀的方式來看看發(fā)生的事情,然后安裝Ganache而不是ganache-cli。這個工具可以完成ganache-cli所做的工作,加上一個非??岬腉UI可以使用鼠標點擊。

image

這些工具,ganache-cli和Ganache GUI在關(guān)機后不能維護狀態(tài),它們需要我們在每次重啟時重新部署智能合約。

MyEtherWallet是一個對初學者來說很有趣的GUI,它比Ganache GUI更直觀,因為我們可以在下拉列表中選擇要調(diào)用的函數(shù)。它對于演示和截屏也非常有用。

MyEtherWallet只是與以太坊區(qū)塊鏈交互的附加工具。我們必須先運行g(shù)anache-cli或Ganache GUI。在此處下載包,解壓縮并在你喜歡的瀏覽器中打開index.html文件,并添加指向正在運行的區(qū)塊鏈的自定義節(jié)點。

設置

通過本文,我不會假裝展示如何成為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目錄中創(chuàng)建遷移文件。下面我向你展示負責部署Deal.sol合同的2_deploy_contract.js文件的內(nèi)容。通過這種方法,我們可以將參數(shù)傳遞給合約構(gòu)造函數(shù)以及許多其他可能性。

“use strict”;
var Deal = artifacts.require(“./Deal.sol”);
module.exports = function(deployer, network, accounts){
 deployer.deploy(Deal, accounts[1]);
};

創(chuàng)建一個工作目錄。以下命令將在你的主目錄中創(chuàng)建區(qū)塊鏈目錄。

$ 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安裝,但如果我們想要更多的庫,只需創(chuàng)建一個package.json文件并將依賴項放在那里。

構(gòu)建和部署

要執(zhí)行Truffle命令,我們需要訪問我們的私有區(qū)塊鏈。為此,編輯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文件中配置的網(wǎng)絡中部署智能合約。

$ 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,主要區(qū)別在于使用關(guān)鍵字contract代替describe創(chuàng)建測試場景。

要執(zhí)行測試,只需在項目目錄中輸入以下命令即可。

$ 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中實現(xiàn)測試,并在Solidity中進行測試。你可以在此處獲得有關(guān)測試的更多詳細信息:http://truffleframework.com/docs/getting_started/testing。

編碼

為了實施解決方案,我應用了泛化并使用這些實體:買方(buyer),賣方(seller),貨物(goods),訂單(order),發(fā)票(invoice)和稱為Deal的智能合約。你可以通過克隆源代碼來查看具體實現(xiàn)。

賣方為每個想要與之進行交易的買方部署一個智能合約,即交易實例。為此,我們需要一個帶有一個參數(shù)的構(gòu)造函數(shù)constructor:Buyer帳戶地址。

/// The smart contract’s constructor 智能合約的構(gòu)造函數(shù) 
function Deal(address _buyerAddr) public payable {
 
  /// The seller is the contract’s owner 賣方是合約的所有者
  owner = msg.sender;
  buyerAddr = _buyerAddr;
}

請注意,與許多語言一樣,Solidity的構(gòu)造函數(shù)具有相同的類名,或同名的合約。

contract Deal {
  /// ...
}

要將參數(shù)傳遞給構(gòu)造函數(shù),我們使用位于migrations/2_deploy_contracts.js的部署文件來執(zhí)行此操作,這是我們調(diào)用truffle compiletruffle test時由migrations/2_deploy_contracts.js使用的.js文件。

下面我們有migration/2_deploy_contract.js的內(nèi)容。在第3行,我們需要為智能合約加載我們的Solidity實現(xiàn)。在第6行,我們使用由Truffle注入的部署實例來執(zhí)行Deal的部署。而deploy()函數(shù)的第二個參數(shù)將傳遞給第一個構(gòu)造函數(shù)參數(shù)。在這種情況下,我們從ganache提供的帳戶數(shù)組中傳遞第二個帳戶。

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. };

要發(fā)送商品訂單,我們有sendOrder功能。它是改變合約狀態(tài)的函數(shù)中無用的返回數(shù)據(jù),因為它們啟動將異步處理(或挖掘)的交易。只是查詢合同狀態(tài)的函數(shù)可以返回數(shù)據(jù)。

  /// The function to send purchase orders 發(fā)送采購訂單的功能
  /// requires fee 需要費用
  /// Payable functions returns just the transaction object, with no custom field. 應付款函數(shù)只返回交易對象,沒有自定義字段。
  /// To get field values listen to OrderSent event. 要獲取字段值,請監(jiān)聽OrderSent事件。
  function sendOrder(string goods, uint quantity) payable public {
    /// ...
  }

要獲取訂單號,在執(zhí)行sendOrder之后我們必須監(jiān)聽事件。在這種方法的情況下,我們必須使用以下簽名來監(jiān)聽OrderSent。

/// Event triggered for every new order 為每個新訂單觸發(fā)事件
event OrderSent(address buyer, string goods, uint quantity, uint orderno);

實際上,對于每個更改合同狀態(tài)的函數(shù),都會觸發(fā)事件以獲取新的數(shù)據(jù)狀態(tài)。對于序列圖中的每個階段,我們都有一個執(zhí)行它的方法:sendPrice,sendSafepay,sendInvoicedelivery。零售商是買方,制造商是賣方。

完整的代碼被推送到我的Github:https://github.com/fabiojose/ethereum-ex 。

克隆它,玩得開心!

最后的話

現(xiàn)在是時候體驗智能合約的功能,試圖解決現(xiàn)實世界的問題。去吧,試試看,讓我知道!我們可以分享我們的實驗。

關(guān)于模式

在這一點上,我們應該關(guān)注一些模式。我注意到這兩個與部署方法有關(guān)。

  • 部署一次,多次使用:這個工作就像一個應用程序,因為我們部署了一個智能合約版本并多次使用直到銷毀它。這是本文使用的方法。
  • 一次部署,一次使用:在這種方法中,我們部署了一個智能合約的版本,一次性使用它,我們需要一個非常具體的目標并在最后銷毀。

參考

======================================================================

分享一些以太坊、EOS、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實戰(zhàn)教程:

  • 以太坊入門教程,主要介紹智能合約與dapp應用開發(fā),適合入門。
  • 以太坊開發(fā)進階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實現(xiàn)去中心化電商DApp實戰(zhàn),適合進階。
  • java以太坊開發(fā)教程,主要是針對java和android程序員進行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區(qū)塊鏈以太坊開發(fā)的詳解。
  • php以太坊,主要是介紹使用php進行智能合約開發(fā)交互,進行賬號創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。
  • C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。
  • EOS教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發(fā)。
  • java比特幣開發(fā)教程,本課程面向初學者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學習課程。
  • php比特幣開發(fā)教程,本課程面向初學者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學習課程。
  • tendermint區(qū)塊鏈開發(fā)詳解,本課程適合希望使用tendermint進行區(qū)塊鏈開發(fā)的工程師,課程內(nèi)容即包括tendermint應用開發(fā)模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態(tài)庫等,也包括代幣發(fā)行等豐富的實操代碼,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。

匯智網(wǎng)原創(chuàng)翻譯,轉(zhuǎn)載請標明出處。這里是原文如何通過構(gòu)建智能合約來銷售商品

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容