Fabric多台服务器的部署(二)

3、下载Fabric镜像

3.1.1 下载Fabric 源码

1、在后面的例子中,有些地方需要用到源码中提到的工具来编译和生成证书等,这里需要下载一下Fabric的源码,在本地下载Fabric官方提供的源码

git clone git@github.com:hyperledger/fabric.git

需要注意的时候,需要把下载好的源码放在$GOPATH里,这个环境变量是最初安装GO的设置的,如

echo $GOPATH
/Users/xuyao/go

那么fabric的源码地址路径应该是

/Users/xuyao/go/src/github.com/hyperledger/fabric/
3.1.2 下载Fabric镜像

 如果你看过Fabric官方的快速入门文档https://hyperledgercn.github.io/hyperledgerDocs/getting_started/,应该会对Fabric的镜像文件有个了解,在fabric/examples/e2e_cli文件夹下有个download-dockerimages.sh的脚本文件,他会帮你一键下载所需的镜像文件。

# 使脚本可执行
chmod +x download-dockerimages.sh
# 执行脚本
./download-dockerimages.sh

当然也可以使用下面命令下载镜像(需要翻墙)

curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0 
#此处是下载fabric-samples,如果想快速使用byfn可以参考此脚本,后面1.2.0是对应的版本号

也可以根据自己项目需求下载不同的版本

curl -sSL http://bit.ly/2ysbOFE | bash -s <fabric> <fabric-ca> <thirdparth>
curl -sSL http://bit.ly/2ysbOFE | bash -s 1.2.0 1.2.0 0.4.10
#后面三个参数分别代表Fabric, Fabric-ca和第三方平台镜像版本号

无法翻墙,可以用下面命令

curl -sSL https://raw.githubusercontent.com/hyperledger/fabric/master/scripts/bootstrap.sh | bash -s 1.2.0 1.2.0 0.4.10

下载完成后使用docker images可以看到下载的镜像文件

docker images #查看所以镜像文件
hyperledger/fabric-ca          latest               35311d8617b4        7 days ago          240 MB
hyperledger/fabric-ca          x86_64-1.0.0-alpha   35311d8617b4        7 days ago          240 MB
hyperledger/fabric-couchdb     latest               f3ce31e25872        7 days ago          1.51 GB
hyperledger/fabric-couchdb     x86_64-1.0.0-alpha   f3ce31e25872        7 days ago          1.51 GB
hyperledger/fabric-kafka       latest               589dad0b93fc        7 days ago          1.3 GB
hyperledger/fabric-kafka       x86_64-1.0.0-alpha   589dad0b93fc        7 days ago          1.3 GB
hyperledger/fabric-zookeeper   latest               9a51f5be29c1        7 days ago          1.31 GB
hyperledger/fabric-zookeeper   x86_64-1.0.0-alpha   9a51f5be29c1        7 days ago          1.31 GB
hyperledger/fabric-orderer     latest               5685fd77ab7c        7 days ago          182 MB
hyperledger/fabric-orderer     x86_64-1.0.0-alpha   5685fd77ab7c        7 days ago          182 MB
hyperledger/fabric-peer        latest               784c5d41ac1d        7 days ago          184 MB
hyperledger/fabric-peer        x86_64-1.0.0-alpha   784c5d41ac1d        7 days ago          184 MB
hyperledger/fabric-javaenv     latest               a08f85d8f0a9        7 days ago          1.42 GB
hyperledger/fabric-javaenv     x86_64-1.0.0-alpha   a08f85d8f0a9        7 days ago          1.42 GB
hyperledger/fabric-ccenv       latest               91792014b61f        7 days ago          1.29 GB
hyperledger/fabric-ccenv       x86_64-1.0.0-alpha   91792014b61f        7 days ago          1.29 GB
3.1.3 常用的Docker 命令
#停止正在运行的所有网络
docker stop -f $(docker ps -aq)

#删除正在运行的所有网络
docker rm -f $(docker ps -aq)

#删除某个镜像
docker rmi <IMAGE ID>

#查看某个容器的日志
docker logs -f  < container-id >

#进入某个容器内部
docker exec -it < container-id > bash

#查看docker 运行状态
service docker status

# 启动/关闭docker
sudo service docker start|stop

4、下载 Fabric-sample 源码

1、fabric-sample里有很多快速启动fabric的例子,官方文档给了一个快速启动first-network的例子 https://hyperledgercn.github.io/hyperledgerDocs/build_network_zh/,在first-network里面,每个组织持有2个peer节点,以及一个“solo”排序服务,这里一个比较简单的fabric网络,如果只是想跑一下fabric网络,试下手感的话,可以按照官方的文档来跑一篇。
  这里我们用的是官网提供的另一个例子,balance-transfer,它是一个集成了nodejs sdk的一个node.js的简单例子。

#下载fabric-sample
git clone git@github.com:hyperledger/fabric-samples.git

2、后期我们的项目都是用nodejs来做的,所以很多基础的东西可以复用balance-transfer里的,现在我们可以自己建了项目仓库叫trace_redwine,把fabric-samples/balance-transfer/里的文件全部copy到我们的trace_redwine里,删除一些不必要的文件,这里一个自己的fabric项目雏形就出来了。

5、修改配置脚本

5.1.1 修改crypto-config.yaml文件

  crypto-config.yaml文件是配置节点信息的,你可以配置你的orderer,peer数量,以及域名的设置,主要配置的是OrdererOrgs和PeerOrgs
OrdererOrgs的配置

OrdererOrgs:
  - Name: Orderer
    Domain: xuyao.com
    Specs:
      - Hostname: orderer1
      - Hostname: orderer2

PeerOrgs的配置信息

PeerOrgs:
  - Name: Org1 #组织1
    Domain: org1.xuyao.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1
  - Name: Org2 #组织2
    Domain: org2.xuyao.com
    EnableNodeOUs: true
    Template:
      Count: 2
    Users:
      Count: 1
5.1.2 使用generateArtifacts.sh脚本生成证书文件

  现在我们需要生成一些证书和启动这个fabric网络,生成证书的话我们可以使用官网提供的generateArtifacts.sh脚本来生成,文件路径在/gopath/src/github.com/hyperledger/fabric/examples/e2e_cli/下,稍微修改,因为我只需要生成证书,创世纪块,和channel.tx,具体脚本如下,需要说明的是如果你只是运行官方的first-network,可以忽略这些配置,因为first-network已经帮你生成好了这些东西

#!/usr/bin/env bash
CRYPTOGEN=$PWD/bin/cryptogen
CONFIGTXGEN=$PWD/bin/configtxgen
CHANNEL_NAME=$1
: ${CHANNEL_NAME:="mychannel"}
function buildCryptogenTools(){
    if [ -f "$CONFIGTXGEN" ]; then
        echo
    else
        echo "configtxgen not found"
        exit 1
    fi
}

function createPeerTemplate() {
    cp ../docker-composer-peer-template.yaml ../docker-composer
}

## Generates Org certs using cryptogen tool
function generateCerts (){
    echo
    echo "##########################################################"
    echo "##### Generate certificates using cryptogen tool #########"
    echo "##########################################################"
    if [ -d "crypto-config" ]; then
      rm -Rf crypto-config
    fi
    ${CRYPTOGEN} generate --config=./crypto-config.yaml
    echo
}

## Generate orderer genesis block , channel configuration transaction and anchor peer update transactions
function generateChannelArtifacts() {
    echo "##########################################################"
    echo "#########  Generating Orderer Genesis block ##############"
    echo "##########################################################"
    ${CONFIGTXGEN} -profile TwoOrgsOrdererGenesis -outputBlock ./genesis.block

    echo
    echo "#################################################################"
    echo "### Generating channel configuration transaction 'channel.tx' ###"
    echo "#################################################################"
    ${CONFIGTXGEN} -profile TwoOrgsChannel -outputCreateChannelTx ./mychannel.tx -channelID ${CHANNEL_NAME} 
}

buildCryptogenTools
generateCerts
generateChannelArtifacts

generateCerts是生成证书的方法,它会加载crypto-config.yaml里的配置信息,并根据你的配置信息来生成相应的证书。
generateChannelArtifacts是生成orderer的创世纪块(genesis.block)和channel.tx文件。
上面的脚本运行之后,整个Fabric网络需要的一些证书就完成了,以本地例子为例,生成如下的一些文件数据

├── crypto-config
│   ├── ordererOrganizations
│   │   └── mbasechain.com
│   │       ├── ca
│   │       │   ├── 2ae1db347d3137d66fda66f59fb33cd2c3c22a4aadf7f97f800491fb91a20c32_sk
│   │       │   └── ca.mbasechain.com-cert.pem
│   │       ├── msp
│   │       │   ├── admincerts
│   │       │   │   └── Admin@mbasechain.com-cert.pem
│   │       │   ├── cacerts
│   │       │   │   └── ca.mbasechain.com-cert.pem
│   │       │   └── tlscacerts
│   │       │       └── tlsca.mbasechain.com-cert.pem
│   │       ├── orderers
│   │       │   ├── orderer.mbasechain.com
│   │       │   │   └── msp
│   │       │   │       └── keystore
│   │       │   ├── orderer1.mbasechain.com
│   │       │   │   ├── msp
│   │       │   │   │   ├── admincerts
│   │       │   │   │   │   └── Admin@mbasechain.com-cert.pem
│   │       │   │   │   ├── cacerts
│   │       │   │   │   │   └── ca.mbasechain.com-cert.pem
│   │       │   │   │   ├── keystore
│   │       │   │   │   │   └── 9af18a6c9dd8f34db73a70c1d066e6948216db534af9e4f89029158089d56cf1_sk
│   │       │   │   │   ├── signcerts
│   │       │   │   │   │   └── orderer1.mbasechain.com-cert.pem
│   │       │   │   │   └── tlscacerts
│   │       │   │   │       └── tlsca.mbasechain.com-cert.pem
│   │       │   │   └── tls
│   │       │   │       ├── ca.crt
│   │       │   │       ├── server.crt
│   │       │   │       └── server.key
│   │       │   └── orderer2.mbasechain.com
│   │       │       ├── msp
│   │       │       │   ├── admincerts
│   │       │       │   │   └── Admin@mbasechain.com-cert.pem
│   │       │       │   ├── cacerts
│   │       │       │   │   └── ca.mbasechain.com-cert.pem
│   │       │       │   ├── keystore
│   │       │       │   │   └── fb54a7774228bf31311b5aa0ab58b4c0d3f9aa0e83bb1906cb6926c033445976_sk
│   │       │       │   ├── signcerts
│   │       │       │   │   └── orderer2.mbasechain.com-cert.pem
│   │       │       │   └── tlscacerts
│   │       │       │       └── tlsca.mbasechain.com-cert.pem
│   │       │       └── tls
│   │       │           ├── ca.crt
│   │       │           ├── server.crt
│   │       │           └── server.key
│   │       ├── tlsca
│   │       │   ├── 9ceda704a49805f19c0f3cde2c1d42096d8e14da697567b0a02b051656f735de_sk
│   │       │   └── tlsca.mbasechain.com-cert.pem
│   │       └── users
│   │           └── Admin@mbasechain.com
│   │               ├── msp
│   │               │   ├── admincerts
│   │               │   │   └── Admin@mbasechain.com-cert.pem
│   │               │   ├── cacerts
│   │               │   │   └── ca.mbasechain.com-cert.pem
│   │               │   ├── keystore
│   │               │   │   └── 1c7c1a76c08e30990192ed0f6eb24c2efd7492b684f92ebf844591fb38d8b020_sk
│   │               │   ├── signcerts
│   │               │   │   └── Admin@mbasechain.com-cert.pem
│   │               │   └── tlscacerts
│   │               │       └── tlsca.mbasechain.com-cert.pem
│   │               └── tls
│   │                   ├── ca.crt
│   │                   ├── client.crt
│   │                   └── client.key
│   └── peerOrganizations
│       ├── org1.mbasechain.com
│       │   ├── ca
│       │   │   ├── 6cb226be4aec981541e6cbdd66742139c1157e88afe06edfb16f12ecc3056bf5_sk
│       │   │   └── ca.org1.mbasechain.com-cert.pem
│       │   ├── msp
│       │   │   ├── admincerts
│       │   │   │   └── Admin@org1.mbasechain.com-cert.pem
│       │   │   ├── cacerts
│       │   │   │   └── ca.org1.mbasechain.com-cert.pem
│       │   │   ├── config.yaml
│       │   │   └── tlscacerts
│       │   │       └── tlsca.org1.mbasechain.com-cert.pem
│       │   ├── peers
│       │   │   ├── peer0.org1.mbasechain.com
│       │   │   │   ├── msp
│       │   │   │   │   ├── admincerts
│       │   │   │   │   │   └── Admin@org1.mbasechain.com-cert.pem
│       │   │   │   │   ├── cacerts
│       │   │   │   │   │   └── ca.org1.mbasechain.com-cert.pem
│       │   │   │   │   ├── config.yaml
│       │   │   │   │   ├── keystore
│       │   │   │   │   │   └── b9d2875104a103f635c8ec21757710455eec0fbfb2c59f7b33a09461b4138267_sk
│       │   │   │   │   ├── signcerts
│       │   │   │   │   │   └── peer0.org1.mbasechain.com-cert.pem
│       │   │   │   │   └── tlscacerts
│       │   │   │   │       └── tlsca.org1.mbasechain.com-cert.pem
│       │   │   │   └── tls
│       │   │   │       ├── ca.crt
│       │   │   │       ├── server.crt
│       │   │   │       └── server.key
│       │   │   └── peer1.org1.mbasechain.com
│       │   │       ├── msp
│       │   │       │   ├── admincerts
│       │   │       │   │   └── Admin@org1.mbasechain.com-cert.pem
│       │   │       │   ├── cacerts
│       │   │       │   │   └── ca.org1.mbasechain.com-cert.pem
│       │   │       │   ├── config.yaml
│       │   │       │   ├── keystore
│       │   │       │   │   └── 68da53988aa0b3e50b6a90ac90495b4021fdb3456bbca375aca13cf206d18b0c_sk
│       │   │       │   ├── signcerts
│       │   │       │   │   └── peer1.org1.mbasechain.com-cert.pem
│       │   │       │   └── tlscacerts
│       │   │       │       └── tlsca.org1.mbasechain.com-cert.pem
│       │   │       └── tls
│       │   │           ├── ca.crt
│       │   │           ├── server.crt
│       │   │           └── server.key
│       │   ├── tlsca
│       │   │   ├── b2ef19d2488129396546090955ddf2d1ec267cd699dc2218516df72f5ea235f4_sk
│       │   │   └── tlsca.org1.mbasechain.com-cert.pem
│       │   └── users
│       │       ├── Admin@org1.mbasechain.com
│       │       │   ├── msp
│       │       │   │   ├── admincerts
│       │       │   │   │   └── Admin@org1.mbasechain.com-cert.pem
│       │       │   │   ├── cacerts
│       │       │   │   │   └── ca.org1.mbasechain.com-cert.pem
│       │       │   │   ├── keystore
│       │       │   │   │   └── 12f72b7332170a7b8e4214eb268c419053a2386f34b149f3e7c5820f767a2d30_sk
│       │       │   │   ├── signcerts
│       │       │   │   │   └── Admin@org1.mbasechain.com-cert.pem
│       │       │   │   └── tlscacerts
│       │       │   │       └── tlsca.org1.mbasechain.com-cert.pem
│       │       │   └── tls
│       │       │       ├── ca.crt
│       │       │       ├── client.crt
│       │       │       └── client.key
│       │       └── User1@org1.mbasechain.com
│       │           ├── msp
│       │           │   ├── admincerts
│       │           │   │   └── User1@org1.mbasechain.com-cert.pem
│       │           │   ├── cacerts
│       │           │   │   └── ca.org1.mbasechain.com-cert.pem
│       │           │   ├── keystore
│       │           │   │   └── 610899489aa3d881dcc6e9f3d421981003b1504e5b15c00426edd69505ef3519_sk
│       │           │   ├── signcerts
│       │           │   │   └── User1@org1.mbasechain.com-cert.pem
│       │           │   └── tlscacerts
│       │           │       └── tlsca.org1.mbasechain.com-cert.pem
│       │           └── tls
│       │               ├── ca.crt
│       │               ├── client.crt
│       │               └── client.key
│       ├── org2.mbasechain.com
│       │   ├── ca
│       │   │   ├── 018041cad6bac4a43ab80e736ba333a759a14ee6e88226944ec904dfcba633ab_sk
│       │   │   └── ca.org2.mbasechain.com-cert.pem
│       │   ├── msp
│       │   │   ├── admincerts
│       │   │   │   └── Admin@org2.mbasechain.com-cert.pem
│       │   │   ├── cacerts
│       │   │   │   └── ca.org2.mbasechain.com-cert.pem
│       │   │   ├── config.yaml
│       │   │   └── tlscacerts
│       │   │       └── tlsca.org2.mbasechain.com-cert.pem
│       │   ├── peers
│       │   │   ├── peer0.org2.mbasechain.com
│       │   │   │   ├── msp
│       │   │   │   │   ├── admincerts
│       │   │   │   │   │   └── Admin@org2.mbasechain.com-cert.pem
│       │   │   │   │   ├── cacerts
│       │   │   │   │   │   └── ca.org2.mbasechain.com-cert.pem
│       │   │   │   │   ├── config.yaml
│       │   │   │   │   ├── keystore
│       │   │   │   │   │   └── cfb79d8ab3c543a8732227cd2b441ce30e82ff1d4aad5f59c1338454edeeddf1_sk
│       │   │   │   │   ├── signcerts
│       │   │   │   │   │   └── peer0.org2.mbasechain.com-cert.pem
│       │   │   │   │   └── tlscacerts
│       │   │   │   │       └── tlsca.org2.mbasechain.com-cert.pem
│       │   │   │   └── tls
│       │   │   │       ├── ca.crt
│       │   │   │       ├── server.crt
│       │   │   │       └── server.key
│       │   │   └── peer1.org2.mbasechain.com
│       │   │       ├── msp
│       │   │       │   ├── admincerts
│       │   │       │   │   └── Admin@org2.mbasechain.com-cert.pem
│       │   │       │   ├── cacerts
│       │   │       │   │   └── ca.org2.mbasechain.com-cert.pem
│       │   │       │   ├── config.yaml
│       │   │       │   ├── keystore
│       │   │       │   │   └── b92cbb64895e522299770c9f84ad9954753f348d926da956d4458cf545b99ef6_sk
│       │   │       │   ├── signcerts
│       │   │       │   │   └── peer1.org2.mbasechain.com-cert.pem
│       │   │       │   └── tlscacerts
│       │   │       │       └── tlsca.org2.mbasechain.com-cert.pem
│       │   │       └── tls
│       │   │           ├── ca.crt
│       │   │           ├── server.crt
│       │   │           └── server.key
│       │   ├── tlsca
│       │   │   ├── 2674e511ae5eb66b4964a2a93cc917f5e8fbd49e95fc97d12b546c9ce933e932_sk
│       │   │   └── tlsca.org2.mbasechain.com-cert.pem
│       │   └── users
│       │       ├── Admin@org2.mbasechain.com
│       │       │   ├── msp
│       │       │   │   ├── admincerts
│       │       │   │   │   └── Admin@org2.mbasechain.com-cert.pem
│       │       │   │   ├── cacerts
│       │       │   │   │   └── ca.org2.mbasechain.com-cert.pem
│       │       │   │   ├── keystore
│       │       │   │   │   └── 4ca087cf7e8ecd260b84782ec8456b693ada673b902d525fb0dfcbf4bc797e38_sk
│       │       │   │   ├── signcerts
│       │       │   │   │   └── Admin@org2.mbasechain.com-cert.pem
│       │       │   │   └── tlscacerts
│       │       │   │       └── tlsca.org2.mbasechain.com-cert.pem
│       │       │   └── tls
│       │       │       ├── ca.crt
│       │       │       ├── client.crt
│       │       │       └── client.key
│       │       └── User1@org2.mbasechain.com
│       │           ├── msp
│       │           │   ├── admincerts
│       │           │   │   └── User1@org2.mbasechain.com-cert.pem
│       │           │   ├── cacerts
│       │           │   │   └── ca.org2.mbasechain.com-cert.pem
│       │           │   ├── keystore
│       │           │   │   └── 950ff48168df356652a4fa6d5f9d3aa7d6d7694045cc3bb7f83587686794a345_sk
│       │           │   ├── signcerts
│       │           │   │   └── User1@org2.mbasechain.com-cert.pem
│       │           │   └── tlscacerts
│       │           │       └── tlsca.org2.mbasechain.com-cert.pem
│       │           └── tls
│       │               ├── ca.crt
│       │               ├── client.crt
│       │               └── client.key
├── crypto-config.yaml
├── genesis.block
├── mychannel.tx
未完待续。。。
参考资料

https://hyperledgercn.github.io/hyperledgerDocs/getting_started/
https://www.codetd.com/article/2709144
https://hyperledgercn.github.io/hyperledgerDocs/build_network_zh/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容