FISCOBCOS2.0從發布起就自帶官方控制臺,經過社區持續使用打磨,已經足夠強大、完善、友好。社區還有用各種開發語言開發的區塊鏈應用,為滿足開發者方便管理區塊鏈節點的需求,目前Python-SDK和Nodejs-SDK已經上架,go語言版本已經在路上。
本文以筆者最熟悉的Python-SDK為例,分享一些SDK開發的點滴,涵蓋應用開發流程、協議編解碼、網絡通信和安全事項等。
FISCOBCOS自帶快速搭建特性,五分鐘一鍵搭鏈后,開發者只需連上區塊鏈節點,寫合約、發交易。
控制臺和SDK的定位,是幫助用戶快速訪問區塊鏈,開發測試智能合約,實現業務邏輯。根據“奧卡姆剃刀”原則,設計哲學應盡量輕、模塊化、淺層次,不引入多余的功能,不給用戶和二次開發者造成額外負擔。
客戶端控制臺和SDK就像一輛操控好、配置精的快車,供開發者和用戶駕馭,輕松愜意,盡情馳騁于區塊鏈應用之路。
控制臺體驗
首先結合從準備環境到調用合約的全流程,體驗下控制臺,命令行交互界面風格如下:
1.準備環境:
在開始之前,請先通讀使用手冊和開發文檔,根據文檔介紹,stepbystep初始化環境,安裝依賴庫,目前Python-SDK支持linux/mac/windows操作系統。
為了連上區塊鏈節點,需要修改本地配置文件,填寫區塊鏈節點的對應網絡端口,如果選擇Channel協議,則需要配置相應的客戶端證書。
2.在線體驗:
配置好網絡后,可以運行console的get系列命令。試下手感,與FISCOBCOS親密接觸。確認鏈在正常工作,常用的指令有getNodeVersion、getBlockNumber、getPeers、getSyncStatus等,可以用console的usage或help命令了解所有支持的指令。
3.創建賬戶:
創建一個新的帳戶,即代表自己身份的公私鑰對,發送交易時會采用私鑰簽名。創建的帳戶用keystore格式保存在本地文件系統里,用戶可以設定密碼保護這個文件,注意記住創建帳戶時使用的密碼。
控制臺提供的帳戶相關命令是newaccount,showaccount。如果要使用剛創建的新帳戶為交易簽名,記得把它配置到client_config.py文件的相應位置。
數據:自2月13日以來投資者已從Paxos贖回約67億美元BUSD:金色財經報道,數據顯示,截至發稿時,Paxos發行的穩定幣Binance USD(BUSD)流通供應量約為95億美元,創2021年6月以來新低。此外,據加密情報公司Nansen數據顯示,自今年2月13日以來,投資者已從Paxos贖回了約67億美元的BUSD。
此前報道,Paxos于2月13日宣布將停止鑄造新的BUSD代幣,美國證券交易委員會(SEC)準備起訴Paxos提供未注冊證券。Coinbase此前宣布,將從3月13日開始暫停平臺上的BUSD交易。[2023/3/4 12:41:53]
另外,如果賬戶信息需要高等級保護,則可以進行二次開發。將其放入加密機、TEE等安全區,以及開發秘鑰分片、助記詞等方案。
4.編寫合約:
編寫一個智能合約,或者參照SDK里自帶的智能合約例子修改定制,實現自己的業務邏輯。本文重點關注solidity智能合約,FISCOBCOS還有一種“預編譯合約”,采用C開發,需要和FISCOBCOS底層代碼聯合編譯。
5.編譯部署:
對合約進行編譯,獲得合約的ABI接口文件和BIN二進制代碼文件。Python-SDK里有bcos_solc.py文件可幫助開發者簡化編譯器配置和調用,同時,只要正確配置了合約路徑和編譯器路徑信息,直接運行控制臺的部署或調用合約接口指令,也會嘗試自動去編譯合約,操作體驗相當行云流水。
獨立部署合約的話,可使用控制臺的deploy指令,部署指令成功后會得到新的合約地址。參考命令是./console.pydeploySimpleInfosave,其中SimpleInfo是合約名,最后的"save"為可選,如果指定了"save",則將合約新地址記錄到本地文件里,以便后續使用。
6.調用合約:
用call或sendtx命令,指定合約名、合約地址、方法名、對應的參數,調用鏈上合約。
參考命令./console.pysendtxSimpleInfolastsetbalance100,即選擇SimpleInfo合約,指向其最近部署成功的地址,調用setbalance接口,傳入參數100。
交易在鏈上共識完成后,控制臺會自動打印交易回執里的方法返回碼、交易Eventlog信息列表等,供用戶查看,如果錯誤,則打印異常信息。
KCC Bridge支持將MATIC等代幣從Polygon跨鏈至KCC:12月30日,據官方消息,KCC Bridge現在支持將代幣從Polygon轉移到KCC主網,支持的資產包括USDT、USDC、ETH、MATIC。[2021/12/30 8:14:09]
如果一切正常,到此即可基本走通區塊鏈應用之路。
值得一提的是,FISCOBCOS幾個語言版本的控制臺,都支持按Tab鍵提示指令和自動完成,幫助使用者流暢無錯地操作,提升用戶體驗。
再進一步,如果希望有豐富多彩的、可視化交互式頁面體驗,不妨使用WeBASE中間件平臺。
深入了解
整個SDK的模塊組合如下,可謂是麻雀雖小五臟俱全。
功能接口
支撐控制臺等交互模塊的,是已經封裝完備、開箱即用的功能接口API,包括:
1.get系列:
諸多的“get”開頭的接口,用于獲取鏈上的各種信息,包括區塊、交易、回執、狀態、系統信息等等。雖然幾十個get接口,但其實現邏輯基本一致,都是指定命令字和參數列表,請求和處理回應,實現起來也很快。
2.call:
對應合約的常量方法。所謂常量方法,是指合約里對應代碼不修改狀態,該請求不會全網廣播,僅在指定節點上運行。
3.sendRawTransaction:
構建一個交易,用賬戶私鑰簽名,發送到鏈上,這種交易會被廣播,進行共識處理,生成的狀態數據會被全網確認。部署新合約這個操作,實際上也是一種交易,只是不需要指定目標合約地址。
相關的是sendRawTransactionGetReceipt,名字很長,在sendRawTransaction基礎上增加了獲取回執的流程,用于簡化從發交易到獲取回執的閉環流程。
4.更多:
針對FISCOBCOS的全局系統配置、節點管理、CNS、權限等系統級功能的API,其原理是讀寫鏈上的系統合約,詳細指令列表見文末。
開發者可以參考控制臺和client/bcosclient.py等代碼,進行二次開發,實現更多更酷炫的功能。另外,SDK里內置了一系列的開發庫和小工具,幫助管理帳戶、輸出日志、統一異常處理、簡單的性能和耗時統計等。
Zcash開發公司ECC:考慮將Zcash從PoW轉向PoS機制:官方消息,Zcash(ZEC)開發公司ElectricCoinCompany(ECC)發文“Zcash應該從工作量證明轉向權益證明嗎?”,稱考慮將Zcash從工作量證明(PoW)轉向權益證明(PoS)機制。因為目前在PoW中,礦工必須出售他們的挖礦產出來覆蓋成本(電費和ASIC礦機成本),這造成ZEC的價格有持續的下行壓力,過去一年時間里就產生了約1億美元的拋壓。而在PoS中,大家可以保留ZEC用于Staking,從而成為長期投資者,同時也能以更低的成本提供更好的安全性和性能。[2021/8/4 1:34:00]
合約開發相關
圍繞著合約開發,Python-SDK實現了合約編譯部署、合約地址本地化管理、ABI接口文件的管理,支持代碼自動生成,一個命令行即可生成供業務端直接使用的代碼,如
pythoncodegen.pycontracts/SimpleInfo.abi。
solidity合約編譯后的ABI文件是個好東西。ABI全稱是ApplicationBinaryInterface,里面詳細描述了合約的接口信息,包括方法名、參數列表和類型、方法類型,以及Eventlog格式定義等等。
對ABI的管理,參見client/datatype_parser.py,加載和解析ABI文件,根據方法名、方法4字節簽名、方法類型等維度,靈活查詢方法列表和方法定義,并針對方法定義、輸入數據等進行編碼解碼,解析交易返回值、Eventlogs等。
有ABI定義在手,對合約的操控簡直是可以隨心所欲,開發者讀懂了ABI描述,基本就能全面理解一個合約的輸入輸出,和合約毫無障礙地對話,這種“面向遠程接口編程”的思想,很類似WSDL、IDL、ACE、ProtoBuffer和gRPC等經典軟件設計。
事實上,整個SDK中最繁瑣的是ABI編解碼部分,為了兼容EVM,FISCOBCOS在交易處理時沿用了ABI編碼,以及兼容RLP協議。
ABI、RLP制定了嚴格的規范,對基礎數據類型、數組和變長數據、函數方法、參數列表等都有特定的編解碼方式,否則組件之間無法通信,數據無法解析,虛擬機“不認識”所輸入的交易,則不能執行合約。
如果自行手寫這里的編解碼,即使是熟手也得花不少時間,還要能保證測試通過、保持版本兼容,所幸github上已經有eth-abi、eth-utils、rlp等一系列開源項目,可以引入這些項目且根據具體的需要進行修訂,能節約不少工作量,向這些項目作者們致謝,開源就是爽!
2.8億枚TRX從Poloniex交易所轉出,價值1177.7萬美元:據Whale Alert數據顯示,北京時間09月04日15:19, 2.8億枚TRX從Poloniex交易所轉入TLoxh9開頭地址,按當前價格計算,價值約1177.7萬美元,交易哈希為:8d0dadb8e67b3aa8b0b7b1c3bda2a0425d1c17bb83022c904ff48200f557dc27。[2020/9/4]
交易數據結構相關
在搞定了基礎編解碼之外,還需要實現FISCOBCOS交易結構,重點注意支持并行處理交易增加的randomid、blocklimit字段,為支持群組特性增加的fiscoChainId和groupId字段,在交易的receipt里增加的交易output等。
其中,交易的blocklimit定義為“交易生命周期,該交易最晚被處理的塊高”,SDK需要定期到鏈上查詢當前塊高,以確定當前交易的生命周期。
對于開發者來說,清晰理解交易的輸入、交易回執、交易輸出(tx.output)是非常重要的。
交易調用合約里的某一個方法時,首先將方法名字和參數類型列表組合,如'set(string,uint256,address)',對這一段文本進行Keccak-256(SHA-3)計算,并截取前4個字節做為“方法簽名”,然后對傳入的參數,根據類型定義依次進行ABI編碼,并和"方法簽名"拼接一串二進制數據,做為交易的輸入數據。
和交易結構體的其他字段一起再進行RLP編碼,并用帳戶私鑰進行簽名,得到一段二進制請求數據,由sendRawTransaction發往節點,節點收到后,立刻返回交易Hash給到客戶端。
交易在鏈上被網絡共識確認,處理完成后,通過getTransactionReceipt接口,可以獲得交易處理的詳細結果。
在交易回執中,以下幾個字段尤為關鍵:
1.contractAddress:
僅在部署合約交易時有效,表示新合約的地址。
2.output:
對應方法的return值,可用于判斷業務邏輯的最終處理結果。
3.Logs:
如果在合約代碼里,寫了一些Eventlog,則receipt的logs字段里可以解碼出詳細的信息。Eventlog可用于幫助客戶端監聽、跟蹤交易的處理結果,甚至可以幫助開發者調試合約執行過程,相當于在合約里打調試日志。當然,在合約正式發布時,應清除調試的Eventlog,只保留必要的log,避免冗余信息存到鏈上。
動態 | 5000萬枚USDT從Poloniex交易所轉入Tether Treasury錢包,價值4960萬美元:北京時間07月14日02:20,5000萬枚USDT從Poloniex交易所轉入Tether Treasury錢包,按當前價格計算,價值約4960萬美元,交易哈希為:5f4aed993b7b431025926db5eb0d151c778cb15b41ae7c6e58bf09c0abfc9e74。[2019/7/14]
Python-SDK客戶端里內置了解析“方法簽名”、交易input/output、receipt.logs等字段的方法。
在使用控制臺命令行時,只要是查詢交易和回執的指令,在命令行后面附帶合約名,也可以自動解析出相關的數據來,例如:./console.pygetTransactionReceipt0x79b98dbb56d2eea289f756e212d5b6e5c08960beaa8ea8331740fdcfaa8dcab1SimpleInfo,最后這個“SimpleInfo”為可選合約名,不需要帶后綴,要求在contracts/目錄下有SimpleInfo.sol文件。
這個貼心小設計,可以幫助開發者直觀探秘區塊鏈交易的脈絡,對各種信息一目了然,不會迷失在天書一樣的十六進制字符海洋里。
網絡協議
最后聊聊FISCOBCOS的兩種網絡協議:JSONRPC和Channel長連接。
JSONRPC連接沒有證書驗證和通信加密,建議在本身安全可信的環境里使用,比如本機或內網,一般用于運維管理和統計分析場合。
JSONRPC的格式相當簡單通用,各種語言庫都內置了JSON編解碼以及HTTP請求協議實現,一般不需要自行開發,甚至可以采用curl、telnet等工具進行收發,如:
//Requestcurl-XPOST--data'{"jsonrpc":"2.0","method":"getBlockNumber","params":,"id":1}'http://127.0.0.1:8545|jq//Result{"id":1,"jsonrpc":"2.0","result":"0x1"}
Channel協議是FISCOBCOS獨有的協議,Channel協議的特點是安全高效,支持雙向實時通信,可用于遠程調用乃至公網的通信。
如果使用Channel長連接方式,則需要從區塊鏈節點上獲取SDK證書,放置到SDK項目的對應路徑下,證書詳見文末。
這個協議的數據包格式示意圖如下,是一種TLV(Tag/Length/Value)風格的擴展實現:
格式說明:
所有整形數編碼都是網絡序,大端;
Length實際上包含了從第一個字段到最后一個字段的整個數據包的長度;
包頭為定長,為(42324)=42字節;
數據體的實際長度根據具體內容而變,字節數為Length-42字節。
Channel長連接通信和數據收發的要點如下:
采用TLSv1.2安全傳輸,SDK和節點之間需要加載證書,用證書握手、驗證后才能建立長連接。
長連接用心跳包維護,需要定期發起心跳包。
數據按包為單位,編碼成流數據傳輸,那么在收發數據時,需要持續從socket流里獲取數據,按照數據包的格式,判斷長度是否合法,數據是否收全,是否能正確的解析,對“部分收取”的數據,要保留在接受緩沖區里,待收取完成后再進行解析,不能丟棄,否則可能導致解析錯誤。
Channel協議支持雙向通信,SDK可以主動請求節點,節點也可能往SDK推送消息,如區塊鏈系統通知、數據更新通知、AMOP跨機構消息等。
設計異步的、隊列化、回調式消息處理機制,根據消息的序列號、指令類型、狀態碼等維度,正確處理消息。Python-SDK用了多線程以及Promise庫,以盡量高速優雅地處理各種消息。
對socke流數據編程有一定經驗的開發者,理解這個協議和實現它并不會很難。對Channel協議實現,數據包解析參見client/channelpack.py,通信和數據收發參見client/channelhandler.py。
總結
Python-SDK的開發始于今年6月中旬,寫出第一個可用版本只花了一個星期,然后雕琢用戶交互細節,以及進行代碼優化、文檔完善,并進行多輪測試保證質量,團隊其他同學實現Nodejs版本SDK的用時也差不多。
總的來說,在有一些基礎代碼參考的前提下,開發一個FISCOBCOS特定語言版本SDK,還是挺敏捷寫意的事情,一點兒也不難,Justforfun。
在各語言版本SDK開發和迭代過程中,FISCOBCOS團隊和社區開發者一直保持溝通交流,納入優質pullrequest,在體驗中持續優化。
歡迎社區開發者根據自身使用場景的實際情況,繼續完善現有SDK,或貢獻更多語言類型的FISCOBCOSSDK,幫助更多開發者順暢地走在區塊鏈之路上。
最后,感謝杰哥、安總、小白、wheat等同學,以及多位社區開發者對Python-SDK的重要貢獻。
參考資料
FISCOBCOS官方控制臺:
https://github.com/FISCO-BCOS/console
Python-SDK:
https://github.com/FISCO-BCOS/python-sdk
Nodejs-SDK:
https://github.com/FISCO-BCOS/nodejs-sdk
FISCOBCOS安裝:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/latest/docs/installation.html#fisco-bcos
合約開發教程:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/release-2.0/docs/manual/smart_contract.html
WeBASE:
https://fintech.webank.com/webase
ABI:
https://solidity.readthedocs.io/en/latest/abi-spec.html
RLP:
https://github.com/ethereum/wiki/wiki/RLP
交易數據結構:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/release-2.0/docs/design/protocol_description.html
RPC原理:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/release-2.0/docs/design/rpc.html
Channel協議定義:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/release-2.0/docs/design/protocol_description.html#channelmessage-v1
SDK證書:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/release-2.0/docs/manual/certificates.html
AMOP跨機構:
https://fisco-bcos-documentation.readthedocs.io/zh_CN/release-2.0/docs/manual/amop_protocol.html
尊敬的WBFex用戶: WBFex即將上線ECCC,并在開放區上線ECCC/USDT的交易對,具體情況如下:充值時間:2019/08/2014:00交易時間:2019/08/2017:00提幣時.
1900/1/1 0:00:00BTC看漲期權 代碼周BTC看漲0828期權標的BTC合約類型歐式看漲期權計價單位USDT最小價格單位0.0001USDT合約比例1000:1.
1900/1/1 0:00:00近年來,各主要國家和地區央行及貨幣當局均在對發行央行數字貨幣開展研究,新加坡央行和瑞典央行等已經開始進行相關試驗,人民銀行也在組織進行積極探索和研究.
1900/1/1 0:00:00周報摘要 上周全球數字貨幣資產日均市值為2768.73億美元,下跌8.53%,日均交易量547.70億美元,下跌10.22%。上周市值TOP200資產整體下跌7.71%,四大領域全部下跌.
1900/1/1 0:00:00尊敬的LOEx用戶: LOEx交易所即將首發上線UCU,并開放UCU/USDT、UCU/LCNY的交易對,具體時間如下:LOEx于新加坡時間8月26日15:00開放UCU充提幣業務.
1900/1/1 0:00:00尊敬的用戶: 由火幣全球站發起的第七期FastTrack,已于新加坡時間8月21日21:00:00結束,本輪投票共計56,965,823HT票,經過后臺數據處理,已確認所有投票數據有效.
1900/1/1 0:00:00