sb版 java后端(spring boot)應用Conflux-java-嘗試鏈接Conflux實錄
能點進這里的我就默認知道conflux是什么了(一個DAG型的高性能低成本區塊鏈)
前排提示:建議chorme瀏覽器先下一個錢包,然后至少有個賬戶有點CFX代幣,testnet的也行,不然有的地方會報錯或沒引數寫
前排提示2:Dapp都需要一個服務器,nodejs+JavaScript開發的話,向用戶發送前端用戶資料即可上鏈,去中心化程度更高,java開發的話上鏈操作也是后臺在做,去中心化程度降低,主要勝在java后端的應用相對比其他語言更普遍,所以用java還是js是很大的區別,建議先考慮清楚
1.Java-conflux-JDK 參考
先下載依賴包,建議用maven專案,在pom的dependencies中加入conflux包的參考
參考地址如下:
https://search.maven.org/search?q=conflux
點擊版本號,跳轉頁面如下
https://search.maven.org/artifact/io.github.conflux-chain/conflux.web3j/1.0.4/jar
頁面右側Apache Maven框中代碼復制進自己spring boot專案 pom的dependencies中重繪即可呼叫conflux包的參考
2.test測驗學習和conflux區塊鏈的互動
如下網站有JDK開發者貼出的使用代碼,可以在boot專案test中看情況復制實驗
https://github.com/Conflux-Chain/java-conflux-sdk
檔案中的示范代碼有些未說明的細節或小錯誤,包括:
1)測驗–查看現有epoch中url引數錯誤,可能報錯RPC鏈接錯誤,下文鏈接有很多url,對應不同網路,一般建議學習用test先
https://github.com/conflux-fans/conflux-rpc-endpoints
我用的鏈接:http://testnet.cfxchain.xyz:12537/rpc/
2)有些類不知道在哪里,介紹也比較模糊,建議IDE直接ctrl+方法or類名,比如 RawTransaction類,ctrl+呼叫其的test_addtrss ,看到函式原型,再點引數就可看到類原型
3)有個引數是“password”,這個 AccountManager.import(privateKey, password);需要密碼,這里是 chorme錢包插件的開啟密碼
- 一個很重要的應用就是事件監聽,比如我寫了個智能合約,希望新區塊如果是呼叫了我的合約,我后臺可以自動更新內容到資料庫,對用戶進行選擇性推送而不是區塊鏈合約呼叫資訊不排序直接混亂全推(雖然目前最大的問題就是監聽不知道怎么保活,,,)
? 總結一下事件監聽的概念,更詳細的建議看這個鏈接https://segmentfault.com/a/1190000013240470
? 分為三個部件----事件源(被監聽物件),事件event(封裝事件源和動作),開發人員撰寫的監聽器物件
? 很明顯,事件源是一個物體類,呼叫方法的時候發出event類;事實上,事件源本身一般包含監聽器,而監聽器本事只是介面,監聽到物件后再實體化介面的操作,上一個網住中核心的例子代碼如下
public static void main(String[] args) {
// 事件源,有 PersonListener 監聽器,兩個動作,呼叫 PersonListener的 兩個動作(因為是介面,現在只是空,引數為event)
Person person = new Person();
// 注冊監聽器(),person中這個函式只是 this.personListener = personListener;
// 可以看到只是介面的 personListener 這里用lambda的方式,多載介面,實體化介面方法
person.registerLister(new PersonListener() {
@Override
public void doEat(Event event) {
Person person1 = event.getResource();
System.out.println(person1 + "正在吃飯呢!");
}
@Override
public void doSleep(Event event) {
Person person1 = event.getResource();
System.out.println(person1 + "正在睡覺呢!");
}
});
//當呼叫eat方法時,觸發事件(呼叫person內含doEat函式+執行上述lambda行為)
//將事件物件傳遞給監聽器,最后監聽器獲得事件源,對事件源進行操作
person.Eat();
// 綜上,事件源保存監聽器介面,對事件的編程應該在于lambda實體化監聽器介面
}
3.轉賬函式+呼叫"查"(view和pure)型合約+“增or改”型合約實體
本實驗是用spring boot的測驗,class掛上@component放入容器,函式掛上@test
3.1 轉賬
// 出錢人
public static String confluxWalletAddress = "0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f";
@Test
void ConfluxBase_and_Transact() throws Exception {
// 確定基礎引數 公鑰私鑰和密碼,密碼不能亂寫!必須是瀏覽器conflux錢包插件的密碼!!
int testNetId = 1;
// 出錢人私鑰
String privateKey = "0x2e0d3e928841568bcfcc2eaa5bf2424321abe3ae6ac2bdfea6786b659e2e5d51";
String password = "c45521669";
// 出錢人公鑰
String publickKey = "0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f";
// Address 封裝的物件可以用 getABIAddress()獲取被封裝賬號的公鑰地址
Address test_address = new Address(publickKey, testNetId);
// initialize an accountManager
Cfx cfx = Cfx.create("http://testnet.cfxchain.xyz:12537/rpc/ ", 3, 1000);
AccountManager am = new AccountManager(testNetId);
// import private key
am.imports(privateKey, password);
// 整合一個賬戶資訊,是條鏈,插件密碼和公私鑰
Account account = Account.unlock(cfx,am,test_address,password);
// 還有一種封印的account函式,詳見上文jdk鏈接
// 嘗試發送部分代幣
// 1.建立交易資訊 2.私鑰簽名 3.發送給本地或公用節點
// 交易值,前面10進制字串,單位為drip!!=10^-18 個cfx
BigInteger value = new BigInteger("1000000", 10);
// 創建交易,引數發送者地址
TransactionBuilder txBuilder = new TransactionBuilder(test_address);
// 引數--鏈號!!容易遺忘,報bug:chainIdMissed
txBuilder.withChainId(testNetId);
// 引數 接收地址和鏈號
Address receiverAddress = new Address("0x173329e2a911b3849bf41e65c807ceaefa2b11d1",testNetId);
// 設定接收者的地址
txBuilder.withTo(receiverAddress);
// 交易值確認,型別為biginteger
txBuilder.withValue(value);
// 根據之前的交易資訊實體化交易
RawTransaction rawTx = txBuilder.build(cfx);
// // 交易上傳區塊鏈,完成流程,收到確認區塊地址哈希
//這種上傳包括加密簽名和發送
// SendTransactionResult result = account.send(rawTx);
// System.out.println(result.getTxHash());
// 也可以分開,先加密簽名,再傳送
String hexEncodedTx = account.sign(rawTx);
String txHash = cfx.sendRawTransaction(hexEncodedTx).sendAndGet();
System.out.println(txHash);
System.out.println("###############################");
}
3.2 使用view型別合約函式的函式呼叫實體:
不需要個人地址
@Test
void Call_contract_methods(){
// 建立鏈接
Cfx cfx = Cfx.create("https://testnet-rpc.conflux-chain.org.cn/v2",3, 1000);
// 建立合約鏈接物件!!地址0x8開頭
ContractCall contract = new ContractCall(cfx, new Address("0x8284e5a2087628d3a278d2336cdc883d2a98b032", 1));
// passing method name and parameter to `contract.call`
// note: parameters should use web3j.abi.datatypes type
// 這里引數又幾個要注意的地方
// 1.有的view函式沒有引數需要輸入,如下即可實作合約呼叫回傳值
// call第一個引數是合約寫的方法名,區分大小寫,這里是顯示合約布置者的函式,沒有上傳引數
String amount = contract.call("minter").sendAndGet();
System.out.print("contract minter: ");
System.out.println(amount);
// 2.有引數的view,這里函式balanceOf是指定用戶資訊查詢余額函式,第二個或后面對應引數加上即可
// 所有引數參考 conflux.web3j.abi.datatypes,不建議java自帶格式
// String amount = contract.call("balanceOf", new Address("0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f", 1).getABIAddress()).sendAndGet();
// BigInteger balance = DecodeUtil.decode(amount, Uint256.class);
// System.out.print("account balance: ");
// System.out.println(balance);
}
3.3 呼叫存盤資料或更改資料合約函式實體:
需要發動者個人私鑰公鑰
@Test
void Update_Contract_state() throws Exception {
// 呼叫者私鑰
String privateKey = "0x2e0d3e928841568bcfcc2eaa5bf2424321abe3ae6ac2bdfea6786b659e2e5d51";
int netId = 1;
// 合約地址
Address contractAddress = new Address("0x8284e5a2087628d3a278d2336cdc883d2a98b032", netId);
// 呼叫者地址
Address recipient = new Address("0x1d23e8060f646bad1b4bb9125a5d1e71f56cb32f", netId);
Cfx cfx = Cfx.create("https://testnet-rpc.conflux-chain.org.cn/v2", 3, 1000);
// create account, then call contract's method
// 鏈接+私鑰=呼叫者賬戶
Account account = Account.create(cfx, privateKey);
// 估計這里寫入各種欄位,以次呼叫多種方法
// 可以查看原型,發現可以定義update交易的gas
// build transaction option info: nonce, gas, gasPrice and etc
Account.Option opt = new Account.Option();
// opt要設定用戶引數的id!!不然報錯chainIdMismatch
opt.withChainId(1);
BigInteger amount = BigInteger.valueOf(100);
// 這里合約方法是給指定物件印發 amount 量的代幣
// 第三個引數是合約方法名,其后是合約方法引數,有幾個,是啥看自己的合約
String txHash = account.call(opt, contractAddress,
"mint", recipient.getABIAddress(), new Uint256(amount));
// 回傳64位開頭0x8的哈希交易地址
// 具體內容可以在 https://testnet.confluxscan.io/ 輸入回傳哈希搜到
System.out.println("tx hash: " + txHash);
}
4.未完成和接下來想解決的問題:
如果有大佬看到這里,如果可以請指導一下下面兩個需求完成方法,不勝感激,聯系方式qq如名字,也可以下面留言
4.1 監聽訂閱及其保活
因為之前沒有寫過保活,網上的看了覺得不知道怎么帶入
大佬原話:
“這個是訂閱,有資料后會回呼event->()”
“只需要處理event資料即可”
“然后寫個監聽,保活這個訂閱”
“意外停了,就重起”
然而看了java的監聽感覺得監聽器,事件源和事件相互嵌合,,,而且也不知道怎么個保活,更何況是lambda的event,我覺得一直while(true)大佬說不對,不知道怎么處理,,,若有大佬懂的,還請不吝賜教,
@Test
void pubsub_test() throws ConnectException {
// websocket和一般通信的區別(據說不同在于雙方平等)
// 初始化 WebSocketService 鏈接,連接到CFX網路
WebSocketService wsService = new WebSocketService("ws://testnet.cfxchain.xyz:12535", false);
wsService.connect();
Cfx cfx = Cfx.create(wsService);
// 范例:可以呼叫CFX方法,和 http 無異
BigInteger epoch = cfx.getEpochNumber().sendAndGet();
System.out.println("Current epoch: " + epoch);
// PubSub Subscribe to incoming events and process incoming events
// PubSub 最重要的就是事件訂閱(貌似?
final Flowable<NewHeadsNotification> events = cfx.subscribeNewHeads();
final Disposable disposable = events.subscribe(event -> {
// You can get the detail through getters
System.out.println("##############");
while(true){
System.out.println(event.getParams().getResult());
System.out.println("##############");
}
});
// close
disposable.dispose();
}
4.2 ipfs和conflux的鏈接合作實作保存多文本
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/258789.html
標籤:區塊鏈
上一篇:重磅:PONY SWAP獲Nuveen Investment Bank戰略投資,深化全球布局!
下一篇:《人工智能導論》第二章 概念表示
