Hyperledger KC Tam
https://medium.com/@kctheservant
http://www.ledgertech.biz/kcarticles.html
===========
https://hyperledger-fabric.readthedocs.io/en/release-1.4/tutorials.html
http://www.ledgertech.biz/kcarticles.html
===========
https://hyperledger-fabric.readthedocs.io/en/release-1.4/tutorials.html
[轉]Hyperledger Fabric BYFN之配置進階篇
https://www.itread01.com/content/1550412200.html
byfn.sh down會呼叫networkdDown去銷燬整個網路和已生成的配置。byfn.sh restart則不會清理。
...........
注意
docker-compose down會停止和刪除容器,網路,映象和對映的卷。
只是停止服務的話的會最好使用docker-compose stop。
docker-compose up則是建立和啟動容器服務, 這裡用於啟動。
我們也可以參考例子fabric-samples/fabcar, 它會重用fabric-samples/basic-network中的start.sh, stop.sh允許停止和重啟。
這自然是有的,但是必須開啟orderer, peer等的持久化配置。
...........
7051是Peer啟動的gRPC, 一般是客戶端應用接入。
7053是事件埠(Peer Event)
..........
Fabric 1.1之後peer event做了完全不同的設計,訊息的監聽不在peer節點了,而是基於channel,這樣設計提供了對Peer資料更細粒度的採訪控制和提供了接收訊息的可靠性。(官方文件是這麼扯,我也有點疑惑) 主要提供兩種服務,Deliver(通知提交到記賬本的整個區塊內容) 和DeliverFiltered(過濾一些區塊減少訊息通知返回的區塊大小)
1. byfn.sh up down會清理所有容器映象,生成的配置檔案和證書,現實場景應該可以停止或恢復區塊鏈網路,該如何處理?
byfn.sh down會呼叫networkdDown去銷燬整個網路和已生成的配置。byfn.sh restart則不會清理。
...........
注意
docker-compose down會停止和刪除容器,網路,映象和對映的卷。
只是停止服務的話的會最好使用docker-compose stop。
docker-compose up則是建立和啟動容器服務, 這裡用於啟動。
我們也可以參考例子fabric-samples/fabcar, 它會重用fabric-samples/basic-network中的start.sh, stop.sh允許停止和重啟。
2. byfn.sh還是fabcar兩個例子即使重啟區塊鏈網路,通道需要創新建立,節點需要重新加入通道,鏈碼也要全要重新安裝,如果節點多維護起來就麻煩且費時,重啟的時候能讓通道,節點,鏈碼,State DB自動恢復?
這自然是有的,但是必須開啟orderer, peer等的持久化配置。
...........
orderer.example.com:
...
- /mnt/hyperledger/orderer:/var/hyperledger/production/orderer
peer0.org1.example.com:
...
- /mnt/hyperledger/org1/peer0:/var/hyperledger/production
couchdb:
...
- /mnt/hyperledger/couchdb:/opt/couchdb/data
4. Peer節點我們配置了兩個埠,配置用來做什麼?
ports:
- 7051:7051
- 7053:7053
7051是Peer啟動的gRPC, 一般是客戶端應用接入。
7053是事件埠(Peer Event)
..........
Fabric 1.1之後peer event做了完全不同的設計,訊息的監聽不在peer節點了,而是基於channel,這樣設計提供了對Peer資料更細粒度的採訪控制和提供了接收訊息的可靠性。(官方文件是這麼扯,我也有點疑惑) 主要提供兩種服務,Deliver(通知提交到記賬本的整個區塊內容) 和DeliverFiltered(過濾一些區塊減少訊息通知返回的區塊大小)
Docker 本身DNS是不穩定的
再分享早上碰到docker穩定度問題,docker內到外網是靠本機的iptables做Nat出去,早上就發現運行很久的docker container,突然不送資料到ELK,一查發現DNS掛了,這之前也碰到幾次了,基本上不是中心DNS掛了,而且Docker本身架構的DNS掛了,基本上只要重啟docker service後就正常,無需對主機重啟,而重啟docker service是一件很嚴重的事情,因為上面所有的服務都會一併被下線,之後還要在把運行的服務全部重新上線…
也許我的理解是錯誤,但只能以目前的情況來判斷,也許是iptables nat轉換的問題,但本機沒有重開機,理論上就沒有這個問題才是。
也許我的理解是錯誤,但只能以目前的情況來判斷,也許是iptables nat轉換的問題,但本機沒有重開機,理論上就沒有這個問題才是。
[轉]What's New in Ethereum Serenity (2.0)
http://kimiwublog.blogspot.com/2018/12/whats-new-in-ethereum-serenity-20.html
需注意,時間是2018/12/06 內容肯不會是最正確的
需注意,時間是2018/12/06 內容肯不會是最正確的
[DIY] HyperLedger
1. Use docker-machine crate docker vm.
And install docker-compose.2. https://github.com/hyperledger/fabric-samples
# Fetch bootstrap.sh from fabric repository using
curl -sS https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh -o ./scripts/bootstrap.sh
# Change file mode to executable
chmod +x ./scripts/bootstrap.sh
# Download binaries and docker images
#./scripts/bootstrap.sh [version] [ca version] [thirdparty_version]
./scripts/bootstrap.sh
Here use all default value.
3. https://hyperledger-fabric.readthedocs.io/en/latest/build_network.html
# Start Run
cd fabric-samples/first-network
./byfn.sh generate
./byfn.sh up
4. Hope you see
===================== Query successful on peer1.org2 on channel 'mychannel' ============================== All GOOD, BYFN execution completed ===========
5. check docker ps Need like this
PS:
1. See Error
2019-11-06 02:22:34.819 UTC [main] InitCmd -> ERRO 001 Cannot run peer because cannot init crypto, folder "/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/users/Admin@org1.example.com/msp" does not exist
!!!!!!!!!!!!!!! Channel creation failed !!!!!!!!!!!!!!!!
========= ERROR !!! FAILED to execute End-2-End Scenario ===========
How to Fix
cd fabric-samples/first-network
./byfn.sh down
./byfn.sh generate #This maybe don't need
./byfn.sh up
6. How to querying chaincode again
https://learnblockchain.cn/2019/07/03/chaincode-run/
docker exec -it cli bash
root@73e65944cade:/opt/gopath/src/github.com/hyperledger/fabric/peer>
root@73e65944cade:/opt/gopath/src/github.com/hyperledger/fabric/peer> peer chaincode query -C mychannel -n mycc -c '{"Args":["query","a"]}'
# peer chaincode query This command come from e2etest that you first time See This message:
========= All GOOD, BYFN execution completed ===========
Then just find screen up, can see "peer chaincode query ooxxooxxooxx". Please copy it then use in here.
[轉]SSLH 是一款采用 C 语言编写的开源端口复用软件,目前支持 HTTP、SSL、SSH、OpenVPN、Tinc、XMPP 等多种协议识别
https://mp.weixin.qq.com/s/sHitMzs8KXXO6joX8QqO_A?fbclid=IwAR1UGD7gemvKRY-IkOCEHGDru6YLDkI2vXojKpLTc-AZ4gN2Zz849YwJKZ8
SSLH 是一款采用 C 语言编写的开源端口复用软件,目前支持 HTTP、SSL、SSH、OpenVPN、Tinc、XMPP 等多种协议识别。它主要运行于 *nix 环境,源代码托管在 GitHub 上。
项目地址:https://github.com/yrutschle/sslh
更简单地说,SSLH 允许我们在 Linux 系统上的同一端口上运行多个程序/服务。因此,您可以用同一端口来同时使用两种服务。如果你遇到大多数端口被防火墙阻止的情况,SSLH 就可以帮你派上大用场。下面我们就来看一个 SSL 和 SSH 同时复用同一端口的实例。
SSLH 是一款采用 C 语言编写的开源端口复用软件,目前支持 HTTP、SSL、SSH、OpenVPN、Tinc、XMPP 等多种协议识别。它主要运行于 *nix 环境,源代码托管在 GitHub 上。
项目地址:https://github.com/yrutschle/sslh
更简单地说,SSLH 允许我们在 Linux 系统上的同一端口上运行多个程序/服务。因此,您可以用同一端口来同时使用两种服务。如果你遇到大多数端口被防火墙阻止的情况,SSLH 就可以帮你派上大用场。下面我们就来看一个 SSL 和 SSH 同时复用同一端口的实例。
[轉][Flutter]还在大量使用TextEditingController?试试这种解决方案
当用户输入大量信息时,通常会采用TextField列表来解决,这时如果需要对每个TextField进行控制或监听就需要大量的TextEditingController。
这里提供另一种思路,解决大量使用TextEditingController和信息整理困难的问题。
定义一个Map:
Map _userInfo;
这个Map作用于所有需要收集用户信息的地方。
使用TextField时这样操作:
这里全程未单独定义TextEditingController,只使用TextField默认的方法进行控制,且可以获得以下好处:
1.节省大量代码,简化业务逻辑。
2.用户输入完成时即得到一个包含所有信息的Map。
3.输入的内容不会丢失,只要这个Map不被销毁,下次进入(或返回)这个页面时所有内容都在,不用要求用户再次输入,提升用户体验。
第一次发文章,如有问题,欢迎指正。
作者:xSILENCEx
链接:https://juejin.im/post/5d649bfce51d453b1d648314
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
这里提供另一种思路,解决大量使用TextEditingController和信息整理困难的问题。
定义一个Map:
Map
这个Map作用于所有需要收集用户信息的地方。
使用TextField时这样操作:
////邮箱
TextField(
controller: TextEditingController(text: _userInfo['account']),
onChanged: (value) {
_userInfo['account'] = value;
},
),
////昵称
TextField(
controller: TextEditingController(text: _userInfo['nickname']),
onChanged: (value) {
_userInfo['nickname'] = value;
},
),
////密码
TextField(
controller: TextEditingController(text: _userInfo['password']),
onChanged: (value) {
_userInfo['password'] = value;
},
),
这里全程未单独定义TextEditingController,只使用TextField默认的方法进行控制,且可以获得以下好处:
1.节省大量代码,简化业务逻辑。
2.用户输入完成时即得到一个包含所有信息的Map。
3.输入的内容不会丢失,只要这个Map不被销毁,下次进入(或返回)这个页面时所有内容都在,不用要求用户再次输入,提升用户体验。
第一次发文章,如有问题,欢迎指正。
作者:xSILENCEx
链接:https://juejin.im/post/5d649bfce51d453b1d648314
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
dart null list
減少null判斷情況
https://stackoverflow.com/questions/51036758/flutter-the-method-map-was-called-on-null
https://juejin.im/post/5c6d38b1f265da2dcc7feb69
https://cloud.tencent.com/developer/article/1370380
?? => if null
https://blog.csdn.net/ffa_ijj/article/details/85051156
這個判斷方式有個問題,當查詢回來為[],不是null情況下,在.first會出錯,因為 "No element"會出錯,但.toList()會正確,故改回
https://stackoverflow.com/questions/51036758/flutter-the-method-map-was-called-on-null
https://juejin.im/post/5c6d38b1f265da2dcc7feb69
https://cloud.tencent.com/developer/article/1370380
?? => if null
https://blog.csdn.net/ffa_ijj/article/details/85051156
return qres?.map((value) {
LinkedHashMap result = json.decode(value["jsonitem"]);
return result;
})?.first ?? new LinkedHashMap();
這個判斷方式有個問題,當查詢回來為[],不是null情況下,在.first會出錯,因為 "No element"會出錯,但.toList()會正確,故改回
if (qres == null || qres.isEmpty) return new Member(); // 待確定是否出錯
var resmap = qres.first;
return new Member.fromJson(json.decode(resmap["jsonitem"]));
git 不同專案使用不同帳號
git global 已設定,但其他專案需要設定其他的帳號
到專案目錄下的.git內,修改config檔案,補上
[user]
name = ooxx
email = ooxx@gmail.com
即可蓋過global
到專案目錄下的.git內,修改config檔案,補上
[user]
name = ooxx
email = ooxx@gmail.com
即可蓋過global
dart json serialisation dson
https://github.com/drails-dart/dart-serialise
https://github.com/parnham/dart-serialise
https://github.com/dart-league/dson
https://github.com/parnham/dart-serialise
https://github.com/dart-league/dson
json to dart flutter
https://javiercbk.github.io/json_to_dart/
https://ashamp.github.io/jsonToDartModel/
https://ashamp.github.io/jsonToDartModel/
[轉]Remix now force to use https, how can i continue to use http://remix.ethereum.org?
http://remix.ethereum.org
Not https://remix.ethereum.org
Not https://remix.ethereum.org
[轉]kubernetes高可用安装工具,一条命令,离线安装,包含所有依赖,内核负载不依赖haproxy keepalived,纯golang开发,99年证书,
https://github.com/fanux/sealos
[轉]datatable datatables nodejs
https://newcodingera.com/datatables-server-side-processing-using-nodejs-mysql/
https://1drv.ms/u/s!At2KEcnT9DVaiw88MAEXeML0bRf3
======================
datatables mongodb
https://github.com/deepikagunda/datatables
https://1drv.ms/u/s!At2KEcnT9DVaiw88MAEXeML0bRf3
Important! SqlInjection
======================
datatables mongodb
https://github.com/deepikagunda/datatables
[轉]secp256k1簽章的message,長度都必須是256 bits,也就是32 bytes
https://medium.com/@antonassocareer/web3-secp256k1-%E7%B0%BD%E7%AB%A0%E8%88%87solidity%E9%A9%97%E7%AB%A0-26ded518cfdc
那麼如果我們想要單純用私鑰簽章一段資料,不要有Ethereum定義的那些prefix的話,就必須要直接調用 secp256k1 這一包library了。不過在用之前要知道,所有要丟給secp256k1簽章的message,長度都必須是256 bits,也就是32 bytes。剛剛我們說web3的簽名函式丟什麼都可以,是因為它會幫我加上prefix之後再做sha3 Hash (keccak),最後一定會變成一個32 bytes的東西。如果我們自己純靠私要簽章訊息的話,也勢必要先通過這個函式來整理input長度
那麼如果我們想要單純用私鑰簽章一段資料,不要有Ethereum定義的那些prefix的話,就必須要直接調用 secp256k1 這一包library了。不過在用之前要知道,所有要丟給secp256k1簽章的message,長度都必須是256 bits,也就是32 bytes。剛剛我們說web3的簽名函式丟什麼都可以,是因為它會幫我加上prefix之後再做sha3 Hash (keccak),最後一定會變成一個32 bytes的東西。如果我們自己純靠私要簽章訊息的話,也勢必要先通過這個函式來整理input長度
sha3 Hash (keccak)
bip39 mnemonic bip32 seed ed25519 elliptic
const bip39 = require('bip39')
const bip32 = require('bip32');
const EC = require('elliptic').ec;
json =`test json file`
mnemonic = "簡 熙 夢 幾 聲 可 高 汪 煙 版 統 仇"
path = "m/2018'/5'/1'/0/1"
const sJWSinit = async () => {
console.log('-----sJWS Initial Start----- \n');
dkey = await DeriveKey(mnemonic, path)
console.log("\nGet dkey: %o \n", dkey)
console.log('\n-----elliptic ed25519 Start----- \n');
var EdDSA = require('elliptic').eddsa
var ec = new EdDSA('ed25519');
var eckeypair = ec.keyFromSecret(dkey.privateKey)
var privateKeyHex = new Buffer.from(eckeypair.getSecret()).toString('hex')
var publickeyHex = new Buffer.from(eckeypair.getPublic()).toString('hex')
console.log("private key hex: %o", privateKeyHex)
console.log("public key hex: %o\n", publickeyHex)
var signature = eckeypair.sign(json).toHex();
console.log("signature: %o\n", signature)
var ec2 = new EdDSA('ed25519');
var ec2keypair2 = ec2.keyFromPublic(publickeyHex, 'hex');
console.log("EdDSA json verify: %o", ec2keypair2.verify(json, signature));
}
(async () => {
console.log("--- aysnc sJWS init---")
await sJWSinit();
})();
async function DeriveKey(mnemonic, derivePath) {
if (bip39.validateMnemonic(mnemonic)) { console.log("mnemonic is fake!") }
return bip39.mnemonicToSeed(mnemonic).then((vseed)=>{
var root = bip32.fromSeed(vseed)
var PathNode = root.derivePath(derivePath)
console.log("# PATH 是 m/2018'/5'/1'/0/1/0 因為底下為derive(0),所以 path + '/0' \n")
console.log("privateKey (Hex): %o", PathNode.derive(0).privateKey.toString('hex'))
console.log("publicKey (Hex): %o", PathNode.derive(0).publicKey.toString('hex')) // 024ac10a81e3a0f86cb4dad68c6a26031d805a057f36048f80a5b91b1c2cb0588c 符合
return {
prv_buf: PathNode.derive(0).privateKey,
pub_buf: PathNode.derive(0).publicKey,
wif: PathNode.derive(0).toWIF(),
publicKey: PathNode.derive(0).publicKey.toString('hex'),
privateKey: PathNode.derive(0).privateKey.toString('hex'),
path: derivePath
}
}).catch((e) => {
console.error('handle error here: ', e.message)
})
}
訂閱:
文章 (Atom)
