如何通过构建以太坊智能合约来销售商品
如何通過構(gòu)建以太坊智能合約來銷售商品?這是個(gè)問題。
毫無疑問,比特幣已經(jīng)改變了我們看待和理解什么是金錢,價(jià)值以及最近由智能合約產(chǎn)生的所有權(quán)的方式。這很有趣,因?yàn)閹缀趺總€(gè)人都聽說過它或加密貨幣。來自許多業(yè)務(wù)領(lǐng)域的人,不僅僅是我們,IT工作者。
在本文中,我將展示我關(guān)于以太坊的第一份智能合約,這是我對(duì)區(qū)塊鏈的個(gè)人研究的一部分。
區(qū)塊鏈適合初學(xué)者
有許多涉及區(qū)塊鏈技術(shù)的概念,但在本節(jié)中我將嘗試解釋這種驚人的顛覆性技術(shù)。
顧名思義,區(qū)塊鏈?zhǔn)鞘褂盟墓?shù)據(jù)連接在一起的數(shù)據(jù)鏈的塊,由用戶的私鑰簽名。通常,這些塊的大小限制為1MB,并且由于此限制而存儲(chǔ)盡可能多的交易。
- 概念1區(qū)塊:它們是存儲(chǔ)交易的塊。認(rèn)為這些塊是具有一些元組的表,每個(gè)塊都存儲(chǔ)交易。
- 概念2不對(duì)稱加密,公鑰和私鑰對(duì):每個(gè)人都可以訪問我們的公鑰,只需我們?cè)L問我們的私鑰即可。并且,非對(duì)稱加密意味著:我們使用其中一個(gè)密鑰編碼,它只能與另一個(gè)密鑰進(jìn)行解碼。沒有例外。
真實(shí)性:如果我們想簽署數(shù)據(jù),我們使用私鑰進(jìn)行編碼,因?yàn)槊總€(gè)人都可以使用我們的公鑰解碼并安全地認(rèn)證我們。但是沒有人可以改變數(shù)據(jù)并再次簽名,因?yàn)樗鼤?huì)被命運(yùn)所拒絕。當(dāng)真實(shí)性成為問題時(shí)使用。這是區(qū)塊鏈的情況 。
- 使用私鑰,所有者對(duì)數(shù)據(jù)進(jìn)行編碼,或者更好地對(duì)數(shù)據(jù)進(jìn)行簽名 。 通過此操作,所有者保證沒有人偽造他或她的身份。
- 使用公鑰,每個(gè)人都可以解碼數(shù)據(jù),或者更好地檢查 簽名 。 通過這種操作,起源就是我們所期待的。
- 概念3區(qū)塊鏈的不可侵犯性質(zhì)在于鏈接塊的機(jī)制:當(dāng)生成新塊時(shí),從當(dāng)前塊的數(shù)據(jù)生成哈希,包括它的簽名。然后,生成新塊,將來自前一塊的hash與當(dāng)前塊的數(shù)據(jù)組合,并生成新的hash并使用用戶的私鑰進(jìn)行簽名,依此類推。如果有人試圖更改塊的數(shù)據(jù)以偽造事務(wù),則他或她必須在整個(gè)網(wǎng)絡(luò)開始使所有這些重新生成的塊無效之前快速生成所有后續(xù)塊。
如同暗夜里一開始沒有燈......
一切都從創(chuàng)世塊開始,這個(gè)塊負(fù)責(zé)啟動(dòng)區(qū)塊鏈網(wǎng)絡(luò)并設(shè)置許多參數(shù)值,例如挖掘代幣的難度。
如何創(chuàng)建鏈?
基于來自當(dāng)前塊的所有數(shù)據(jù)(包括簽名),生成hash并將其包括在新生成的塊的頭中。此時(shí)此新塊將成為當(dāng)前塊并開始注冊(cè)交易。
很驚人!是不是?
案例分析
我選擇了一個(gè)非常常見的用例,為使其易于理解,只留下了智能合約邏輯和技術(shù)細(xì)節(jié)的實(shí)現(xiàn)。
企業(yè)對(duì)企業(yè)——B2B
- 零售商(retailer)從制造商(manufacturer)處訂購貨物。制造商檢查庫存數(shù)量,收集產(chǎn)品,包裝,準(zhǔn)備和運(yùn)輸。零售商和制造商有可信賴的商業(yè)關(guān)系。
- 貨物(shipment)由制造商要求的快遞公司(courier)發(fā)貨,他們也有可信賴的商業(yè)關(guān)系。
- 零售商(retailer)和快遞(courier)之間可信賴的商業(yè)關(guān)系(relationship)是可傳遞的(transitive),因?yàn)闉橹圃焐烫峁┝斯餐年P(guān)系。
- 值得信賴(trusted)的商業(yè)關(guān)系(relationship)非常重要,因?yàn)閭鹘y(tǒng)市場(chǎng)需要這種關(guān)系。從零售商到制造商的付款是在收到貨物后幾天發(fā)生的。并且,從發(fā)貨人到快遞員的付款在交貨確認(rèn)后幾天發(fā)生。如果沒有信任,他們就不會(huì)互相信任,也不會(huì)做出交易。這并不會(huì)促進(jìn)最佳價(jià)格,服務(wù)和產(chǎn)品的競爭。
概括
最精細(xì)的商業(yè)交易由三部分組成:買方(buyer),貨物(goods)和賣方(seller)。最基本的過程是轉(zhuǎn)移貨物的所有權(quán)以換取現(xiàn)金,從賣方到買方。你怎么看待這件事?
我們可以將此模型稱為:從賣家購買商品所有權(quán)(buy-goods-ownership-from-seller)或簡寫為bogos
讓我展示一些例子,然后翻譯成bogos模型。
- B2C——商品:John想要一部新的智能手機(jī),他去了當(dāng)?shù)氐氖袌?chǎng)并挑選了最好的智能手機(jī)并用他的信用卡付款。在這個(gè)例子中,“John”是買方buyer,“smartphone”是商品goods ,“l(fā)ocal mart”是賣方seller。在John支付之前,本地市場(chǎng)擁有智能手機(jī),付款后所有權(quán)轉(zhuǎn)移給他。
- B2C——服務(wù):Maria很餓,她去了媽媽的意大利面并訂購了很多意大利面條。廚師接受她的訂單細(xì)節(jié),準(zhǔn)備菜肴,服務(wù)員為此服務(wù)。當(dāng)Maria滿意時(shí),她付賬并回家。在這個(gè)例子中,“Maria”是買家buyer,“dish”是商品goods,“Mama's Pasta”是賣家seller。支付后,“菜”的所有權(quán)從“Mama's Pasta”轉(zhuǎn)移到“Maria”。
- C2C——貨物:Joseph在賣他的車。幾周后,Berta想要從他那里買車。他們完成交易,Berta支付了有價(jià)值的價(jià)值,而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。當(dāng)貨物準(zhǔn)備好運(yùn)輸時(shí),它們被打包,一名叫海外的快遞員將包裹運(yùn)給Jong。當(dāng)他收到貨物和發(fā)票時(shí),將執(zhí)行付款。
智能合約解決方案
正如我們?cè)诎咐芯坎糠炙吹降?#xff0c;參與者之間的信任是傳統(tǒng)業(yè)務(wù)的主要關(guān)注點(diǎn)。這個(gè)概念證明的目標(biāo)是使用以太坊區(qū)塊鏈網(wǎng)絡(luò)上的智能合約建立一種無信任的方式在參與者之間進(jìn)行交易。
為了定義一系列交易,外部交互和支付,我提出了案例研究的新流程。
- 制造商(Manufacturer)專門為零售商(Retailer)的帳戶部署智能合約。
- 零售商(Retailer)在(Manufacturer)的智能合約中訂購產(chǎn)品X,其數(shù)量等于N.通過所謂的訂單發(fā)送活動(dòng),制造商(Manufacturer)可以接收訂單數(shù)據(jù)并對(duì)其進(jìn)行處理。
- 制造商(Manufacturer)尋找Courier智能合約的最佳運(yùn)費(fèi)。
- 制造商(Manufacturer)發(fā)送訂單價(jià)格,零售商(Retailer)通過發(fā)送的稱為價(jià)格的事件收到訂單價(jià)格。
- 制造商(Manufacturer)發(fā)送裝運(yùn)價(jià)格,零售商(Retailer)通過發(fā)送的稱為價(jià)格的事件接收此價(jià)格。
- 零售商(Retailer)執(zhí)行總額的安全支付:訂單價(jià)格+裝運(yùn)價(jià)格。這些代幣進(jìn)入智能合約賬戶并等到那里直到交貨。
- 制造商(Manufacturer)發(fā)送包含交貨日期和一些其他數(shù)據(jù)的發(fā)票。零售商(Retailer)通過發(fā)送的稱為發(fā)票的事件接收發(fā)票數(shù)據(jù)。
- Courier在將訂單交付給零售商(Retailer)后 ,標(biāo)記了智能合約上的訂單。快遞員可以是機(jī)器人,也可以是無人機(jī)。想想我!今天我們有很多可能性。
- 智能合約為訂單支付制造商的費(fèi)用。
- 智能合約向快遞公司(Courier)支付為了發(fā)貨。
好的,足夠的理論,讓我們看看如何寫代碼!
開發(fā)工具
為了加速我們的發(fā)展,有一個(gè)很好的選擇叫做Truffle Framework。這個(gè)框架有很多東西可以幫助我們?cè)谝蕴痪幊陶Z言Solidity中開發(fā)智能合約。
要快速查看Solidity,我建議你訪問以下網(wǎng)站:http://solidity.readthedocs.io/en/develop/solidity-by-example.html
Truffle
Truffle是一個(gè)用于編譯,測(cè)試和部署用Solidity編寫的智能合約到以太坊區(qū)塊鏈的工具。要使用它,我們需要nodejs。然后,檢查已安裝node tools的版本。
如果你的計(jì)算機(jī)中沒有nodejs,請(qǐng)按照這些說明操作 。
$ 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上運(yùn)行私有以太坊區(qū)塊鏈網(wǎng)絡(luò)。
$ 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開始之后,我們有十個(gè)賬戶(或錢包或地址),每個(gè)賬戶余額為100.00ETH,還有一個(gè)完整的工作和私人區(qū)塊鏈,可以玩,試錯(cuò),用不完的以太幣,做我們想做的一切,直到獲得穩(wěn)定的代碼。
你想要一個(gè)更直觀的方式來看看發(fā)生的事情,然后安裝Ganache而不是ganache-cli。這個(gè)工具可以完成ganache-cli所做的工作,加上一個(gè)非常酷的GUI可以使用鼠標(biāo)點(diǎn)擊。
這些工具,ganache-cli和Ganache GUI在關(guān)機(jī)后不能維護(hù)狀態(tài),它們需要我們?cè)诿看沃貑r(shí)重新部署智能合約。
MyEtherWallet是一個(gè)對(duì)初學(xué)者來說很有趣的GUI,它比Ganache GUI更直觀,因?yàn)槲覀兛梢栽谙吕斜碇羞x擇要調(diào)用的函數(shù)。它對(duì)于演示和截屏也非常有用。
MyEtherWallet只是與以太坊區(qū)塊鏈交互的附加工具。我們必須先運(yùn)行g(shù)anache-cli或Ganache GUI。在此處下載包,解壓縮并在你喜歡的瀏覽器中打開index.html文件,并添加指向正在運(yùn)行的區(qū)塊鏈的自定義節(jié)點(diǎn)。
設(shè)置
通過本文,我不會(huì)假裝展示如何成為Solidity程序員,但如果你想要啟動(dòng)免費(fèi)的項(xiàng)目,請(qǐng)按以下步驟操作。
$ mkdir my-contract $ cd my-contract $ truffle init Downloading... Unpacking... Setting up... Unbox successful. Sweet! Commands: Compile: truffle compileMigrate: truffle migrateTest contracts: truffle test要有效地部署合約,我們必須在migrations目錄中創(chuàng)建遷移文件。下面我向你展示負(fù)責(zé)部署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)建一個(gè)工作目錄。以下命令將在你的主目錄中創(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安裝依賴項(xiàng)。
$ npm install一個(gè)vanilla Truffle項(xiàng)目不需要npm安裝,但如果我們想要更多的庫,只需創(chuàng)建一個(gè)package.json文件并將依賴項(xiàng)放在那里。
構(gòu)建和部署
要執(zhí)行Truffle命令,我們需要訪問我們的私有區(qū)塊鏈。為此,編輯truffle.js文件,添加以下行。
module.exports = {networks: {development: {host: "localhost",port: 8545,network_id: "*"}} };默認(rèn)情況下,Ganache GUI在端口號(hào)7545上綁定。如果你選擇它而不是ganache-cli,請(qǐng)更改為此端口。在Solidity中,我們需要編譯.sol文件。為此,我們只需在項(xiàng)目目錄中鍵入以下命令即可:
$ truffle compile Compiling ./contracts/Deal.sol... Writing artifacts to ./build/contracts要部署我們編譯的.sol文件,我們必須使用migrate命令。此命令將在truffle.js文件中配置的網(wǎng)絡(luò)中部署智能合約。
$ truffle migrate Using network 'development'. Running migration: 1_initial_migration.jsDeploying Migrations...... 0xa74ff1912d2a53a3d77d2678e9fc617f9baa838a46e57a4182d1da6ff4a0cc4fMigrations: 0xd86037f19f3adac9bdf3331298b3e9709baabb2e Saving successful migration to network...... 0x221758e993424fa81581100e2cdd278ed45f9c84820f3ced69362813e409a098 Saving artifacts... Running migration: 2_deploy_contracts.jsDeploying Deal...... 0x16f5149e71dd77f8891278e824c9d6e477f7408253fbc2f36560da4aa2a7c6f0Deal: 0x3c7396d30e70b4deec5b33582b59766249b6ea83 Saving successful migration to network...... 0x0631419bcf68146a50f524b1d6735f62fca5a825858e57458d4f8cf45e0e70aa Saving artifacts...要更好地了解migration,請(qǐng)閱讀:http://truffleframework.com/docs/getting_started/migrations
測(cè)試
單元測(cè)試?:是的!我們可以通過智能合約進(jìn)行單元測(cè)試。畢竟,一個(gè)簡單的錯(cuò)誤可能導(dǎo)致我們丟失所有代幣。
在幕后我們有Mocha和Chai,主要區(qū)別在于使用關(guān)鍵字contract代替describe創(chuàng)建測(cè)試場(chǎng)景。
要執(zhí)行測(cè)試,只需在項(xiàng)目目錄中輸入以下命令即可。
$ 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中實(shí)現(xiàn)測(cè)試,并在Solidity中進(jìn)行測(cè)試。你可以在此處獲得有關(guān)測(cè)試的更多詳細(xì)信息:http://truffleframework.com/docs/getting_started/testing。
編碼
為了實(shí)施解決方案,我應(yīng)用了泛化并使用這些實(shí)體:買方(buyer),賣方(seller),貨物(goods),訂單(order),發(fā)票(invoice)和稱為Deal的智能合約。你可以通過克隆源代碼來查看具體實(shí)現(xiàn)。
賣方為每個(gè)想要與之進(jìn)行交易的買方部署一個(gè)智能合約,即交易實(shí)例。為此,我們需要一個(gè)帶有一個(gè)參數(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; }請(qǐng)注意,與許多語言一樣,Solidity的構(gòu)造函數(shù)具有相同的類名,或同名的合約。
contract Deal {/// ... }要將參數(shù)傳遞給構(gòu)造函數(shù),我們使用位于migrations/2_deploy_contracts.js的部署文件來執(zhí)行此操作,這是我們調(diào)用truffle compile或truffle test時(shí)由migrations/2_deploy_contracts.js使用的.js文件。
下面我們有migration/2_deploy_contract.js的內(nèi)容。在第3行,我們需要為智能合約加載我們的Solidity實(shí)現(xiàn)。在第6行,我們使用由Truffle注入的部署實(shí)例來執(zhí)行Deal的部署。而deploy()函數(shù)的第二個(gè)參數(shù)將傳遞給第一個(gè)構(gòu)造函數(shù)參數(shù)。在這種情況下,我們從ganache提供的帳戶數(shù)組中傳遞第二個(gè)帳戶。
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ù)中無用的返回?cái)?shù)據(jù),因?yàn)樗鼈儐?dòng)將異步處理(或挖掘)的交易。只是查詢合同狀態(tài)的函數(shù)可以返回?cái)?shù)據(jù)。
/// The function to send purchase orders 發(fā)送采購訂單的功能/// requires fee 需要費(fèi)用/// Payable functions returns just the transaction object, with no custom field. 應(yīng)付款函數(shù)只返回交易對(duì)象,沒有自定義字段。/// To get field values listen to OrderSent event. 要獲取字段值,請(qǐng)監(jiān)聽OrderSent事件。function sendOrder(string goods, uint quantity) payable public {/// ...}要獲取訂單號(hào),在執(zhí)行sendOrder之后我們必須監(jiān)聽事件。在這種方法的情況下,我們必須使用以下簽名來監(jiān)聽OrderSent。
/// Event triggered for every new order 為每個(gè)新訂單觸發(fā)事件 event OrderSent(address buyer, string goods, uint quantity, uint orderno);實(shí)際上,對(duì)于每個(gè)更改合同狀態(tài)的函數(shù),都會(huì)觸發(fā)事件以獲取新的數(shù)據(jù)狀態(tài)。對(duì)于序列圖中的每個(gè)階段,我們都有一個(gè)執(zhí)行它的方法:sendPrice,sendSafepay,sendInvoice和delivery。零售商是買方,制造商是賣方。
完整的代碼被推送到我的Github:https://github.com/fabiojose/ethereum-ex 。
克隆它,玩得開心!
最后的話
現(xiàn)在是時(shí)候體驗(yàn)智能合約的功能,試圖解決現(xiàn)實(shí)世界的問題。去吧,試試看,讓我知道!我們可以分享我們的實(shí)驗(yàn)。
關(guān)于模式
在這一點(diǎn)上,我們應(yīng)該關(guān)注一些模式。我注意到這兩個(gè)與部署方法有關(guān)。
- 部署一次,多次使用:這個(gè)工作就像一個(gè)應(yīng)用程序,因?yàn)槲覀儾渴鹆艘粋€(gè)智能合約版本并多次使用直到銷毀它。這是本文使用的方法。
- 一次部署,一次使用:在這種方法中,我們部署了一個(gè)智能合約的版本,一次性使用它,我們需要一個(gè)非常具體的目標(biāo)并在最后銷毀。
參考
- http://solidity.readthedocs.i...
- http://solidity.readthedocs.i...
- https://vomtom.at/solidity-se...
- https://zupzup.org/smart-cont...
- http://truffleframework.com/d...
======================================================================
分享一些以太坊、EOS、比特幣等區(qū)塊鏈相關(guān)的交互式在線編程實(shí)戰(zhàn)教程:
- 以太坊入門教程,主要介紹智能合約與dapp應(yīng)用開發(fā),適合入門。
- 以太坊開發(fā)進(jìn)階教程,主要是介紹使用node.js、mongodb、區(qū)塊鏈、ipfs實(shí)現(xiàn)去中心化電商DApp實(shí)戰(zhàn),適合進(jìn)階。
- java以太坊開發(fā)教程,主要是針對(duì)java和android程序員進(jìn)行區(qū)塊鏈以太坊開發(fā)的web3j詳解。
- python以太坊,主要是針對(duì)python工程師使用web3.py進(jìn)行區(qū)塊鏈以太坊開發(fā)的詳解。
- php以太坊,主要是介紹使用php進(jìn)行智能合約開發(fā)交互,進(jìn)行賬號(hào)創(chuàng)建、交易、轉(zhuǎn)賬、代幣開發(fā)以及過濾器和交易等內(nèi)容。
- C#以太坊,主要講解如何使用C#開發(fā)基于.Net的以太坊應(yīng)用,包括賬戶管理、狀態(tài)與交易、智能合約開發(fā)與交互、過濾器和交易等。
- EOS教程,本課程幫助你快速入門EOS區(qū)塊鏈去中心化應(yīng)用的開發(fā),內(nèi)容涵蓋EOS工具鏈、賬戶與錢包、發(fā)行代幣、智能合約開發(fā)與部署、使用代碼與智能合約交互等核心知識(shí)點(diǎn),最后綜合運(yùn)用各知識(shí)點(diǎn)完成一個(gè)便簽DApp的開發(fā)。
- java比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Java代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Java工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
- php比特幣開發(fā)教程,本課程面向初學(xué)者,內(nèi)容即涵蓋比特幣的核心概念,例如區(qū)塊鏈存儲(chǔ)、去中心化共識(shí)機(jī)制、密鑰與腳本、交易與UTXO等,同時(shí)也詳細(xì)講解如何在Php代碼中集成比特幣支持功能,例如創(chuàng)建地址、管理錢包、構(gòu)造裸交易等,是Php工程師不可多得的比特幣開發(fā)學(xué)習(xí)課程。
- tendermint區(qū)塊鏈開發(fā)詳解,本課程適合希望使用tendermint進(jìn)行區(qū)塊鏈開發(fā)的工程師,課程內(nèi)容即包括tendermint應(yīng)用開發(fā)模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態(tài)庫等,也包括代幣發(fā)行等豐富的實(shí)操代碼,是go語言工程師快速入門區(qū)塊鏈開發(fā)的最佳選擇。
匯智網(wǎng)原創(chuàng)翻譯,轉(zhuǎn)載請(qǐng)標(biāo)明出處。這里是原文如何通過構(gòu)建智能合約來銷售商品
總結(jié)
以上是生活随笔為你收集整理的如何通过构建以太坊智能合约来销售商品的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。