如何快速構建區塊鏈應用?這款腳手架支持一鍵生成

2021-04-22 18:04:10

在數字化、信息化的今天,區塊鏈技術已經逐步走入各行各業。為了滿足普適性的要求,區塊鏈的應用开發理應更加簡單順手。但是我們發現目前區塊鏈應用开發仍然存在着一定門檻,社區中不斷湧現的疑問便是體現之一。

  • 如何配置私鑰和證書?

  • 怎么訪問區塊鏈節點?

  • SDK的接口怎么用?

  • 如何構建一筆交易?

  • 怎么解析交易回執?

    ……

來自开發者的疑問各式各樣,但如果开發者一直在處理這些問題,則會帶來大量的時間开銷,影響業務开發的進展。一門成熟的技術,應不斷將重復的細節封裝起來,讓开發人員更加聚焦業務,提升業務快速上线、快速試錯和快速迭代的效率。

微衆銀行自2015年深耕區塊鏈,在技術攻關和應用开發上積攢了豐富的經驗。為了讓开發者能夠在自己的業務中輕松引入區塊鏈技術,微衆銀行區塊鏈开發了區塊鏈應用开發組件WeBankBlockchain-SmartDev。其所包含的子組件——區塊鏈應用开發腳手架WebankBlockchain-SmartDev-Scaffold,更是通過一鍵生成應用項目,幫助开發者敏捷、高效地开發區塊鏈應用。

  應用开發腳手架簡介

一個典型的區塊鏈應用項目後端,可以分為三塊。業務邏輯部分由用戶自行定義;代碼部分包含了智能合約訪問的功能,例如函數入參的封裝、交易的構造和推送、鏈的訪問等;資源部分則包含了合約、ABI、BIN。如下圖所示:

如何快速構建區塊鏈應用?這款腳手架支持一鍵生成

應用开發腳手架組件允許用戶在寫好智能合約的基礎上,將智能合約轉換為一個SpringBoot項目,這個項目已經涵蓋了上圖中藍色和綠色的部分,用戶只需要補充自己的業務邏輯即可,不必再去關心區塊鏈訪問的細節,大大縮短了开發時間。

  關鍵特性一覽

一鍵生成

用戶在开發完智能合約後,可以將智能合約直接拖入腳手架,只要輕量配置,就可以生成相關項目。並且,生成的項目已經包含了智能合約訪問的必要邏輯。此外,該項目是SpringBoot項目,相關的配置、服務均已納入到spring容器當中。

高度封裝

腳手架在生成項目時,會對合約調用邏輯做高度的封裝,用戶可以像使用ORM框架操作數據庫一樣地操作智能合約。

在生成的項目中,每個合約都被單獨封裝到一個類中,每個函數對應合約的一個函數。其輸入是java類型的輸入,輸出也是已解析的輸出。此外,對於函數的輸入參數,我們也已生成了相關的模型類,方便用戶使用。

輕量配置

用戶在將智能合約拖入腳手架後,只需做少量的涉及項目名稱、組名、合約選擇器等內容的配置即可。而且這些配置依據“契約優於配置”的原則設置了默認值,用戶可根據自己的實際需要進行調整。

合約可選

在开發具有一定復雜度的智能合約時,出於易升級、松耦合的目的,开發者通常會採用一定的手段將合約功能解耦,拆散到不同的合約中去。所以,在一組智能合約中,真正供外部訪問的合約只佔少數,多數合約都僅作為功能性合約來支撐整體業務。

而且,在後續應用开發時,真正需要开發的服務類也佔少數。為了讓項目聚焦在所需要的合約上,开發者可配置合約選擇器,即指定所需要處理的合約,繼而腳手架只會為這些合約生成相應的代碼,避免了冗余代碼。

  如何使用

下面給一個簡單的例子,以說明腳手架的使用方法。

獲取腳手架

從gihtub或gitee獲取腳手架,以github為例:

git clone https://github.com/WeBankBlockchain/SmartDev-Scaffold.gitcd tools

進入tools目錄後,可以看到它的結構:

|--tools |  |--contracts |  |--|HelloWorld.sol |  |--config.ini|  |--run.sh

其中:

  • contracts目錄用於存放solidity合約文件,腳手架後續會讀取該目錄下的合約,以生成相對應的業務工程。可刪除該目錄下的默認合約,並將自己的業務合約拷貝到該目錄下。

  • config.ini是啓動相關配置。

  • run.sh是啓動腳本。

配置腳手架

合約配置

本示例中,使用默認的HelloWorld合約。實際使用過程中,可刪除contracts目錄下的默認合約,並將自己的業務合約拷貝到該目錄下。

項目配置

可以在config.ini中做項目配置,如下:

### 項目名稱artifact=demo### 組名稱group=org.example### 所支持的合約列表,通常為空即可selector=

運行腳手架

直接啓動腳本:

chmod +x run.sh bash run.sh

運行成功後,會在tools目錄下得到一個基於SpringBoot的項目工程,本示例是demo:

|--tools |  |--demo ## 這是新生成的工程|  |--contracts
.├── build.gradle├── gradle│   └── wrapper│       ├── gradle-wrapper.jar│       └── gradle-wrapper.properties├── settings.gradle└── src    ├── main    │   ├── contracts    │   │   └── HelloWorld.sol    │   ├── java    │   │   └── org    │   │       └── example    │   │           └── demo    │   │               ├── Application.java    │   │               ├── config    │   │               │   ├── ContractConfig.java    │   │               │   ├── SdkBeanConfig.java    │   │               │   └── SystemConfig.java    │   │               ├── model    │   │               │   ├── CommonResponse.java    │   │               │   └── bo    │   │               │       └── HelloWorldSetInputBO.java    │   │               ├── service    │   │               │   └── HelloWorldService.java    │   │               └── utils    │   │                   └── IOUtil.java    │   └── resources    │       ├── abi    │       │   └── HelloWorld.abi    │       ├── application.properties    │       ├── bin    │       │   ├── ecc    │       │   │   └── HelloWorld.bin    │       │   └── sm    │       │       └── HelloWorld.bin    │       └── conf    └── test        └── java            ├── org            │   └── example            │       └── demo            │           └── DemoPkey.java            └── org.example.demo

其中:

  • config目錄包含了Bean配置類。

  • service目錄中包含了智能合約訪問類,一個類對應一個合約。

  • bo目錄包含了合約函數輸入參數的封裝POJO類。

  • src/main/resource/conf目錄用於存放證書信息。

應用开發

生成項目工程後,可以進行DAPP开發。下面以前文所提及的demo項目工程為例進行說明。

部署合約

使用控制臺等方式部署HelloWorld合約,可得到它的地址。

證書拷貝

將配置文件拷貝到生成工程的conf目錄或src/main/resources/conf目錄下。該業務工程會自動在這些路徑下搜索證書。

配置連接節點

修改application.properties時,填寫如下信息:

system.peers=127.0.0.1:20200system.groupId=1system.certPath=src/main/resources/conf### 前述合約部署地址system.contract.helloWorldAddress=### 私鑰明文,如為空,會自動生成一個system.hexPrivateKey=server.port=8080

補全業務處理邏輯

一個完整的DAPP應包含至少三層架構。本示例補全一個Controller。但需說明的是,它僅僅是展示交易的結果。示例如下:

@RestController@RequestMapping("hello")public class HelloController {    @Autowired    private HelloWorldService service;    @GetMapping("set")    public String set(@RequestParam("n") String n) throws Exception{        HelloWorldSetInputBO input = new HelloWorldSetInputBO(n);        return service.set(input).getTransactionReceipt().getTransactionHash();    }    @GetMapping("get")    public String get() throws Exception{        return service.get().getValues();    }}

編譯工程

進入目錄後,執行編譯:

cd demogradle build -x test

運行jar包

啓動項目後,可在瀏覽器內輸入:

http://127.0.0.1:8080/hello/set?n=hello

返回示例:

0x1c8b283daef12b38632e8a6b8fe4d798e053feb5128d9eaf2be77c324645763b

  即刻使用

上述相關代碼和技術文檔已更新,歡迎體驗和 star 支持。如需咨詢技術問題,歡迎關注本公衆號,對話框回復【小助手】進技術交流群。

文檔地址:

https://smartdev-doc.readthedocs.io/zh_CN/latest/docs/WeBankBlockchain-SmartDev-Scaffold/index.html

github代碼庫地址:

https://github.com/WeBankBlockchain/SmartDev-Scaffold 

gitee代碼庫地址:

https://gitee.com/WeBankBlockchain/SmartDev-Scaffold

歡迎參與WeBankBlockchain的社區建設:

  • 如項目對您有幫助,歡迎點亮我們的小星星(點擊項目左上方Star按鈕)。

  • 歡迎提交代碼(Pull requests)。

  • 提問和提交BUG。

  • 如果發現代碼存在安全漏洞,可通過以下地址

    https://security.webank.com/上報。

鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播信息之目的,不構成任何投資建議,如有侵權行為,請第一時間聯絡我們修改或刪除,多謝。

推薦文章

btc日內再次下跌 短线應當如何處理?

盡管以太坊現貨ETF獲批是個好消息,但市場反應卻不如預期。在消息公布後,以太坊價格出現了小幅下跌,...

加密蓮
185 5個月前

7月23日、BTC(合約)ETH(合約)行情分析及操作策略

昨日收益還是不錯的,日內給出的現價空單分別止盈我們目標點位,恭喜跟上的朋友喫肉。時間一晃到月底了,...

倪老師
184 5個月前

幣圈院士:血與淚的教訓!交易者為何總是撞死在同一棵樹上?

幣圈院士談。交易市場中的幾種“死法” 在幣圈市場鱗次櫛比的海洋,風起雲湧,時常讓人感到驚手不及。在...

幣圈院士
192 5個月前

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC

7月23:Mt. Gox 比特幣錢包在市場緊縮的情況下轉移了價值 28.2 億美元的 BTC一個引...

168超神
189 5個月前

悅盈:比特幣68000的空完美落地反彈繼續看跌 以太坊破前高看回撤

一個人的自律中,藏着無限的可能性,你自律的程度,決定着你人生的高度。 人生沒有近路可走,但你走的每...

我是周悅盈
164 5個月前

btc完美盈利 晚間波動較大注意

昨日btc空單完美給到,最大化走出一千七百點空間~ btc: 日內开盤下跌繼續測試66000一线,...

加密蓮
173 5個月前