SUI學(xué)習(xí)記錄

學(xué)習(xí)日志

2023-11-10

安裝SUI錢包瀏覽器插件, EDGE瀏覽器的插件中心里, SUI插件版本存在落后, 需要在Chrome的插件中心安裝, 鏈接為https://chrome.google.com/webstore/detail/sui-wallet/opcgpfmipidbgpenhmajoajpbobppdil/related

可以使用Google賬號(hào)登錄, 獲取錢包地址

2023-11-11

1. windows搭建環(huán)境

1) 在https://github.com/MystenLabs/sui/releases中下載windows工具包

1.PNG

2) 解壓后配置環(huán)境變量, 路徑按實(shí)際路徑配置

D:\sui-mainnet-v1.13.0-windows-x86_64\external-crates\move\target\release

D:\sui-mainnet-v1.13.0-windows-x86_64\target\release

2.PNG

3) 簡(jiǎn)化命令

把exe文件名稱中-windows-x86_64刪除

4.PNG

4) 測(cè)試命令

3.PNG

2. 瀏覽器插件連接Sui開發(fā)鏈

1) 在Sui瀏覽器插件中切換到開發(fā)鏈

7.PNG

2) 直接點(diǎn)擊按鈕即可獲取token

12.PNG

3. 命令行工具連接Sui開發(fā)鏈

1) 連接

sui client envs

默認(rèn)則是連接到開發(fā)鏈, 會(huì)創(chuàng)建錢包地址和恢復(fù)碼

addr: [0x1f0663c112ee1f1a75566039d849557a972293d99f71e45e9b9b72caed9b71a2]
Secret Recovery Phrase: [grant indicate avocado rail state minimum defense balcony pupil very attend sentence]
8.PNG

2) 在瀏覽器插件里嘗試導(dǎo)入

輸入前面生成的恢復(fù)碼


9.PNG

輸入密碼


10.PNG

可以看到成功導(dǎo)入


11.PNG

3) 請(qǐng)求測(cè)試用的tokens

curl --location --request POST 'https://faucet.devnet.sui.io/gas' --header 'Content-Type: application/json' --data-raw '{"FixedAmountRequest": {"recipient": "錢包地址"}}'

請(qǐng)求一次會(huì)獲取10 SUI

6.PNG

5.PNG

2023-11-18

1. 智能合約

1. 創(chuàng)建move項(xiàng)目

sui move new hello_world

2. 在sources文件夾中創(chuàng)建hello.move

#[lint_allow(self_transfer)]
module hello_world::hello_world {

    use std::string;
    use sui::object::{Self, UID};
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};

    /// 一個(gè)包含一個(gè)任意的字符串
    struct HelloWorldObject has key, store {
        id: UID,
        text: string::String
    }

    // 這個(gè)函數(shù)創(chuàng)建了 HelloWoirldObject 定制類型的一個(gè)新實(shí)例,然后使用 Sui 系統(tǒng)中的轉(zhuǎn)移函數(shù) transfer 將其發(fā)送給交易的調(diào)用者
    public fun mint(ctx: &mut TxContext) {
        let object = HelloWorldObject {
            id: object::new(ctx),
            text: string::utf8(b"Hello World!")
        };
        transfer::public_transfer(object, tx_context::sender(ctx));
    }

}

3. 構(gòu)建項(xiàng)目

sui move build

4. 切換到開發(fā)鏈

sui client switch --env devnet

添加測(cè)試鏈

sui client new-env --alias testnet --rpc https://fullnode.testnet.sui.io:443

5. 發(fā)布

sui client publish --gas-budget 1000000000
1.png

2023-11-19

創(chuàng)建一個(gè)token coin

module zcdc_coin::ZCDCCOIN {
    use std::option;
    use sui::coin::{Self, Coin, TreasuryCap};
    use sui::transfer;
    use sui::tx_context::{Self, TxContext};

    struct ZCDCCOIN has drop {}

    /// Module initializer is called once on module publish. A treasury
    /// cap is sent to the publisher, who then controls minting and burning
    fun init(witness: ZCDCCOIN, ctx: &mut TxContext) {
        let (treasury, metadata) = coin::create_currency(witness, 6, b"ZCDCCoin", b"ZCDCCoin", b"ZCDCCoin is NO.1", option::none(), ctx);
        transfer::public_freeze_object(metadata);
        transfer::public_transfer(treasury, tx_context::sender(ctx));
    }

    public entry fun mint (
        treasury_cap: &mut TreasuryCap<ZCDCCOIN>, amount: u64, recipient: address, ctx: &mut TxContext
    ) {
        coin::mint_and_transfer(treasury_cap, amount, recipient, ctx)
    }

    public entry fun burn (
        treasury_cap: &mut TreasuryCap<ZCDCCOIN>, coin: Coin<ZCDCCOIN>
    ) {
        coin::burn(treasury_cap, coin);
    }
}

獲取coin到錢包

sui client call --function mint --module ZCDCCOIN --package 0xe50f9a836d7e97a6ecbab576efda70b1bbb20a54eaaeceac4b191e5d66f929af --args 0x99006836e95823650ee06342033125c8760c7c364ce7f2fde52c473447244cba 10  0x1f0663c112ee1f1a75566039d849557a972293d99f71e45e9b9b72caed9b71a2 --gas-budget 1000000000 

--module 后面是coin的module名

--package 后面是coin的package


2.png

--args 后面第一個(gè)參數(shù)是coin的id
在自己錢包里找到發(fā)布的coin的object id


4.png
3.png

--args 后面第二個(gè)參數(shù) 是數(shù)量

--args 后面第三個(gè)參數(shù) 是轉(zhuǎn)到的錢包地址

執(zhí)行結(jié)果

5.png
6.png

創(chuàng)建dapp應(yīng)用

1. 安裝依賴

mkdir dapp
cd dapp

pnpm init
pnpm add -D @mysten/sui.js

2. 新建index.js, 寫從開發(fā)環(huán)境獲取sui的程序

import { getFullnodeUrl, SuiClient } from '@mysten/sui.js/client';
import { getFaucetHost, requestSuiFromFaucetV0 } from '@mysten/sui.js/faucet';
import { MIST_PER_SUI } from '@mysten/sui.js/utils';
 
// replace <YOUR_SUI_ADDRESS> with your actual address, which is in the form 0x123...
const MY_ADDRESS = '0x1f0663c112ee1f1a75566039d849557a972293d99f71e45e9b9b72caed9b71a2';
 
// create a new SuiClient object pointing to the network you want to use
const suiClient = new SuiClient({ url: getFullnodeUrl('devnet') });
 
// Convert MIST to Sui
const balance = (balance) => {
    return Number.parseInt(balance.totalBalance) / Number(MIST_PER_SUI);
};
 
// store the JSON representation for the SUI the address owns before using faucet
const suiBefore = await suiClient.getBalance({
    owner: MY_ADDRESS,
});
 
await requestSuiFromFaucetV0({
    // use getFaucetHost to make sure you're using correct faucet address
    // you can also just use the address (see Sui TypeScript SDK Quick Start for values)
    // 獲取對(duì)應(yīng)環(huán)境的水龍頭地址(測(cè)試環(huán)境, 開發(fā)環(huán)境, 本地環(huán)境)
    host: getFaucetHost('devnet'),
    recipient: MY_ADDRESS,
});
 
// store the JSON representation for the SUI the address owns after using faucet
const suiAfter = await suiClient.getBalance({
    owner: MY_ADDRESS,
});
 
// Output result to console.
console.log(
    `Balance before faucet: ${balance(suiBefore)} SUI. Balance after: ${balance(
        suiAfter,
    )} SUI. Hello, SUI!`,
);

3. 新建vue3項(xiàng)目, 圖形化查詢錢包的coins

1.png

2023-11-22

1. 創(chuàng)建nft合約

module nft::nft_test {
    use sui::url::{Self, Url}
    use std::string;
    use sui::object::{Self, ID, UID};
    use sui::event;
    use sui::tx_context::{Self, TxContext};

    struct NftTest has key, store {
        id: UID,
        name: string::String,
        description: string::String,

    }

    // =======event ==========
    struct NFTMinted has copy, drop {
        object_id: ID,
        creator: address,
        name: string::String,
    }
s
    // 獲取名稱
    public fun name(nft: &NftTest): &string::String {
        &nft.name
    }

    // 獲取描述
    public fun description(nft: &NftTest): &string::String {
        &nft.description
    }

    // 獲取鏈接
    public fun url(nft: &NftTest): &Url {
        &nft.url
    }

    // ========== 入口函數(shù) =======
    // 創(chuàng)建新nft
    public entry fun mint_to_sender (
        name: vector<u8>,
        description: vector<u8>,
        url: vector<u8>,
        ctx: &mut TxContext
    ) {
        let sender = tx_context::sender(ctx);
        let nft = NftTest {
            id: object::new(ctx),
            name: string::uft8(name),
            description: string::uft8(description),
            url: url::new_unsafe_from_bytes(url)
        };
        event::emit(NFTMinted {
            object_id: Object::id(&nft),
            creator: sender,
            name: nft.name
        });

        transfer::public_transfer(nft, sender)
    }

    // 轉(zhuǎn)移nft給新的所有者
    public entry fun transfer(
        nft: NftTest,
        recipient: address,
        _: &mut TxContext
    ) {
        transfer::public_transfer(nft, recipient)
    }

    // 更新nft介紹
    public entry fun update_description(
        nft: &mut NftTest,
        new_description: vector<u8>,
        _: &mut TxContext
    ) {
        nft.description = string::utf8(new_description)
    }

    public entry fun burn(nft: NftTest, _: &mut TxContext) {
        let NftTest {
            id,
            name: _,
            description: _,
            url: _
        } = nft;
        object::delete(id)
    }
}

2. build

sui move build

3. 發(fā)布

sui client publish --gas-budget 1000000000
1.PNG

https://suiexplorer.com/object/0x2f24f83514c11ed8c04e72a01106c8698fd232bedc485afa834f1fcc7debda8f?network=devnet

4. 在頁面上觸發(fā)創(chuàng)建事件

2.PNG

20231129

1. 安裝sui-move-analysis

1) 下載windows安裝包

https://github.com/movebit/move/releases

2) 配置windows環(huán)境變量

3) 配置vscode插件

1.PNG

配置sui-move-analysis路徑, 注意路徑最后去除exe

D:\\sui-move-analyzer\sui-move-analyzer

20231130

1. 命令行里使用zklogin登錄谷歌賬號(hào)

sui keytool zk-login-sign-and-execute-tx --max-epoch 999

--max-epoch設(shè)置失效時(shí)間

會(huì)出現(xiàn)當(dāng)前所有支持zklogin的平臺(tái)單點(diǎn)登錄地址


2.png

登錄后會(huì)跳轉(zhuǎn)到sui官方地址, 直接復(fù)制粘貼到命令行中即可


1.png

遇到問題: 每次用谷歌的zklogin后 地址都不一樣

2. 生成帶圖片nft

主要需要配置object display

module znft::my_zpet {
    use sui::tx_context::{sender, TxContext};
    use std::string::{utf8, String};
    use sui::transfer;
    use sui::object::{Self, ID, UID};
    use sui::event;
    
    use sui::package::{claim};
    use sui::display;

    struct Zpet has key, store {
        id: UID,
        name: String,
        image_url: String,
        description: String
    }

    struct ZPETMinted has copy, drop {
        object_id: ID,
        creator: address,
        name: String,
        image_url: String,
        description: String
    }

    struct MY_ZPET has drop {}

    public fun name(nft: &Zpet): &String {
        &nft.name
    }

    public fun description(nft: &Zpet): &String {
        &nft.description
    }

    public fun image_url(nft: &Zpet): &String {
        &nft.image_url
    }

    fun init (otw: MY_ZPET, ctx: &mut TxContext) {
        let keys = vector[
            utf8(b"name"),
            utf8(b"link"),
            utf8(b"image_url"),
            utf8(b"description"),
            utf8(b"project_url"),
            utf8(b"creator"),
        ];

        let values = vector[
            utf8(b"{name}"),
            utf8(b""),
            utf8(b"{image_url}"),
            utf8(b"{description}"),
            utf8(b""),
            utf8(b"zcdc")
        ];

        let publisher = claim(otw, ctx);

        let display = display::new_with_fields<Zpet>(
            &publisher, keys, values, ctx
        );

        display::update_version(&mut display);

        transfer::public_transfer(publisher, sender(ctx));
        transfer::public_transfer(display, sender(ctx));
    }

    fun create_nft (
        name: String,
        image_url: String,
        description: String,
        ctx: &mut TxContext
    ): Zpet {
        let sender = sender(ctx);
        let id = object::new(ctx);
        let nft = Zpet { id, name, image_url, description };

        event::emit(ZPETMinted {
            object_id: object::id(&nft),
            creator: sender,
            name: nft.name,
            image_url: nft.image_url,
            description: nft.description
        });
        nft
    }


    public entry fun transfer(
        name: String,
        image_url: String,
        description: String,
        recipient: address,
        ctx: &mut TxContext
    ) {
        transfer::public_transfer(create_nft(name, image_url, description, ctx), recipient)
    }

    public entry fun update_description(
        nft: &mut Zpet,
        new_description: vector<u8>,
        _: &mut TxContext
    ) {
        nft.description = utf8(new_description)
    }

    public entry fun burn(nft: Zpet, _: &mut TxContext) {
        let Zpet {
            id,
            name: _,
            image_url: _,
            description: _
        } = nft;
        object::delete(id)
    }
}

剛開始是在mint的方法里直接transfer, 但是會(huì)報(bào)warning

3.png

https://zh.blog.sui.io/linter-compile-warnings-update/

解決方法就是, mint的時(shí)候不進(jìn)行transfer, 而是在transfer的方法里調(diào)用mint

4.png

生成后的nft


5.png

3. 使用nft storage進(jìn)行鏈上存儲(chǔ)圖片

https://nft.storage/

20231202

1. dapp sdk查詢賬號(hào)的指定nft

getOwnedObjects方法獲取當(dāng)前賬號(hào)的objects

options中指定獲取的內(nèi)容

filter中寫篩選條件, 指定type

解構(gòu)中 data即為獲取的object列表

refetch用來重新獲取

  const { data, isPending, error, refetch } = useSuiClientQuery(
    'getOwnedObjects',
    {
      owner: account?.address as string,
      options: {
        showType: true,
        showDisplay: true,
        showContent: true
      },
      filter: {
        MatchAll: [
          {
            StructType: `${PACKAGEID}::my_zpet::Zpet`,
          },
          {
            AddressOwner: account?.address || '',
          },
        ],
      },
    },
    {
      enabled: !!account,
    }
  )

2. 獲取當(dāng)前賬號(hào)的余額

使用的方法為getBalance

import { useCurrentAccount, useSuiClientQuery } from "@mysten/dapp-kit";
import { Flex, Text } from "@radix-ui/themes";

export function OwnedBalances() {
  const account = useCurrentAccount();
  const { data, isPending, error } = useSuiClientQuery(
    "getBalance",
    {
      owner: account?.address as string,
    },
    {
      enabled: !!account,
    },
  );

  if (!account) {
    return;
  }

  if (error) {
    return <Flex>Error: {error.message}</Flex>;
  }

  if (isPending || !data) {
    return <Flex>加載中...</Flex>;
  }

  return (
    <Text>
       余額: { data && data.totalBalance ? Number(data.totalBalance) / 1000000000 : 0 } SUI
    </Text>
  );
}

3. dapp調(diào)用package的event

moveCall調(diào)用方法, pure()包裹參數(shù), mutate觸發(fā)方法, 調(diào)用錢包

import muyu from './assets/木魚.svg'
import muyugun from './assets/木魚棍.svg'
import soundMp3 from './assets/sound.mp3'
import { Howl } from 'howler'
import { useState } from 'react'
import { TransactionBlock } from "@mysten/sui.js/transactions"
import { PACKAGEID } from './constants'
import { useCurrentAccount, useSignAndExecuteTransactionBlock } from '@mysten/dapp-kit'
import { toast } from 'react-toastify'

interface ImgObj {
  [key: string]: {
    name: string,
    url: string
  }
}

const obj: ImgObj = {
  1: {
    name: '賽博功德記錄本',
    url: 'https://bafybeibigwt5csazd3f2fzycxfx2q7i7vna4linuqdlwr5fbaxsjgb45ai.ipfs.nftstorage.link/ipfs/bafybeibigwt5csazd3f2fzycxfx2q7i7vna4linuqdlwr5fbaxsjgb45ai/111.png',
  },
  166: {
    name: '賽博功德:166',
    url: 'https://bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde.ipfs.nftstorage.link/ipfs/bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde/166.png',
  },
  288: {
    name: '賽博功德:288',
    url: 'https://bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde.ipfs.nftstorage.link/ipfs/bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde/288.png',
  },
  588: {
    name: '賽博功德:588',
    url: 'https://bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde.ipfs.nftstorage.link/ipfs/bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde/588.png',
  },
  1888: {
    name: '賽博功德:1888',
    url: 'https://bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde.ipfs.nftstorage.link/ipfs/bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde/1888.png',
  },
  2888: {
    name: '賽博功德:2888',
    url: 'https://bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde.ipfs.nftstorage.link/ipfs/bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde/2888.png',
  },
  8888: {
    name: '賽博功德:8888',
    url: 'https://bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde.ipfs.nftstorage.link/ipfs/bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde/8888.png',
  },
  zzes: {
    name: '賽博功德無量',
    url: 'https://bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde.ipfs.nftstorage.link/ipfs/bafybeickygqtbkdpip7snru6gduxvf4thlrbom6l3qz3gvpkzph2sw6tde/zzes.png'
  },
}

const sound = new Howl({
  src: [soundMp3],
  html5: true
})
export function GameBlock() {
  const [showGun, setShowGun] = useState(false)
  const [num, setNum] = useState(0)
  const { mutate } = useSignAndExecuteTransactionBlock()
  const account = useCurrentAccount()
  const doIt = () => {
    sound.play()
    console.log(showGun)
    setShowGun(true)
  }
  const cancelIt = () => {
    toast.success('賽博功德加一')
    sound.stop()
    setShowGun(false)
    setNum(num + 1)
    const txb = new TransactionBlock()
    
    let imgObj: {
      name: string,
      url: string
    } | undefined = undefined
    const index = num + 1 + ''
    if (Object.keys(obj).includes(index)) {
      imgObj = obj[index]
    }
    if (index.substring(1) && index.substring(1).split('').length > 5 && index.substring(1).split('').every(str => str === '8')) {
      imgObj = obj['zzes']
    }
    if (account && imgObj) {
      txb.moveCall({
        target: `${PACKAGEID}::my_zpet::transfer`,
        arguments: [
          txb.pure(imgObj.name),
          txb.pure(imgObj.url),
          txb.pure('賽博功德紀(jì)念NFT'),
          txb.pure(account.address)
        ]
      })
      mutate(
        {
          transactionBlock: txb
        },
        {
          onError: (err) => {
            toast.error(err.message)
          },
          onSuccess: (result) => {
            toast.success(`賽博功德紀(jì)念NFT領(lǐng)取成功: ${result.digest}`)
          },
        }
      )
    }

  }
  return (
    <div className="game-block" onMouseDown={doIt} onMouseUp={cancelIt}>
      <img className="muyu" src={muyu} />
      { showGun && (<img className="gun" src={muyugun} />) }
      <div className="gd">賽博功德:{num}</div>
    </div>
  );
}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末煤蚌,一起剝皮案震驚了整個(gè)濱河市锯茄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谈火,老刑警劉巖侈询,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異糯耍,居然都是意外死亡扔字,警方通過查閱死者的電腦和手機(jī)舰涌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門丢烘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人糕簿,你說我怎么就攤上這事荒揣∨窠牵” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵系任,是天一觀的道長(zhǎng)恳蹲。 經(jīng)常有香客問我,道長(zhǎng)俩滥,這世上最難降的妖魔是什么嘉蕾? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮霜旧,結(jié)果婚禮上错忱,老公的妹妹穿的比我還像新娘。我一直安慰自己挂据,他們只是感情好以清,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著崎逃,像睡著了一般掷倔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上个绍,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天勒葱,我揣著相機(jī)與錄音浪汪,去河邊找鬼。 笑死凛虽,一個(gè)胖子當(dāng)著我的面吹牛死遭,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播凯旋,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼呀潭,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了至非?” 一聲冷哼從身側(cè)響起蜗侈,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎睡蟋,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體枷颊,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡戳杀,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了夭苗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信卡。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖题造,靈堂內(nèi)的尸體忽然破棺而出傍菇,到底是詐尸還是另有隱情,我是刑警寧澤界赔,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布丢习,位于F島的核電站,受9級(jí)特大地震影響淮悼,放射性物質(zhì)發(fā)生泄漏咐低。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一袜腥、第九天 我趴在偏房一處隱蔽的房頂上張望见擦。 院中可真熱鬧,春花似錦羹令、人聲如沸鲤屡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酒来。三九已至,卻和暖如春癌刽,著一層夾襖步出監(jiān)牢的瞬間役首,已是汗流浹背尝丐。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留衡奥,地道東北人爹袁。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像矮固,于是被迫代替她去往敵國和親失息。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容