1. fabric網(wǎng)絡(luò)搭建
環(huán)境準(zhǔn)備
- 一臺(tái)空閑服務(wù)器,需要安裝docker和go環(huán)境,安裝步驟自行百度
- 點(diǎn)擊下載fabric-samples源代碼
- 將fabric-samples的分支切換到
release-1.4
,然后進(jìn)行打包,上傳到服務(wù)器上
安裝fabric網(wǎng)絡(luò)
生成配置文件
在服務(wù)器上對(duì)fabric-samples進(jìn)行解壓,并切換到fabric-samples/first-network
目錄下,執(zhí)行命令./byfn.sh generate
,控制臺(tái)輸入Y或者回車,即可完成配置文件生成,然后出現(xiàn)一堆信息,控制臺(tái)找不到了,從官網(wǎng)截了個(gè)圖
具體的步驟可以看byfn.sh中的內(nèi)容
主要是生成證書和替換密鑰文件,最后一步是創(chuàng)建channelArtifacts
看這命令是不是有點(diǎn)熟悉,其實(shí)就是你的控制臺(tái)輸出,默認(rèn)
CONSENSUS_TYPE
是solo
,主要就是創(chuàng)建錨節(jié)點(diǎn)然后更新transactions
啟動(dòng)網(wǎng)絡(luò)
在fabric-samples/first-network
目錄下執(zhí)行命令./byfn.sh up
,控制臺(tái)輸入Y或者回車,就會(huì)出現(xiàn)如下的輸出
具體邏輯可以看
byfn.sh
,大概意思就是docker創(chuàng)建了幾個(gè)容器,創(chuàng)建OrdererMSP,Org1MSP以及Org2MSP,然后創(chuàng)建節(jié)點(diǎn)和通道,然后讓節(jié)點(diǎn)加入通道是否安裝完成的如下圖
注意將
first-network
目錄下的crypto-config
目錄進(jìn)行打包,并下載到本地,區(qū)塊鏈瀏覽器會(huì)進(jìn)行使用
進(jìn)行peer節(jié)點(diǎn)操作
查詢啟動(dòng)的容器,我們可以看到有個(gè)cli的容器,它是可以操作peer節(jié)點(diǎn)的容器,我們只需要進(jìn)入cli容器即可進(jìn)行peer節(jié)點(diǎn)的操作
- 進(jìn)入cli容器
docker exec -it cli bash
- 進(jìn)行操作
點(diǎn)擊查看peer命令,查看peer版本執(zhí)行peer version
查看peer的通道有哪些,執(zhí)行peer channel list
2. fabric瀏覽器搭建
環(huán)境準(zhǔn)備
點(diǎn)擊下載fabric-explorer源代碼,或者下載漢化版fabric-explorer-cn,記得閱讀README.md文件
代碼依賴安裝和編譯
進(jìn)入下載目錄,例如使用fabric-explorer-cn,則進(jìn)入fabric-explorer-cn,然后執(zhí)行命令./main.sh install
,等待執(zhí)行完成,時(shí)間較久,如果要清除node_modules的話,可以執(zhí)行./main.sh clean
數(shù)據(jù)庫(kù)配置文件修改
如果進(jìn)行數(shù)據(jù)庫(kù)地址修改的話,可以編輯app/explorerconfig.json
文件,修改postgreSQL
字段下的host
等信息,注意你的pg數(shù)據(jù)庫(kù)要有對(duì)應(yīng)的賬戶和schema,然后進(jìn)入app/persistence/fabric/postgreSQL/db/explorerpg.sql
,將腳本進(jìn)行整理,并在數(shù)據(jù)庫(kù)執(zhí)行,文末提供sql內(nèi)容,或者是使用README.md
推薦的在本地執(zhí)行./createdb.sh
進(jìn)行pg創(chuàng)建
區(qū)塊鏈瀏覽器配置文件修改
編輯根目錄下的appconfig.json
文件,如果需要?jiǎng)e人訪問你的瀏覽器的話,就將host
改為自己的ip地址,如果端口沖突的話,就修改port
fabric客戶端配置
在app/platform/fabric/config.json
文件中,可以看到引用的profile為./connection-profile/first-network.json
,打開同目錄的connection-profile/first-network.json
文件,進(jìn)行修改,看到有很多參數(shù),其實(shí)里面很多我們都可以不用管,只需要修改證書文件路徑,還記得上面說讓下載的crypto-config
目錄到本地嗎,將如下幾個(gè)地方修改成自己的路徑即可
注意path要全部換掉,因?yàn)橛锌赡?code>adminPrivateKey的path最后生成的sk文件的hash不一樣
配置hosts域名映射
在自己的hosts文件中,新增兩個(gè)域名映射,即orderer.example.com
和peer0.org1.example.com
都映射到自己的服務(wù)器ip上
配置啟動(dòng)腳本
編寫根目錄下的start.sh
和syncstart.sh
文件,將他們的export DISCOVERY_AS_LOCALHOST=true
,改成export DISCOVERY_AS_LOCALHOST=false
,當(dāng)然如果你的fabric網(wǎng)絡(luò)運(yùn)行在你本機(jī)的話,就使用默認(rèn)的即可
啟動(dòng)區(qū)塊鏈瀏覽器
打開控制臺(tái),執(zhí)行./start.sh
,logs/app/app.log
是查看應(yīng)用日志,logs/console/console.log
是查看控制臺(tái)的,logs/db/db.log
是查看數(shù)據(jù)庫(kù)日志
訪問區(qū)塊鏈瀏覽器
打開瀏覽器,輸入localhost:8080
,或者是你在appconfig.json
文件中配置的host:port
進(jìn)行訪問,輸入用戶名admin
以及密碼adminpw
,點(diǎn)擊登錄即可進(jìn)入?yún)^(qū)塊鏈瀏覽器主頁(yè)
3.fabric-explorer sql
--
-- SPDX-License-Identifier: Apache-2.0
-- ----------------------------
-- Table structure for `blocks`
-- ----------------------------
DROP TABLE IF EXISTS blocks;
CREATE TABLE blocks
(
id SERIAL PRIMARY KEY,
blocknum integer DEFAULT NULL,
datahash character varying(256) DEFAULT NULL,
prehash character varying(256) DEFAULT NULL,
txcount integer DEFAULT NULL,
createdt Timestamp DEFAULT NULL,
prev_blockhash character varying(256) DEFAULT NULL,
blockhash character varying(256) DEFAULT NULL,
channel_genesis_hash character varying(256) DEFAULT NULL,
blksize integer DEFAULT NULL
);
-- ----------------------------
-- Table structure for `chaincodes`
-- ----------------------------
DROP TABLE IF EXISTS chaincodes;
CREATE TABLE chaincodes
(
id SERIAL PRIMARY KEY,
name character varying(255) DEFAULT NULL,
version character varying(255) DEFAULT NULL,
path character varying(255) DEFAULT NULL,
channel_genesis_hash character varying(256) DEFAULT NULL,
txcount integer DEFAULT 0,
createdt Timestamp DEFAULT NULL
);
Alter sequence chaincodes_id_seq restart with 10;
-- ---------------------------
-- Table structure for `peer_ref_chaincode`
-- ----------------------------
DROP TABLE IF EXISTS peer_ref_chaincode;
CREATE TABLE peer_ref_chaincode
(
id SERIAL PRIMARY KEY,
peerid varchar(64) DEFAULT NULL,
chaincodeid varchar(64) DEFAULT NULL,
cc_version varchar(64) DEFAULT NULL,
channelid character varying(256) DEFAULT NULL,
createdt Timestamp DEFAULT NULL
);
-- ----------------------------
-- Table structure for `channel`
-- ----------------------------
DROP TABLE IF EXISTS channel;
-- state character(1) NOT NULL DEFAULT A CHECK (state in (A, D, S))
CREATE TABLE channel
(
id SERIAL PRIMARY KEY,
name varchar(256) DEFAULT NULL,
blocks integer DEFAULT NULL,
trans integer DEFAULT NULL,
createdt Timestamp DEFAULT NULL,
channel_genesis_hash character varying(256) DEFAULT NULL,
channel_hash character varying(256) DEFAULT NULL,
channel_config bytea default NULL,
channel_block bytea DEFAULT NULL,
channel_tx bytea DEFAULT NULL,
channel_version character varying(128) DEFAULT NULL
);
Alter sequence channel_id_seq restart with 3;
-- ----------------------------
-- Table structure for `peer`
-- ----------------------------
DROP TABLE IF EXISTS peer;
-- state character(1) NOT NULL DEFAULT A CHECK (state in (A, D, S))
CREATE TABLE peer
(
id SERIAL PRIMARY KEY,
org integer DEFAULT NULL,
channel_genesis_hash character varying(256) DEFAULT NULL,
mspid varchar(64) DEFAULT NULL,
requests varchar(64) DEFAULT NULL,
events varchar(64) DEFAULT NULL,
server_hostname varchar(64) DEFAULT NULL,
createdt timestamp DEFAULT NULL,
peer_type character varying(64) DEFAULT NULL
);
-- ---------------------------
-- Table structure for `peer_ref_channel`
-- ----------------------------
DROP TABLE IF EXISTS peer_ref_channel;
CREATE TABLE peer_ref_channel
(
id SERIAL PRIMARY KEY,
createdt Timestamp DEFAULT NULL,
peerid varchar(64),
channelid character varying(256),
peer_type character varying(64) DEFAULT NULL
);
-- ====================Orderer BE-303=====================================
-- ----------------------------
-- Table structure for `orderer`
-- ----------------------------
DROP TABLE IF EXISTS orderer;
-- state character(1) NOT NULL DEFAULT A CHECK (state in (A, D, S))
CREATE TABLE orderer
(
id SERIAL PRIMARY KEY,
requests varchar(64) DEFAULT NULL,
server_hostname varchar(64) DEFAULT NULL,
createdt timestamp DEFAULT NULL
);
--// ====================Orderer BE-303=====================================
-- ----------------------------
-- Table structure for `transactions`
-- ----------------------------
DROP TABLE IF EXISTS transactions;
CREATE TABLE transactions
(
id SERIAL PRIMARY KEY,
blockid integer DEFAULT NULL,
txhash character varying(256) DEFAULT NULL,
createdt timestamp DEFAULT NULL,
chaincodename character varying(255) DEFAULT NULL,
status integer DEFAULT NULL,
creator_msp_id character varying(128) DEFAULT NULL,
endorser_msp_id character varying(800) DEFAULT NULL,
chaincode_id character varying(256) DEFAULT NULL,
type character varying(128) DEFAULT NULL,
read_set json default NULL,
write_set json default NULL,
channel_genesis_hash character varying(256) DEFAULT NULL,
validation_code character varying(50) DEFAULT NULL,
envelope_signature character varying DEFAULT NULL,
payload_extension character varying DEFAULT NULL,
creator_id_bytes character varying DEFAULT NULL,
creator_nonce character varying DEFAULT NULL,
chaincode_proposal_input character varying DEFAULT NULL,
tx_response character varying DEFAULT NULL,
payload_proposal_hash character varying DEFAULT NULL,
endorser_id_bytes character varying DEFAULT NULL,
endorser_signature character varying DEFAULT NULL
);
Alter sequence transactions_id_seq restart with 6;
DROP TABLE IF EXISTS write_lock;
CREATE TABLE write_lock
(
write_lock SERIAl PRIMARY KEY
);
Alter sequence write_lock_write_lock_seq restart with 2;
DROP INDEX IF EXISTS blocks_blocknum_idx;
CREATE INDEX ON Blocks
(blocknum);
DROP INDEX IF EXISTS blocks_channel_genesis_hash_idx;
CREATE INDEX ON Blocks
(channel_genesis_hash);
DROP INDEX IF EXISTS blocks_createdt_idx;
CREATE INDEX ON Blocks
(createdt);
DROP INDEX IF EXISTS transaction_txhash_idx;
CREATE INDEX ON Transactions
(txhash);
DROP INDEX IF EXISTS transaction_channel_genesis_hash_idx;
CREATE INDEX ON Transactions
(channel_genesis_hash);
DROP INDEX IF EXISTS transaction_createdt_idx;
CREATE INDEX ON Transactions
(createdt);
DROP INDEX IF EXISTS transaction_blockid_idx;
CREATE INDEX ON Transactions
(blockid);
DROP INDEX IF EXISTS transaction_chaincode_proposal_input_idx;
CREATE INDEX ON Transactions
((md5
(chaincode_proposal_input)));
DROP INDEX IF EXISTS channel_channel_genesis_hash_idx;
CREATE INDEX ON channel
(channel_genesis_hash);
DROP INDEX IF EXISTS channel_channel_hash_idx;
CREATE INDEX ON channel
(channel_hash);