這篇文章給大家分享的是有關(guān)Fabric 2.0中鏈碼操作過程是怎么樣的的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過來看看吧。
目前成都創(chuàng)新互聯(lián)公司已為數(shù)千家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管、服務(wù)器租用、企業(yè)網(wǎng)站設(shè)計(jì)、定結(jié)網(wǎng)站維護(hù)等服務(wù),公司將堅(jiān)持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長(zhǎng),共同發(fā)展。
我們將首先快速介紹在HF 1.4和HF 2.0中的整個(gè)鏈碼操作過程。
鏈碼操作指的是在Hyperledger fabric網(wǎng)絡(luò)通道上部署鏈碼的操作,這樣區(qū)塊鏈之外的應(yīng)用可以調(diào)用或查詢鏈碼方法。在鏈碼開發(fā)完成并測(cè)試后,首先需要將Fabric鏈碼安裝到指定的peer節(jié)點(diǎn)。在這個(gè)階段鏈碼還不能使用,直到鏈碼被提交(Fabric 2.0中的術(shù)語(yǔ))到通道中或在通道上實(shí)例化(Fabric 1.4中的術(shù)語(yǔ)),這樣鏈碼就可以被授權(quán)用戶訪問了。
下面是兩個(gè)版本的Hyperledger Fabric中鏈碼操作流程的對(duì)比圖:
在Hyperledger Fabric 1.4中,鏈碼操作過程包含以下步驟:打包、安裝、實(shí)例化。如果鏈碼屬于多個(gè)參與方,那么就需要打包這一環(huán)節(jié)。如果不存在多方屬主的問題,那么直接安裝鏈碼就可以(其中隱含了打包環(huán)節(jié))。在Fabric鏈碼安裝時(shí)需要指定要安裝鏈碼的目標(biāo)節(jié)點(diǎn)。
在這個(gè)階段,安裝好的Fabric鏈碼還不能使用,因?yàn)樗€沒有在通道上實(shí)例化。當(dāng)Fabric鏈碼包被安裝在指定的節(jié)點(diǎn)上之后,我們就可以執(zhí)行鏈碼實(shí)例化操作,從而讓鏈碼在通道上可用。技術(shù)上來說,鏈碼實(shí)例化實(shí)際上就是調(diào)用LSCC系統(tǒng)鏈碼的方法來初始化通道上的一個(gè)鏈碼。
Fabric鏈碼實(shí)例化之后就可以使用了,可以接受通道上的調(diào)用或查詢請(qǐng)求。
下面我們看在Hyperledger Fabric 2.0中的鏈碼操作步驟有何區(qū)別。
寬泛地來講,在Fabric 2.0中鏈碼操作基本遵循同樣的流程,但是在命令和某些后臺(tái)處理中做了一些調(diào)整。整體的流程可以分為四個(gè)步驟:打包、安裝、機(jī)構(gòu)審批、鏈碼提交。大致可以認(rèn)為前兩個(gè)環(huán)節(jié)對(duì)應(yīng)于Fabric 1.4中的鏈碼安裝,后面兩個(gè)環(huán)節(jié)對(duì)應(yīng)于Fabric 1.4中的鏈碼實(shí)例化,但是實(shí)例化(instantiation)這個(gè)詞不再用了。
鏈碼打包這一步是創(chuàng)建一個(gè)打包文件(tar格式),其中包含F(xiàn)abric鏈碼以及一些元數(shù)據(jù)。雖然不同的機(jī)構(gòu)可以分別進(jìn)行打包處理,更常見是由一個(gè)機(jī)構(gòu)打包然后分發(fā)給其他機(jī)構(gòu)以便確保所有的機(jī)構(gòu)使用相同的鏈碼。
安裝步驟是將打包的Fabric鏈碼文件安裝在指定的peer節(jié)點(diǎn)上。和之前的版本一樣,只有需要接受鏈碼調(diào)用的節(jié)點(diǎn)才需要安裝鏈碼。在這個(gè)節(jié)點(diǎn),F(xiàn)abric鏈碼還不可用,因?yàn)檫€沒有提交到通道中。鏈碼安裝的結(jié)果是得到一個(gè)包標(biāo)識(shí)符,其格式為<label>.<hash>
。
機(jī)構(gòu)審批是在Hyperledger Fabric 2.0中增加的步驟。在之前的版本中我們可以讓一個(gè)機(jī)構(gòu)實(shí)例化鏈碼。在Fabric 2.0中,需要機(jī)構(gòu)顯式地審批鏈碼。需要多少機(jī)構(gòu)審批則是由生命周期背書策略來決定,默認(rèn)情況下設(shè)置為需要大多數(shù)機(jī)構(gòu)(超過半數(shù))。如果Fabric網(wǎng)絡(luò)中包含兩個(gè)機(jī)構(gòu),那么就需要這兩個(gè)機(jī)構(gòu)同時(shí)批準(zhǔn)。在審批過程中需要排序節(jié)點(diǎn)的參與,因?yàn)槊看螌徟紩?huì)生成一個(gè)新的區(qū)塊,這意味著所有的peer節(jié)點(diǎn)都了解審批的狀態(tài)。
當(dāng)審批環(huán)節(jié)完成后,我們就需要指定要在哪個(gè)通道上部署鏈碼。這需要提交一些信息,例如背書策略、是否需要執(zhí)行Init代碼等等。在這里也有些與Fabric 1.4不同的地方:在Fabric 1.4中,當(dāng)鏈碼實(shí)例化時(shí)會(huì)自動(dòng)調(diào)用鏈碼的Init方法,然而在Fabric 2.0中,需要在提交鏈碼后顯式地調(diào)用Init方法。
在批準(zhǔn)機(jī)構(gòu)達(dá)到指定數(shù)量后,鏈碼就可以提交了。我們現(xiàn)在就進(jìn)入了最后一個(gè)步驟:鏈碼提交。
鏈碼提交可以由任何機(jī)構(gòu)發(fā)起。該流程首先需要批準(zhǔn)機(jī)構(gòu)的背書,然后交易提交到排序服務(wù)并生成新的區(qū)塊,最后所有的對(duì)等節(jié)點(diǎn)在賬本中提交該區(qū)塊。
現(xiàn)在鏈碼就可以使用了。
出于完整性考慮,下面給出關(guān)于First Network和SACC鏈碼的一些信息,這些內(nèi)容都來自fabric-samples倉(cāng)庫(kù)。
First Network是一個(gè)雙機(jī)構(gòu)設(shè)置,每個(gè)機(jī)構(gòu)中包含兩個(gè)peer節(jié)點(diǎn)。通道m(xù)ychannel創(chuàng)建后加入所有的4個(gè)peer節(jié)點(diǎn)。在byfn.sh中完整的實(shí)現(xiàn)了First Network的部署,并包含一些可選的參數(shù)。在下面的演示中,我們不使用默認(rèn)的鏈碼(在Fabric 1.4中式chaincode_example02,在Fabric 2.0中式abstore),而是使用SACC鏈碼。
SACC式Simple Asset ChainCode的縮寫,表示簡(jiǎn)單資產(chǎn)鏈碼。它在賬本中模擬一個(gè)鍵/值存儲(chǔ)。當(dāng)初次部署后,需要一個(gè)初始的鍵/值對(duì)。SACC鏈碼定義了兩個(gè)方法:Set()
和Get()
,分別用來設(shè)置或讀取某個(gè)鍵的值。
好了,現(xiàn)在我們可以開始演示Fabric 1.4和Fabric 2.0中鏈碼操作的不同了。
我們首先以無鏈碼方式(使用-n選項(xiàng))啟動(dòng)First Network,然后我們?cè)偌虞dSACC鏈碼以便聚焦鏈碼的生命周期。
下面是演示步驟:
無鏈碼方式啟動(dòng)First Network
在指定的peer節(jié)點(diǎn)上安裝SACC鏈碼
在mychannel通道上實(shí)例化SACC鏈碼并查詢結(jié)果
調(diào)用set()設(shè)置新值并從另一個(gè)peer節(jié)點(diǎn)查詢結(jié)果
STEP 1:首先啟動(dòng)First Network:
cd fabric-samples/first-network ./byfn.sh up -n
上面的命令會(huì)啟動(dòng)First Network、創(chuàng)建通道m(xù)ychannel并將所有的peer節(jié)點(diǎn)加入該通道。注意在Fabric 1.4.4中,F(xiàn)irst Network使用solo排序服務(wù)實(shí)現(xiàn),只有一個(gè)排序節(jié)點(diǎn)。另外,我們看到有4個(gè)對(duì)等節(jié)點(diǎn)在運(yùn)行,以及一個(gè)CLI用于鏈碼操作。
現(xiàn)在我們可以開始鏈碼部署操作。
STEP 2:在指定peer節(jié)點(diǎn)上安裝鏈碼
這里我們跳過打包環(huán)節(jié),直接在目標(biāo)節(jié)點(diǎn)peer.org1和peer0.org2上安裝鏈碼,因?yàn)樵谶@個(gè)演示中我們只需要這兩個(gè)節(jié)點(diǎn)進(jìn)行鏈碼調(diào)用和查詢。
# peer0.org1 docker exec cli peer chaincode install -n mycc -v 1 \ -p github.com/chaincode/sacc # peer0.org2 docker exec \ -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 -e CORE_PEER_LOCALMSPID="Org2MSP" \ -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ cli peer chaincode install -n mycc -v 1 -p github.com/chaincode/sacc
STEP 3:在通道m(xù)ychannel上實(shí)例化鏈碼并查詢
注意在sacc鏈碼中有Init()代碼。當(dāng)我們實(shí)例化鏈碼時(shí),我們需要提供Init()所需的參數(shù):
docker exec cli peer chaincode instantiate -o orderer.example.com:7050 --tls \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ -C mychannel -n mycc -v 1 -c '{"Args":["name","kc"]}' \ -P "AND ('Org1MSP.peer','Org2MSP.peer')"
如果現(xiàn)在看看peer節(jié)點(diǎn)的日志,我們可以看到出了新區(qū)塊#3。
在鏈碼實(shí)例化之后,我們可以查詢:
docker exec cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'
STEP 4:調(diào)用set()設(shè)置新值并從另一個(gè)節(jié)點(diǎn)查詢
出于演示目的,我們?cè)趐eer0.org1上調(diào)用set()
,然后在peer0.org2上調(diào)用get()
,以此說明鏈碼是否工作正常。
# peer0.org1 docker exec cli peer chaincode invoke -o orderer.example.com:7050 --tls \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ --peerAddresses peer0.org1.example.com:7051 \ --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ --peerAddresses peer0.org2.example.com:9051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ -C mychannel -n mycc -c '{"Args":["set","name","Peter"]}' # peer0.org2 docker exec -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ -e CORE_PEER_LOCALMSPID="Org2MSP" \ -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'
類似的,在Fairc 2.0.0中,我們也先以無鏈碼方式啟動(dòng)First Network,然后再啟動(dòng)SACC鏈碼以便聚焦鏈碼的生命周期。
下面是演示步驟:
無鏈碼方式啟動(dòng)First Network
打包SACC鏈碼
在指定peer節(jié)點(diǎn)上安裝SACC鏈碼包
機(jī)構(gòu)審批鏈碼
在mychannel通道上提交鏈碼
調(diào)用SACC鏈碼的Init方法
調(diào)用SACC鏈碼的set方法并從另一個(gè)peer節(jié)點(diǎn)查詢結(jié)果
STEP 1:以無鏈碼方式啟動(dòng)First Network:
cd fabric-samples/first-network ./byfn.sh up -n
現(xiàn)在First Network已經(jīng)啟動(dòng),通道m(xù)ychannel已經(jīng)創(chuàng)建并且所有peer節(jié)點(diǎn)已經(jīng)加入mychannel通道。注意在Fabric 2.0.0中,F(xiàn)irst Network使用Raft作為排序服務(wù),所有5個(gè)排序節(jié)點(diǎn)都在運(yùn)行。在這個(gè)演示中,我們只使用orderer.example.com,不過使用其他排序節(jié)點(diǎn)也是一樣的。
STEP 2:打包SACC鏈碼
首先我們處理依賴問題:
cd fabric-sample/chaincode/sacc GO111MODULE=on go mod vendor cd fabric-sample/first-network
然后打包鏈碼:
docker exec cli peer lifecycle chaincode package sacc.tar.gz \ --path github.com/hyperledger/fabric-samples/chaincode/sacc/ \ --label sacc_1
在CLI容器內(nèi)可以看到生成了新的文件sacc.tar.gz:
STEP 3:在指定peer節(jié)點(diǎn)上安裝SACC鏈碼包
現(xiàn)在我們?cè)趐eer0.org1和peer0.org2上安裝SACC練馬報(bào),因?yàn)樵谶@個(gè)演示中我們只需要使用這兩個(gè)節(jié)點(diǎn)進(jìn)行鏈碼調(diào)用和查詢。
# peer0.org1 docker exec cli peer lifecycle chaincode install sacc.tar.gz # peer0.org2 docker exec \ -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ -e CORE_PEER_LOCALMSPID="Org2MSP" \ -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ cli peer lifecycle chaincode install sacc.tar.gz
我們會(huì)收到鏈碼包的標(biāo)識(shí)符,在下面的鏈碼審批階段會(huì)用到。我們收到的鏈碼標(biāo)識(shí)符為:sacc_1:bf57…6399
。
我們可以使用peer lifecycle chaincode queryinstalled
命令隨時(shí)檢查節(jié)點(diǎn)上的鏈碼安裝情況,如果我們需要找出鏈碼包的標(biāo)識(shí)ID,這個(gè)命令會(huì)很有用。
# peer0.org1 docker exec cli peer lifecycle chaincode queryinstalled # peer0.org2 docker exec \ -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ -e CORE_PEER_LOCALMSPID="Org2MSP" \ -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ cli peer lifecycle chaincode queryinstalled
STEP 4:審批鏈碼
根據(jù)默認(rèn)策略,需要超過半數(shù)的機(jī)構(gòu)審批鏈碼后才能向通道提交鏈碼,具體可參考configtx.yaml中的Application/Policies/LifecycleEndorsement
部分。目前的設(shè)置中包含兩個(gè)機(jī)構(gòu),因此需要兩個(gè)機(jī)構(gòu)同時(shí)批準(zhǔn)鏈碼。
首先是Org1批準(zhǔn)鏈碼:
docker exec cli peer lifecycle chaincode approveformyorg \ --tls \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ --channelID mychannel --name mycc --version 1 \ --init-required --sequence 1 --waitForEvent --package-id ${PACKAGE_ID}
如果我們現(xiàn)在看下peer節(jié)點(diǎn)的日志,可以看到出了新塊#3。
類似的,我們讓Org2批準(zhǔn)鏈碼:
docker exec \ -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ -e CORE_PEER_LOCALMSPID="Org2MSP" \ -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ cli peer lifecycle chaincode approveformyorg \ --tls \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ --channelID mychannel --name mycc --version 1 --init-required \ --sequence 1 --waitForEvent --package-id ${PACKAGE_ID}
不出意外,可以看到出了新塊block#4:
注意我們?cè)赼pproval命令中指定了init相關(guān)的參數(shù),以便向SACC鏈碼的Init方法傳入所需的參數(shù)。
可以隨時(shí)使用如下命令查看鏈碼的提交狀態(tài):
docker exec cli peer lifecycle chaincode checkcommitreadiness \ --channelID mychannel --name mycc --version 1 --sequence 1 --output json
兩個(gè)機(jī)構(gòu)都已經(jīng)批準(zhǔn)了鏈碼,現(xiàn)在可以提交了。
STEP 5:向通道m(xù)ychannel提交鏈碼
鏈碼提交可以在一個(gè)peer節(jié)點(diǎn)上完成:
docker exec cli peer lifecycle chaincode commit -o orderer.example.com:7050 \ --tls \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ --peerAddresses peer0.org1.example.com:7051 \ --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ --peerAddresses peer0.org2.example.com:9051 \ --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ --channelID mychannel --name mycc --version 1 --sequence 1 --init-required
可以看到出了新塊#5:
注意我們?cè)赾ommit命令中已經(jīng)包含了init所需的參數(shù)。
同樣,我們可以使用querycommited命令來查看鏈碼的提交狀態(tài):
docker exec cli peer lifecycle chaincode querycommitted --channelID mychannel --name mycc
在鏈碼提交到通道之后,鏈碼的生命周期就完成了,鏈碼已經(jīng)可以訪問?,F(xiàn)在我們回到鏈碼的調(diào)用和查詢,這和之前的版本是一致的。
STEP 6:調(diào)用鏈碼的Init方法
SACC鏈碼的Init方法需要首先調(diào)用。
docker exec cli peer chaincode invoke -o orderer.example.com:7050 \ --tls \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ --peerAddresses peer0.org1.example.com:7051 \ --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ --peerAddresses peer0.org2.example.com:9051 \ --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ -C mychannel -n mycc --isInit -c '{"Args":["name","kc"]}'
現(xiàn)在可以查詢 鏈碼:
docker exec cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'
STEP 7:調(diào)用鏈碼的set()方法并從另一個(gè)peer節(jié)點(diǎn)查詢
和之前一樣,我們?cè)趐eer0.org1上調(diào)用鏈碼的set()
方法,在peer0.org2上進(jìn)行查詢:
# peer0.org1 docker exec cli peer chaincode invoke \ -o orderer.example.com:7050 \ --tls \ --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem \ --peerAddresses peer0.org1.example.com:7051 \ --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org1.example.com/peers/peer0.org1.example.com/tls/ca.crt \ --peerAddresses peer0.org2.example.com:9051 \ --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ -C mychannel -n mycc -c '{"Args":["set","name","Peter"]}' # peer0.org2 docker exec \ -e CORE_PEER_MSPCONFIGPATH=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/users/Admin@org2.example.com/msp \ -e CORE_PEER_ADDRESS=peer0.org2.example.com:9051 \ -e CORE_PEER_LOCALMSPID="Org2MSP" \ -e CORE_PEER_TLS_ROOTCERT_FILE=/opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/org2.example.com/peers/peer0.org2.example.com/tls/ca.crt \ cli peer chaincode query -C mychannel -n mycc -c '{"Args":["get","name"]}'
一切正常。
感謝各位的閱讀!關(guān)于“Fabric 2.0中鏈碼操作過程是怎么樣的”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!
網(wǎng)站欄目:Fabric2.0中鏈碼操作過程是怎么樣的
本文地址:http://aaarwkj.com/article14/iggcge.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、網(wǎng)站制作、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站內(nèi)鏈、虛擬主機(jī)、企業(yè)網(wǎng)站制作
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)