日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

二十分钟教你如何将区块链应用与函数计算相结合

發(fā)布時(shí)間:2024/8/23 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 二十分钟教你如何将区块链应用与函数计算相结合 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

本篇文章適合對區(qū)塊鏈應(yīng)用感興趣或是想要通過函數(shù)計(jì)算服務(wù)進(jìn)一步開發(fā)區(qū)塊鏈應(yīng)用的新人。本文將結(jié)合阿里云區(qū)塊鏈服務(wù)、阿里云函數(shù)計(jì)算服務(wù)、阿里云日志服務(wù) 以及社區(qū)應(yīng)用 Marbles,手把手教大家如何將阿里云區(qū)塊鏈服務(wù)與阿里云函數(shù)計(jì)算服務(wù)相結(jié)合,并進(jìn)一步提供業(yè)務(wù)上的結(jié)合場景,供大家開拓思路。

本文分為以下幾部分:

  • 函數(shù)計(jì)算與區(qū)塊鏈
  • Marbles 區(qū)塊鏈應(yīng)用介紹
  • Marbles 區(qū)塊鏈應(yīng)用結(jié)合函數(shù)計(jì)算進(jìn)行擴(kuò)展示例
  • 區(qū)塊鏈應(yīng)用與函數(shù)計(jì)算在業(yè)務(wù)上結(jié)合的場景與價(jià)值探討

函數(shù)計(jì)算與區(qū)塊鏈

函數(shù)計(jì)算

函數(shù)計(jì)算是事件驅(qū)動(dòng)的全托管計(jì)算服務(wù)。使用函數(shù)計(jì)算,無需采購與管理服務(wù)器等基礎(chǔ)設(shè)施,只需編寫并上傳代碼。函數(shù)計(jì)算為用戶準(zhǔn)備好計(jì)算資源,彈性地可靠地運(yùn)行任務(wù),并提供日志查詢、性能監(jiān)控和報(bào)警等功能。借助函數(shù)計(jì)算,可以快速構(gòu)建任何類型的應(yīng)用和服務(wù),并且只需為任務(wù)實(shí)際消耗的資源付費(fèi)。

下圖為函數(shù)計(jì)算工作流程:

區(qū)塊鏈

區(qū)塊鏈可以理解為去中心的分布式記賬系統(tǒng),其是一種?分布式、去中心化的計(jì)算與存儲架構(gòu)?。區(qū)塊鏈通過某種方式來記錄數(shù)據(jù),使用戶可以信任區(qū)塊鏈系統(tǒng)記錄的數(shù)據(jù)。區(qū)塊鏈中的記賬節(jié)點(diǎn)會按照一致性協(xié)議記賬。記賬節(jié)點(diǎn)愿意按照一致性協(xié)議記賬,是因?yàn)樵谝恢滦詤f(xié)議的設(shè)計(jì)中,誠實(shí)的記賬節(jié)點(diǎn)會得到相應(yīng)的獎(jiǎng)賞,且誠實(shí)的記錄比惡意篡改記錄的收益更大。

依托于區(qū)塊鏈網(wǎng)絡(luò)的可信度,衍生出了智能合約的概念。什么是智能合約呢?現(xiàn)實(shí)生活中,買家與賣家要進(jìn)行一筆交易,為了保證交易的順利進(jìn)行,雙方會簽訂一份合約,合約中會聲明雙方各自的身份、權(quán)利以及義務(wù)。當(dāng)交易出現(xiàn)糾紛時(shí),買家與賣家根據(jù)當(dāng)時(shí)簽訂的合約通過法律的手段解決糾紛。這種方式的不足之處在于解決糾紛的過程需要第三方權(quán)威來仲裁以及需要大量時(shí)間。那么,假使我們現(xiàn)在有一位可信公正的交易代理人。賣家將商品交給代理人,買家與代理人雙方之間一手交錢一手交貨。若買家拒絕購買,代理人會將商品歸還給買家。買家也不會付了錢拿不到商品。智能合約就可以充當(dāng)這樣的代理人,其為區(qū)塊鏈上一個(gè)包含合約代碼和存儲空間的虛擬賬戶,合約的代碼控制智能合約的行為,合約的賬戶存儲合約的狀態(tài)。

由于有了智能合約,DApp (Decentralized Application 即去中心化應(yīng)用)也應(yīng)運(yùn)而生。DApp 是運(yùn)行在區(qū)塊鏈網(wǎng)絡(luò)上的應(yīng)用軟件,其上運(yùn)行的代碼我們稱之為智能合約。

Marbles 區(qū)塊鏈應(yīng)用介紹

Marbles 區(qū)塊鏈應(yīng)用是一個(gè)?資產(chǎn)轉(zhuǎn)移?應(yīng)用演示。在 Marbles 區(qū)塊鏈應(yīng)用中多個(gè)用戶可以創(chuàng)建并相互轉(zhuǎn)移彈珠。 (?即彈珠就是資產(chǎn)轉(zhuǎn)移中的資產(chǎn)?)

上圖中:

  • Amy、Alice、Ava 所在的小長方形是她們每個(gè)人的賬戶
  • 小長方形中的圓形彈珠是每個(gè)人賬戶中的資產(chǎn),彈珠的顏色和大小是資產(chǎn)的屬性
  • 點(diǎn)擊小長方形中的加號是為某個(gè)賬戶創(chuàng)建彈珠(資產(chǎn))
  • 將某個(gè)小長方形中的彈珠拖拽到右上方的垃圾桶中,是為某個(gè)賬戶刪除彈珠(資產(chǎn))
  • 將某個(gè)彈珠從一個(gè)小長方形拖拽到到另一個(gè)小長方形,是彈珠(資產(chǎn))的轉(zhuǎn)移
  • 每一步的操作會在下方的 BLOCKS 創(chuàng)建一個(gè)新的小正方形,這個(gè)小正方形就代表包含交易內(nèi)容的區(qū)塊

Marbles 區(qū)塊鏈應(yīng)用代碼分成三部分:

  • 鏈碼 - 區(qū)塊鏈網(wǎng)絡(luò)中,對等節(jié)點(diǎn)所運(yùn)行的代碼。鏈碼在此次介紹的 Marbles 應(yīng)用中的主要作用是處理創(chuàng)建以及轉(zhuǎn)移彈珠的邏輯。
  • 客戶端 - 瀏覽器中運(yùn)行的代碼,負(fù)責(zé) Marbles 應(yīng)用頁面的渲染與交互。
  • 服務(wù)端 - 服務(wù)器中運(yùn)行的代碼,充當(dāng) Marbles 應(yīng)用與區(qū)塊鏈網(wǎng)絡(luò)之間的橋梁,其與客戶端以及區(qū)塊鏈網(wǎng)絡(luò)中運(yùn)行著鏈碼的節(jié)點(diǎn)進(jìn)行通信。
  • 在 Marbles 應(yīng)用中,當(dāng)客戶端發(fā)送消息給服務(wù)端,服務(wù)端與區(qū)塊鏈網(wǎng)絡(luò)通信的時(shí)序圖大體上如下圖所示:(?讀者對詳細(xì)過程感興趣,可以閱讀?Github IBM-Blockchain/marbles?)
    其中,Peer 節(jié)點(diǎn)(對等節(jié)點(diǎn)) 存在于區(qū)塊鏈網(wǎng)絡(luò)中,擁有賬本并且可安裝鏈碼。Orderer 節(jié)點(diǎn)負(fù)責(zé)接收包含簽名的交易,對未打包的交易進(jìn)行排序生成區(qū)塊,廣播給 Peer 節(jié)點(diǎn)。


    上圖中:Client 以及 Server 是上文中所說的客戶端以及服務(wù)端。

  • 當(dāng)用戶創(chuàng)建或轉(zhuǎn)移彈珠時(shí),Client 客戶端觸發(fā)相應(yīng)事件,并向 Server 服務(wù)端發(fā)起請求。
  • Server 接收到事件信息后,首先會構(gòu)建提案(也就是交易),提案是將事件信息進(jìn)行封裝,比如:此次交易的兩方以及交易內(nèi)容是什么。
  • Server 將構(gòu)建好的提案發(fā)送給區(qū)塊鏈網(wǎng)絡(luò)中的一個(gè) Peer 節(jié)點(diǎn),由 Peer 節(jié)點(diǎn)來對提案進(jìn)行模擬,校驗(yàn)其合法性。為什么要這么做呢?因?yàn)殒湸a的作用就是處理交易邏輯,而鏈碼安裝在 Peer 節(jié)點(diǎn)上,并沒有安裝在 Server 上。
  • 如果 Peer 節(jié)點(diǎn)模擬提案成功,認(rèn)為其合法,則會對提案進(jìn)行背書,并向 Server 返回背書后的提案。背書可以理解為,當(dāng)我們?nèi)ベ徺I東西并忘記帶現(xiàn)金,付給對方一張?別人?給的支票。對方懷疑支票不可兌現(xiàn)的時(shí)候,我們在支票上簽字并表明若這張?他人?給的支票不能兌換,則可以來找我們要現(xiàn)金。這個(gè)簽字的動(dòng)作就是背書,聲明對事物或被認(rèn)可人的支持。
  • Server 將背書后的提案發(fā)送給 Orderer 節(jié)點(diǎn)。
  • Orderer 節(jié)點(diǎn)對提案進(jìn)行排序并打包進(jìn)區(qū)塊,將區(qū)塊廣播給區(qū)塊鏈網(wǎng)絡(luò)中的所有 Peer 節(jié)點(diǎn)。
  • Marbles 區(qū)塊鏈應(yīng)用結(jié)合函數(shù)計(jì)算進(jìn)行擴(kuò)展示例

    假設(shè)說,現(xiàn)在有這么一個(gè)業(yè)務(wù)場景,需要在每次 Marbles 應(yīng)用有事件發(fā)生時(shí),要對事件進(jìn)行相應(yīng)處理,且這部分的處理代碼會?經(jīng)常迭代?。那么,在區(qū)塊鏈應(yīng)用更新需要較多時(shí)間的情況下,通過函數(shù)計(jì)算來處理是較為方便的。(?具體緣由在下一節(jié)將會繼續(xù)探討?)

    接下來,筆者將帶著大家模擬這個(gè)業(yè)務(wù)場景,擴(kuò)展 Marbles Server 端代碼。在每次事件發(fā)生時(shí),將事件信息打包并通過函數(shù)計(jì)算的 HTTP 觸發(fā)器,由函數(shù)計(jì)算來對事件信息做相應(yīng)處理。

    1. 準(zhǔn)備工作

    開通阿里云日志服務(wù)、函數(shù)計(jì)算服務(wù)、區(qū)塊鏈服務(wù)

    2. 在阿里云區(qū)塊鏈服務(wù)中創(chuàng)建組織、創(chuàng)建聯(lián)盟

    3. 在阿里云區(qū)塊鏈服務(wù)中創(chuàng)建通道

    • 點(diǎn)擊相應(yīng)組織
    • 點(diǎn)擊通道
    • 點(diǎn)擊添加通道,填寫名稱與組織,并創(chuàng)建
    • 點(diǎn)擊新創(chuàng)建的通道右側(cè)的待審批鏈接,同意審批

    4. 部署 Marbles 應(yīng)用以及鏈碼

    參考?阿里云區(qū)塊鏈服務(wù)開發(fā)指南
    注意事項(xiàng):nodejs 版本為 v8

    5. 下載并配置阿里云函數(shù)計(jì)算開發(fā)工具 fun

    • fun 是一個(gè) Node.js 編寫的命令行工具,通過 npm 進(jìn)行安裝:$ npm install @alicloud/fun -g
    • 通過在命令行輸入?fun config,根據(jù)提示依次配置?Account ID、Access Key Id、Access Key Secret?以及?Default Region Name。可參考:服務(wù)地址?、?創(chuàng)建 AccessKey
    • 配置 template.yml

    在項(xiàng)目根目錄下創(chuàng)建一個(gè) template.yml 文件:

    ROSTemplateFormatVersion: '2015-09-01' Transform: 'Aliyun::Serverless-2018-04-03' Resources:marblesFC: # 服務(wù)名稱Type: 'Aliyun::Serverless::Service'Properties:Description: 'fc test'LogConfig: # 日志配置Project: test-log-project # 日志 ProjectLogstore: test-log-store # 日志 LogStoreprocessEvent: # 函數(shù)名Type: 'Aliyun::Serverless::Function'Properties:Handler: httpTrigger.handler # 文件名.方法名Runtime: nodejs8CodeUri: './'Timeout: 60Events:http-test: # 觸發(fā)器名Type: HTTP # 觸發(fā)器類型Properties:AuthType: ANONYMOUSMethods: ['GET', 'POST', 'PUT']test-log-project: # LogProject 名稱Type: 'Aliyun::Serverless::Log'Properties:Description: 'just for test'test-log-store: # LogStore 名稱Type: 'Aliyun::Serverless::Log::Logstore'Properties:TTL: 10ShardCount: 1

    上述文件做了如下事項(xiàng):

  • 在函數(shù)計(jì)算中創(chuàng)建了?marblesFC?服務(wù)
  • 為?marblesFC?服務(wù)配置了?test-log-project?日志 Project 以及?test-log-store?日志 LogStore
  • 在?marblesFC?服務(wù)中創(chuàng)建了?processEvent?函數(shù),并為其設(shè)置入口函數(shù)為?httpTrigger.js?文件中的?handler?方法
  • 為?processEvent?函數(shù)配置了 HTTP 觸發(fā)器,觸發(fā)器名為?http-test
  • 創(chuàng)建了?test-log-project?日志 Project 以及?test-log-store?日志 LogStore
    • 在項(xiàng)目根目錄下創(chuàng)建 httpTrigger.js 文件

    var getRawBody = require('raw-body') module.exports.handler = function (request, response, context) {// get request infogetRawBody(request, function (err, data) {var params = {path: request.path,queries: request.queries,headers: request.headers,method: request.method,body: data,url: request.url,clientIP: request.clientIP,}// you can deal with your own logic hereconsole.log(JSON.stringify(params.queries))// set responsevar respBody = new Buffer.from(JSON.stringify(params));// var respBody = new Buffer( )response.setStatusCode(200)response.setHeader('content-type', 'application/json')response.send(respBody)}) };
    • 在項(xiàng)目根目錄下執(zhí)行?fun deploy?進(jìn)行部署
    • 在阿里云函數(shù)計(jì)算控制臺中,進(jìn)入到?marblesFC?服務(wù)下的?processEvent?函數(shù),在代碼執(zhí)行頁面記錄下調(diào)用 HTTP 觸發(fā)器的地址

    6. 修改 Marbles Server 端代碼

  • 打開 Marbles 源代碼根目錄文件夾下的?app.js?文件
  • 添加?var https = require('https');?https模塊
  • 修改?setupWebSocket?函數(shù)
  • function setupWebSocket() {console.log('------------------------------------------ Websocket Up ------------------------------------------');wss = new ws.Server({ server: server }); // start the websocket nowwss.on('connection', function connection(ws) {// -- Process all websocket messages -- //ws.on('message', function incoming(message) {console.log(' ');console.log('-------------------------------- Incoming WS Msg --------------------------------');logger.debug('[ws] received ws msg:', message);var data = null;try {data = JSON.parse(message); // it better be json} catch (e) {logger.debug('[ws] message error', message, e.stack);}// --- [5] Process the ws message --- //if (data && data.type == 'setup') { // its a setup request, enter the setup codelogger.debug('[ws] setup message', data);startup_lib.setup_ws_steps(data); // <-- open startup_lib.js to view the rest of the start up code} else if (data) { // its a normal marble request, pass it to the lib for processinghttps.get("此處填寫觸發(fā) HTTP 觸發(fā)器的 URL 地址?type="+data.type, function(res){console.log('test http trigger');});ws_server.process_msg(ws, data); // <-- the interesting "blockchainy" code is this way (websocket_server_side.js)}});// log web socket errorsws.on('error', function (e) { logger.debug('[ws] error', e); });// log web socket connection disconnects (typically client closed browser)ws.on('close', function () { logger.debug('[ws] closed'); });// whenever someone connects, tell them our app's statews.send(JSON.stringify(ws_server.build_state_msg())); // tell client our app state});// --- Send a message to all connected clients --- //wss.broadcast = function broadcast(data) {var i = 0;wss.clients.forEach(function each(client) { // iter on each connectiontry {logger.debug('[ws] broadcasting to clients. ', (++i), data.msg);client.send(JSON.stringify(data)); // BAM, send the data} catch (e) {logger.debug('[ws] error broadcast ws', e);}});};ws_server.setup(wss, null);}

    7. 啟動(dòng) Marbles

    在控制臺中進(jìn)入 Marbles 項(xiàng)目,通過?gulp marbles_baas?啟動(dòng) Marbles 應(yīng)用

    8. 創(chuàng)建彈珠或轉(zhuǎn)移彈珠

    試著在瀏覽器中創(chuàng)建彈珠或者用鼠標(biāo)拖拽轉(zhuǎn)移彈珠

    9. 查看日志

    對 Marbles 應(yīng)用做了相應(yīng)操作后,進(jìn)入阿里云日志服務(wù)?test-log-project?Project 下的?test-log-store?LogStore,查看日志

    我們看到當(dāng) Marbles Server 接收到事件后,會觸發(fā) HTTP 觸發(fā)器,由函數(shù)計(jì)算 FC 來對事件做相應(yīng)處理。(?簡單起見,demo 的處理目前僅僅是記錄日志,讀者們可以自行擴(kuò)展?)

    區(qū)塊鏈應(yīng)用與函數(shù)計(jì)算在業(yè)務(wù)上結(jié)合的場景與價(jià)值探討

    通過制作上面的 demo,相信大家現(xiàn)在對于如何將區(qū)塊鏈應(yīng)用與函數(shù)計(jì)算相結(jié)合有了一定的認(rèn)識。接下來,就讓我們一起探討下,區(qū)塊鏈應(yīng)用與函數(shù)計(jì)算在業(yè)務(wù)上有哪些結(jié)合的場景與價(jià)值。

    下圖是最原始的 Fabric SDK 時(shí)序圖

    為了讓讀者方便理解,我們?nèi)耘f使用 Marbles 應(yīng)用的時(shí)序圖,讀者可以將 Marbles 應(yīng)用中的 Server 理解為 Fabric SDK 時(shí)序圖中的 Application,

    在筆者看來,函數(shù)計(jì)算可以與區(qū)塊鏈應(yīng)用相結(jié)合的場景主要有以下三點(diǎn):

    1. 處理事件

    處理事件的場景剛剛在 demo 中各位讀者想必已經(jīng)體驗(yàn)過了。那么,為什么筆者倡導(dǎo)用函數(shù)計(jì)算來處理事件呢?

    通過函數(shù)計(jì)算可以將每一次的事件進(jìn)行相應(yīng)的處理,處理完成后發(fā)送給日志服務(wù)。同時(shí),還可以在函數(shù)計(jì)算中設(shè)定定時(shí)觸發(fā)器,在指定時(shí)間內(nèi),再次統(tǒng)計(jì)事件的信息,由此對區(qū)塊鏈狀態(tài)進(jìn)行一個(gè)數(shù)據(jù)分析。

    而關(guān)于這種方式的統(tǒng)計(jì)邏輯,很有可能是需要經(jīng)常迭代的。因此,不適合將其邏輯放入?yún)^(qū)塊鏈應(yīng)用中,而是更適合放在小巧易迭代的函數(shù)計(jì)算場景中。

    2. 附加業(yè)務(wù)

    考慮一個(gè)這樣的場景:現(xiàn)在 X 公司推出了一款新的支付 App,為了鼓勵(lì)用戶使用該公司的 App,該公司對外宣傳當(dāng)用戶用該公司的 App 成功完成交易后,該公司會送大量優(yōu)惠券以及積分。若該 App 是一款區(qū)塊鏈應(yīng)用,那么把優(yōu)惠活動(dòng)的業(yè)務(wù)邏輯放在哪里最合適呢?

    筆者目前覺得是放在 Orderer 將交易打包成區(qū)塊并廣播的時(shí)候最合適,因?yàn)閮?yōu)惠活動(dòng)的業(yè)務(wù)邏輯是經(jīng)常會變化的,這類業(yè)務(wù)邏輯可以統(tǒng)稱為附加業(yè)務(wù),將附加業(yè)務(wù)抽象為一個(gè)個(gè)函數(shù)并放在函數(shù)計(jì)算中,容易更新迭代。

    3. 驗(yàn)證交易

    Peer 節(jié)點(diǎn)在模擬提案時(shí),若是有復(fù)雜多變的邏輯,可以放入函數(shù)計(jì)算中,由 Peer 節(jié)點(diǎn)來負(fù)責(zé)調(diào)用。

    以上三點(diǎn)就是筆者對于如何將區(qū)塊鏈服務(wù)與函數(shù)計(jì)算相結(jié)合的思考,有不準(zhǔn)確的地方,歡迎大家指出。


    原文鏈接
    本文為云棲社區(qū)原創(chuàng)內(nèi)容,未經(jīng)允許不得轉(zhuǎn)載。

    總結(jié)

    以上是生活随笔為你收集整理的二十分钟教你如何将区块链应用与函数计算相结合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。