The Libra Blockchain開發者文檔-(4)Libra上的第一筆交易

本文檔將指導您在Libra 區塊鏈上執行您的第一筆交易。 在執行第一筆交易的步驟之前,我們建議您閱讀以下文檔,以熟悉Libra生態系統和Libra協議的關鍵方面:


歡迎頁

Libra協議核心概念

我們提供了一個命令行界面(CLI)客戶端來與區塊鏈進行交互。

約定準備條件

本文檔中的所有命令均假定已經完成如下準備:

您運行的是Linux(基于Red Hat或Debian)或macOS系統。

可以穩定地連接到互聯網。

git已在您的系統上安裝。

macOS上已安裝Homebrew。

yum或者apt-get已在您的Linux系統上安裝。

提交交易的步驟

在這個例子中,我們將下載必要的Libra組件并在兩個用戶(Alice和Bob)之間執行一個交易操作。

執行以下步驟將交易提交到Libra testnet上的驗證程序節點:

克隆并構建Libra Core.

編譯Libra CLI客戶端并連接到testnet.

創建Alice和Bob的帳戶.

鑄幣并添加到Alice和Bob的賬戶.

提交交易.

克隆并編譯Libra Core

克隆Libra Core庫

git clone https://github.com/libra/libra.git

安裝Libra Core

要安裝Libra Core,請切換到libra目錄并運行安裝腳本來安裝相關的依賴項,如下所示:

cd libra

./scripts/dev_setup.sh

安裝腳本執行以下操作:

安裝rustup — rustup是Rust編程語言的安裝程序,Libra Core是基于Rust實現的。

安裝版本所需的rust-toolchain.

安裝CMake — 用于編譯項目。

安裝protoc — 緩沖區編譯器。

安裝Go — 用于編譯緩沖區編譯器。

如果您的安裝失敗,詳見故障排除說明

編譯Libra CLI客戶端并連接到Testnet

運行客戶端,連接到Libra testnet網絡的驗證器節點,如下圖所示:

./scripts/cli/start_cli_testnet.sh

使用cargo(Rust的包管理器)編譯和運行客戶端,并將客戶端連接到testnet上的驗證器節點。

客戶端連接到testnet上的節點后,您將看到以下輸出。 要隨時退出客戶端,請使用quit命令。

usage: <command> <args>

Use the following commands:

account | a

? Account operations

query | q

? Query operations

transfer | transferb | t | tb

? <sender_account_address>|<sender_account_ref_id> <receiver_account_address>|<receiver_account_ref_id> <number_of_coins> [gas_unit_price (default=0)] [max_gas_amount (default 10000)] Suffix 'b' is for blocking.

? Transfer coins from account to another.

help | h

? Prints this help

quit | q!

? Exit this client

Please, input commands:

libra%

如果您在編譯運行客戶端和連接到testnet時遇到問題,請參閱故障排除說明.

注意: 如果要在系統上本地運行驗證器節點,請按照運行本地驗證中的說明進行操作。 創建帳戶,鑄幣和執行交易的說明與testnet上的節點相同。

創建Alice和Bob的賬戶

將客戶端連接到testnet后,可以運行CLI命令來創建新帳戶。這里為兩個用戶(Alice和Bob)創建帳戶。

步驟1:檢查CLI客戶端是否在您的系統上運行

出現一個libra%命令行提示符表示您的Libra CLI客戶端正在運行。 要查看account命令的幫助信息,請輸入“account”,如下所示:

libra% account

usage: account <arg>

Use the following args for this command:

create | c

? Create an account. Returns reference ID to use in other operations

list | la

? Print all accounts that were created or loaded

recover | r <file path>

? Recover Libra wallet from the file path

write | w <file name>

? Save Libra wallet mnemonic recovery seed to disk

mint | mintb | m | mb <receiver account> <number of coins>

? Mint coins to the account. Suffix 'b' is for blocking

步驟2: 創建Alice賬戶

請注意,使用CLI創建帳戶不會更新區塊鏈,只會創建本地密鑰對。

要創建Alice的帳戶,請輸入以下命令:

libra% account create

成功后輸出如下:

>> Creating/retrieving next account from wallet

Created/retrieved account #0 address 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8

#0是Alice帳戶的索引,十六進制字符串是Alice帳戶的地址。

索引只是引用Alice帳戶的一種方式。 帳戶索引是本地CLI索引,可以在其他CLI命令中使用,以便用戶方便地引用他們創建的帳戶。

該指數對區塊鏈毫無意義。

只有當通過鑄幣將任何一筆錢添加到Alice的賬戶時,才會在區塊鏈上創建Alice的賬戶,或者通過來自另一個用戶的轉賬將錢轉移到Alice的賬戶。

請注意,您也可以在CLI命令中使用十六進制地址。 帳戶索引只是帳戶地址的方便顯示。

步驟3: 創建Bob的賬戶

要創建Bob的帳戶,請重復之前帳戶創建命令:

libra% account create

成功后輸出如下:

>> Creating/retrieving next account from wallet

Created/retrieved account #1 address 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7

#1 是Bob帳戶的索引,十六進制字符串是Bob帳戶的地址。有關索引的更多詳細信息,請參閱創建Alice的賬戶

步驟4 (可選): 賬戶列表

要列出您創建的帳戶,請輸入以下命令:

libra% account list

成功后輸出如下:

User account index: 0, address: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, sequence number: 0

User account index: 1, address: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, sequence number: 0

帳戶中的序列號表示從該帳戶發送的交易數。 每次從該帳戶發送的交易被執行后并存儲在區塊鏈中時,它會遞增。 要了解更多信息,請參閱序列號.

添加Libra Coin到Alice和Bob賬戶

在testnet上創建和鑄幣是通過Faucet完成的。 Faucet是一種與testnet一起運行的服務。 此服務僅用于為testnet創建硬幣,并沒有在主網上. 它創建的Libra Coin并沒有真實的價值,假設創建Alice和Bob的賬戶, 分別使用了索引0和索引1,您可以按照以下步驟將Libra Coin添加到兩個帳戶。

步驟1: 添加100個Libra到Alice賬戶

鑄幣Libra,并添加到Alice的帳戶,輸入以下命令:

libra% account mint 0 110

0 是Alice賬戶的索引號。

110 是要添加到Alice賬戶的Libra數量。

賬戶成功運行鑄幣命令,也會在Libra區塊鏈上創建Alice的賬戶。

成功后輸出如下:

>> Minting coins

Mint request submitted

請注意,提交請求時,這意味著它已成功添加到內存池(testnet上的驗證程序節點)。 但并不一定意味著它將執行完成。 稍后,我們將查詢帳戶余額以確認鑄幣是否成功。

如果您的帳戶鑄幣命令未成功提交您的請求,請參閱故障排除說明

步驟2: 添加52個Libra到Bob賬戶

鑄幣Libra,并添加到Bob的帳戶,輸入以下命令:

libra% account mint 1 52

1 是Bob賬戶的索引號。

52 是要添加到Bob賬戶的Libra數量。

賬戶成功運行鑄幣命令,也會在Libra區塊鏈上創建Bob的賬戶,在區塊鏈上創建Bob帳戶的另一種方法是將錢從Alice的帳戶交易到Bob的帳戶。

成功后輸出如下:

>> Minting coins

Mint request submitted

如果您的帳戶鑄幣命令未成功提交您的請求,請參閱故障排除說明

步驟3: 余額檢查

檢查Alice賬戶的余額,運行如下命令:

libra% query balance 0

成功后輸出如下:

Balance is: 110

檢查Bob賬戶的余額,運行如下命令:

libra% query balance 1

成功后輸出如下:

Balance is: 52

提交交易

在我們提交將Libra從Alice的賬戶轉移到Bob的賬戶的交易之前,我們將查詢每個賬戶的序列號。 這將有助于我們了解交易執行過程中如何更改每個帳戶的序列號。

查詢賬戶的序列號

libra% query sequence 0

>> Getting current sequence number

Sequence number is: 0

libra% query sequence 1

>> Getting current sequence number

Sequence number is: 0

在query sequence 0, 0是Alice的帳戶的索引。 Alice和Bob的帳戶的序列號都為0,即表示到目前為止尚未執行Alice或Bob的帳戶中的任何交易。

轉賬

提交一個從Alice賬戶轉賬10個Libra到Bob賬戶的交易,輸入以下命令:

libra% transfer 0 1 10

0是Alice的帳戶索引。

1是Bob的帳戶索引。

10是從Alice的賬戶交易到Bob賬戶的Libra數量。

成功后輸出如下:

>> Transferring

Transaction submitted to validator

To query for transaction status, run: query txn_acc_seq 0 0 <fetch_events=true|false>

您可以使用命令query txn_acc_seq 0 0 true(按帳戶和序列號進行交易)來檢索有關您剛提交的交易的信息。 第一個參數是發件人帳戶的本地索引,第二個參數是帳戶的序列號。要查看此命令的示例輸出,請參閱輸出示例.

您剛剛將您的交易提交到testnet上的驗證器節點,它包含在驗證器的內存池。這并不一定意味著您的交易已被執行。 理論上,如果系統運行緩慢或過載,則需要一些時間才能看到結果,您可能需要通過查詢帳戶多次檢查。 要查詢索引為0的帳戶,可以使用命令query account_state 0.預期輸出顯示在輸出示例

要對傳輸命令出錯進行故障排除,請參閱故障排除說明.

塊傳輸命令: 你可以使用transferb命令 (如下所示), 而不是transfer命令。只有將交易提交到區塊鏈上transferb命令才會提交,并給客戶端進行反饋響應顯示,一個例子如下所示:

libra% transferb 0 1 10

參考交易的生命周期了解交易從提交到執行和存儲的整個過程。

查詢交易后序列號

libra% query sequence 0

>> Getting current sequence number

Sequence number is: 1

libra% query sequence 1

>> Getting current sequence number

Sequence number is: 0

Alice的帳號(索引0)的序號為1表示到目前為止已經從Alice的帳戶發送了一個交易。 Bob的帳戶(索引1)的序列號為0表示到目前為止尚未從Bob的帳戶發送任何交易。 每次從帳戶發送交易時,序列號都會增加1。

檢查交易后兩個賬戶的余額

要檢查兩個帳戶中的最終余額,請按照此頁面步驟操作,再次查詢余額. 如果您的交易(轉賬)成功執行,您應該在Alice的賬戶中看到100個Libra,在Bob的賬戶中看到62個Libra。

libra% query balance 0

Balance is: 100

libra% query balance 1

Balance is: 62

恭喜!

您已成功在Libra testnet上執行了您的交易,并將10個Libra從Alice的賬戶轉移到了Bob的賬戶!

故障排除

安裝

更新ust:

在libra目錄運行rustup update.

從libra目錄重新運行安裝腳本:

./scripts/dev_setup.sh

客戶端編譯運行

如果您遇到構建失敗,請嘗試從libra目錄中刪除cargo.lock文件:

rm Cargo.lock

如果您的客戶端沒有連接到testnet:

檢查網絡連接。

確保您使用的是最新版本的客戶端。 拉取最新的Libra Core并重新運行客戶端:

./scripts/cli/start_cli_testnet.sh

鑄幣添加到賬戶

如果您在testnet上連接的驗證程序節點不可用,您將收到“服務器不可用”消息,如下所示:

libra% account mint 0 110

>> Minting coins

[ERROR] Error minting coins: Server unavailable, please retry and/or check **if** host passed to the client is running

如果您在提交交易后未更新余額,請稍等片刻再次查詢余額。 如果區塊鏈上大量交易在提交,那么可能會有延遲。 如果您的余額仍未更新,請再次嘗試鑄幣。

要檢查帳戶是否存在,請查詢帳戶狀態。 對于索引為0的帳戶,請輸入以下內容:

libra% query account_state 0

交易命令

如果testnet驗證器節點(客戶端已確定連接了)不可用或您與testnet的連接已超時,您將看到此錯誤:

libra% transfer 0 1 10

>> Transferring

[ERROR] Failed to perform transaction: Server unavailable, please retry and/or check if host passed to the client is running

解決交易故障:

檢查testnet的連接。

查詢發件人帳戶以確保其確實存在。 對索引為0的帳戶使用以下命令:

query account_state 0

使用quit或q!退出, 然后重新運行以下命令以連接到testnet:

從libre目錄運行./scripts/cli/start_cli_testnet.sh

查詢命令輸出示例

附加查詢命令的示例輸出

此示例將使用帳戶和序列號查詢單個交易的詳細信息。

libra% query txn_acc_seq 0 0 true

>> Getting committed transaction by account and sequence number

Committed transaction: SignedTransaction {

{ raw_txn: RawTransaction {

? ? sender: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8,

? ? sequence_number: 0,

? ? payload: {,

? ? ? transaction: peer_to_peer_transaction,

? ? ? args: [

? ? ? ? {ADDRESS: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7},

? ? ? ? {U64: 10000000},

? ? ? ]

? ? },

? ? max_gas_amount: 10000,

? ? gas_unit_price: 0,

? ? expiration_time: 1560466424s,

},

public_key: 55af3fe3f28550a2f1e5ebf073ef193feda44344d94c463b48be202aa0b3255d,

signature: Signature( R: CompressedEdwardsY: [210, 23, 214, 62, 228, 179, 64, 147, 81, 159, 180, 138, 100, 211, 111, 139, 178, 148, 81, 1, 240, 135, 148, 145, 104, 234, 227, 239, 198, 153, 13, 199], s: Scalar{

? bytes: [203, 76, 105, 49, 64, 130, 162, 81, 22, 237, 159, 26, 80, 181, 111, 94, 84, 6, 152, 126, 181, 192, 62, 103, 130, 94, 246, 174, 139, 214, 3, 15],

} ),

}

}

Events:

ContractEvent { access_path: AccessPath { address: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/sent_events_count/" } , index: 0, event_data: AccountEvent { account: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, amount: 10000000 } }

ContractEvent { access_path: AccessPath { address: 8337aac709a41fe6be03cad8878a0d4209740b1608f8a81566c9a7d4b95a2ec7, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/received_events_count/" } , index: 0, event_data: AccountEvent { account: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8, amount: 10000000 } }

請注意,交易金額以microlibra單位顯示.

查詢事件

在以下示例中,我們將從索引為0的帳戶查詢“已發送”事件。您將注意到,我們從此帳戶發送了一個交易,所以只有一個交易。 還返回當前區塊鏈狀態。以便可執行驗證 ,確保沒有丟失任何交易- 這在查詢沒有返回“限制”交易時完成。

libra% query event 0 sent 0 true 10

>> Getting events by account and event type.

EventWithProof {

? transaction_version: 3,

? event_index: 0,

? event: ContractEvent { access_path: AccessPath { address: e7460e02058b36d28e8eef03f0834c605d3d6c57455b8ec9c3f0a3c8b89f248b, type: Resource, hash: "217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc97", suffix: "/sent_events_count/" } , index: 0, event_data: AccountEvent { account: 46efbad798a739c088e0e98dd9d592c27c7eb45ba1f8ccbdfc00bd4d7f2947f3, amount: 10000000 } },

? proof: EventProof { ledger_info_to_transaction_info_proof: AccumulatorProof { siblings: [HashValue(62570ae9a994bcb20c03c055667a4966fa50d0f17867dd5819465072fd2c58ba), HashValue(cce2cf325714511e7d04fa5b48babacd5af943198e6c1ac3bdd39c53c87cb84c)] }, transaction_info: TransactionInfo { signed_transaction_hash: HashValue(69bed01473e0a64140d96e46f594bc4b463e88e244b694e962b7e19fde17f30d), state_root_hash: HashValue(5809605d5eed94c73e57f615190c165b11c5e26873012285cc6b131e0817c430), event_root_hash: HashValue(645df3dee8f53a0d018449392b8e9da814d258da7346cf64cd96824f914e68f9), gas_used: 0 }, transaction_info_to_event_proof: AccumulatorProof { siblings: [HashValue(5d0e2ebf0952f0989cb5b38b2a9b52a09e8d804e893cb99bf9fa2c74ab304bb1)] } }

}

Last event state: Some(

? ? AccountStateWithProof {

? ? ? ? version: 3,

? ? ? ? blob: Some(

? ? ? ? ? ? AccountStateBlob {

? ? ? ? ? ? Raw: 0x010000002100000001217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc974400000020000000e7460e02058b36d28e8eef03f0834c605d3d6c57455b8ec9c3f0a3c8b89f248b00e1f50500000000000000000000000001000000000000000100000000000000

? ? ? ? ? ? Decoded: Ok(

? ? ? ? ? ? ? ? AccountResource {

? ? ? ? ? ? ? ? ? ? balance: 100000000,

? ? ? ? ? ? ? ? ? ? sequence_number: 1,

? ? ? ? ? ? ? ? ? ? authentication_key: 0xe7460e02058b36d28e8eef03f0834c605d3d6c57455b8ec9c3f0a3c8b89f248b,

? ? ? ? ? ? ? ? ? ? sent_events_count: 1,

? ? ? ? ? ? ? ? ? ? received_events_count: 0,

? ? ? ? ? ? ? ? },

? ? ? ? ? ? )

? ? ? ? ? ? },

? ? ? ? ),

? ? ? ? proof: AccountStateProof {

? ? ? ? ? ? ledger_info_to_transaction_info_proof: AccumulatorProof {

? ? ? ? ? ? ? ? siblings: [

? ? ? ? ? ? ? ? ? ? HashValue(62570ae9a994bcb20c03c055667a4966fa50d0f17867dd5819465072fd2c58ba),

? ? ? ? ? ? ? ? ? ? HashValue(cce2cf325714511e7d04fa5b48babacd5af943198e6c1ac3bdd39c53c87cb84c),

? ? ? ? ? ? ? ? ],

? ? ? ? ? ? },

? ? ? ? ? ? transaction_info: TransactionInfo {

? ? ? ? ? ? ? ? signed_transaction_hash: HashValue(69bed01473e0a64140d96e46f594bc4b463e88e244b694e962b7e19fde17f30d),

? ? ? ? ? ? ? ? state_root_hash: HashValue(5809605d5eed94c73e57f615190c165b11c5e26873012285cc6b131e0817c430),

? ? ? ? ? ? ? ? event_root_hash: HashValue(645df3dee8f53a0d018449392b8e9da814d258da7346cf64cd96824f914e68f9),

? ? ? ? ? ? ? ? gas_used: 0,

? ? ? ? ? ? },

? ? ? ? ? ? transaction_info_to_account_proof: SparseMerkleProof {

? ? ? ? ? ? ? ? leaf: Some(

? ? ? ? ? ? ? ? ? ? (

? ? ? ? ? ? ? ? ? ? ? ? HashValue(c0fbd63b0ae4abfe57c8f24f912f164ba0537741e948a65f00d3fae0f9373981),

? ? ? ? ? ? ? ? ? ? ? ? HashValue(fc45057fd64606c7ca40256b48fbe486660930bfef1a9e941cafcae380c25871),

? ? ? ? ? ? ? ? ? ? ),

? ? ? ? ? ? ? ? ),

? ? ? ? ? ? ? ? siblings: [

? ? ? ? ? ? ? ? ? ? HashValue(4136803b3ba779bb2c1daae7360f3f839e6fef16ae742590a6698b350a5fc376),

? ? ? ? ? ? ? ? ? ? HashValue(5350415253455f4d45524b4c455f504c414345484f4c4445525f484153480000),

? ? ? ? ? ? ? ? ? ? HashValue(a9a6bda22dd6ee78ddd3a42da152b9bd39797b7da738e9d6023f407741810378),

? ? ? ? ? ? ? ? ],

? ? ? ? ? ? },

? ? ? ? },

? ? },

)

查詢賬戶狀態

在此示例中,我們將查詢單個帳戶的狀態。

libra% query account_state 0

>> Getting latest account state

Latest account state is:

Account: 3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8

State: Some(

? ? AccountStateBlob {

? ? Raw: 0x010000002100000001217da6c6b3e19f1825cfb2676daecce3bf3de03cf26647c78df00b371b25cc9744000000200000003ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a800e1f50500000000000000000000000001000000000000000100000000000000

? ? Decoded: Ok(

? ? ? ? AccountResource {

? ? ? ? ? ? balance: 100000000,

? ? ? ? ? ? sequence_number: 1,

? ? ? ? ? ? authentication_key: 0x3ed8e5fafae4147b2a105a0be2f81972883441cfaaadf93fc0868e7a0253c4a8,

? ? ? ? ? ? sent_events_count: 1,

? ? ? ? ? ? received_events_count: 0,

? ? ? ? },

? ? )

? ? },

)

Blockchain Version: 3

運行本地驗證器節點

要在本地計算機上啟動驗證程序節點,并創建本地區塊鏈網絡(未連接到Libra testnet),請確保您已經按照安裝Libra Core, 切換到Libra Core庫的根目錄,然后運行libra_swarm如下顯示:

$cd~/libra$ cargo run -p libra_swarm -- -s

-p libra_swarm- 使用cargo運行libra_swarm包,該包啟動由一個節點組成的本地區塊鏈。

-s啟動本地客戶端以連接到本地區塊鏈。

要查看啟動節點和連接Libra區塊鏈的其他選項,請運行:

$ cargo run -p libra_swarm -- -h

Cargo命令可能需要一些時間才能執行完成。 如果此命令的執行完成且沒有錯誤,則系統上運行Libra CLI客戶端實例和Libra驗證器節點。 同時應該能看到包含CLI客戶端菜單和libra%提示的輸出.

交易生命周期

執行完第一筆交易后,您可以參考該文件交易生命周期:

從“底層”說明交易從提交到執行的整個生命周期

在Libra生態系統中提交和執行交易時,了解Libra驗證器的每個邏輯組件之間的交互。

參考

Welcome page.

Libra Protocol: Key Concepts— Introduces you to the fundamental concepts of the Libra protocol.

Getting Started With Move— Introduces you to a new blockchain programming language called Move.

Life of a Transaction— Provides a look at what happens "under the hood" when a transaction is submitted and executed.

Libra Core Overview— Provides the concept and implementation details of the Libra Core components through READMEs.

CLI Guide— Lists the commands (and their usage) of the Libra CLI client.

Libra Glossary— Provides a quick reference to Libra terminology.

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,563評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,694評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,672評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,965評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,690評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 56,019評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,013評論 3 449
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,188評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,718評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,438評論 3 360
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,667評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,149評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,845評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,252評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,590評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,384評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,635評論 2 380

推薦閱讀更多精彩內容