Omni/USDT PHP開發包簡介

OmniTool開發包適用于為PHP應用快速增加對Omni Layer/USDT數字資產的支持能力,即支持使用自有Omni Layer節點的應用場景,也支持基于第三方API服務和離線裸交易的輕量級部署場景。下載地址:omni/usdt php開發包

1、OmniTool開發包簡介

OmniTool開發包主要包含以下特性:

  • 完善的Omni Layer節點RPC封裝
  • 支持利用自有節點或第三方服務獲取指定地址的utxo集合
  • 支持離線生成omni代幣轉賬裸交易
  • 支持利用自有節點或第三方服務廣播裸交易

OmniTool支持本地部署的Omnicored節點,也支持blockchain.info、btc.com等提供的開放API,要增加對其他第三方服務的支持也非常簡單,只需要參考代碼實現如下接口:

  • UtxoCollectorInterface:utxo收集器
  • UtxoSelectorInterface:utxo篩選器
  • BroadcasterInterface:裸交易廣播器
  • ExplorerInterface:數據查詢接口

OmniTool軟件包運行在Php 7.1+環境下,當前版本1.0.0,主要類/接口及關系如下圖所示:

omnitool arch

OmniTool的主要代碼文件清單如下:

<table class="table table-striped">
<thead>
<tr><th>代碼文件</th><th>說明</th></tr>
</thead>
<tbody>
<tr><td>omni.php/src/RpcClient.php</td><td>Omni Layer的RPC協議封裝類</td></tr>
<tr><td>omni.php/src/RpcModule.php</td><td>Omni Layer的RPC協議分模塊訪問語法糖</td></tr>
<tr><td>omni.php/src/protocol-spec.json</td><td>Omni Layer協議描述元信息</td></tr>
<tr><td>omni.php/src/SerializeBuffer.php</td><td>Omni Layer協議序列化緩沖區</td></tr>
<tr><td>omni.php/src/PayloadFactory.php</td><td>Omni Layer協議載荷工廠類</td></tr>
<tr><td>omni.php/src/Utxo.php</td><td>未消費交易輸出類</td></tr>
<tr><td>omni.php/src/UtxoBag.php</td><td>Utxo集合類</td></tr>
<tr><td>omni.php/src/UtxoCollectorInterface.php</td><td>Utxo收集器接口</td></tr>
<tr><td>omni.php/src/LocalUtxoCollector.php</td><td>基于OmniCore節點的Utxo收集器實現</td></tr>
<tr><td>omni.php/src/CloudUtxoCollector.php</td><td>基于第三方服務的Utxo收集器實現</td></tr>
<tr><td>omni.php/src/UtxoSelectorInterface.php</td><td>Utxo篩選器接口</td></tr>
<tr><td>omni.php/src/DefaultUtxoSelector.php</td><td>默認的Utxo篩選器實現</td></tr>
<tr><td>omni.php/src/BroadcasterInterface.php</td><td>裸交易廣播器接口</td></tr>
<tr><td>omni.php/src/LocalBroadcaster.php</td><td>基于OmniCore節點的裸交易廣播器實現</td></tr>
<tr><td>omni.php/src/CloudBroadcaster.php</td><td>基于第三方服務的裸交易廣播器實現</td></tr>
<tr><td>omni.php/src/ExplorerInterface.php</td><td>數據查詢接口</td></tr>
<tr><td>omni.php/src/CloudExplorer.php</td><td>基于第三方服務的數據查詢接口實現</td></tr>
<tr><td>omni.php/src/LocalExplorer.php</td><td>基于OmniCore節點的數據查詢接口實現</td></tr>
<tr><td>omni.php/src/Utils.php</td><td>常用輔助函數</td></tr>
<tr><td>omni.php/src/Wallet.php</td><td>離線錢包類</td></tr>
<tr><td>demo/rpc-demo.php</td><td>RpcClient使用示例,完整實現OMNI代幣的發行與轉賬</td></tr>
<tr><td>demo/omni-tx-cloud.php</td><td>創建并廣播Omni代幣轉賬裸交易,使用第三方云服務API</td></tr>
<tr><td>demo/omni-tx-local.php</td><td>創建并廣播Omni代幣轉賬裸交易,使用自有節點</td></tr>
<tr><td>demo/btc-tx-cloud.php</td><td>創建并廣播比特幣轉賬裸交易,使用第三方云服務API</td></tr>
<tr><td>demo/btc-tx-local.php</td><td>創建并廣播比特幣轉賬裸交易,使用自有節點</td></tr>
<tr><td>demo/explorer-cloud.php</td><td>查詢指定的地址比特幣余額/Omni代幣余額,使用第三方云服務API</td></tr>
<tr><td>demo/explorer-local.php</td><td>查詢指定地址的比特幣余額/Omni代幣余額,使用自有節點</td></tr>
<tr><td>demo/wallet-init.php</td><td>本地錢包初始化</td></tr>
<tr><td>demo/wallet-demo.php</td><td>錢包載入、裸交易構造和廣播</td></tr>
<tr><td>vendor</td><td>第三方依賴包目錄</td></tr>
<tr><td>composer.json</td><td>composer配置文件</td></tr>
</tbody>
</table>

2、RpcClient類使用說明

RpcClient類封裝了Omni Layer的RPC接口協議。創建RpcClient對象時,需要傳入
包含有效身份信息的節點RPC URL。例如,假設安裝在本機的omnicored節點軟件配置如下:

  • rpcuser:user
  • rpcpassword:123456
  • rpcport:8332

那么可以使用如下的代碼來實例化RpcClient:

use \OmniTool\RpcClient;

$client = new RpcClient(
            'http://user:123456@localhost:8332'   /*節點RPC接口的URL*/
          );

Omni Core節點在Bitcoin原有的RPC接口之外,擴充了額外的接口用來操作Omni層的數據,這些擴展的RPC接口采用omni_前綴以區隔于Bitcoin的原有RPC接口。為了便于區隔這兩層的RPC調用,RpcClient引入了協議子模塊的概念,將Bitcoin的原始RPC接口和Omni的擴展RPC接口分別掛接到btc子模塊和omni子模塊。

例如,獲取某個地址的USDT代幣余額需要使用Omni層的omni_getbalance調用,這個RPC調用對應于RpcClient實例的omni子模塊的getBalance()方法。下面的代碼獲取地址1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P的USDT(資產ID:31)余額:

$ret = $client->omni->getBalance(
          '1EXoDusjGwvnjZUyKkxZ4UHEf77z6A5S4P',   /*地址*/
          31                                      /*資產ID:USDT*/
       );

類似的,可以使用omni_send調用來執行簡單的USDT轉賬,這個調用對應于RpcClient實例的omni子模塊的send()方法。下面的代碼從地址3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY向地址37FaKponF7zqoMLUjEiko25pDiuVH5YLEa轉入100.0個USDT代幣:

$ret = $client->omni->send(
          '3M9qvHKtgARhqcMtM5cRT9VaiDJ5PSfQGY',    /*代幣轉出地址*/
          '37FaKponF7zqoMLUjEiko25pDiuVH5YLEa',    /*代幣轉入地址*/
          31,                                      /*代幣ID:USDT*/
          "100.00"                                 /*轉移的代幣數量*/
       );

原有的bitoin層的RPC接口則可以通過RpcClient的btc子模塊來訪問。例如,使用listunspent調用來獲取本地節點中指定地址的utxo:

$ret = $client->btc->listUnspent(
          6,                                        /*最小確認數*/
          999999,                                   /*最大確認數*/
          ['mgnucj8nYqdrPFh2JfZSB1NmUThUGnmsqe']    /*地址清單*/  
       );

開發包中的demo/rpc-demo.php示例代碼使用RpcClient類完整演示了在Omni層的代幣發行與轉賬功能,如果你計劃搭建自己的Omni Core節點,相信這個示例會有很大幫助。

3、Wallet類使用說明

如果不愿意搭建自己的Omni Core節點,而是希望基于第三方API為自己的PHP應用增加對Omni Layer/USDT的支持,那么最簡單的方法是使用離線交易的入口類Wallet。

Wallet類的主要作用是根據創建并廣播Omni代幣轉賬裸交易或比特幣轉賬裸交易,它的基本使用步驟如下:

  • 使用Wallet::cloud()靜態方法創建一個支持云端API服務的Wallet實例
  • 使用addKey()方法將必要的私鑰加入該Wallet實例,例如轉出地址的私鑰,因為Wallet需要利用私鑰對裸交易進行簽名
  • 使用omniSendTx()方法生成Omni代幣轉賬裸交易,或者使用btcSendTx()方法比特幣轉賬裸交易
  • 使用broadcast()方法廣播裸交易

3.1 Omni代幣轉賬

使用Wallet實現的Omni代幣轉賬示例代碼如下,說明見注釋:

<?php
require('../vendor/autoload.php');

use OmniTool\Wallet;                              /*引入開發包*/

$wallet = Wallet::cloud(
            './demo.wallet',                      /*錢包文件地址,自動創建*/
            'testnet'                             /*網絡ID*/
          );
$prvKey = '4aec8e45106....00d5c5af494a4e05b';     /*私鑰:16進制字符串*/            
$wallet->addKey($prvKey);                         /*將私鑰加入錢包,只需加入一次*/

$addressList = $wallet->getAddressList();         /*返回錢包管理的所有地址,數組*/

$rawtx = $wallet->omniSendTx(
            $addressList[0],                      /*發送方地址,私鑰必須已經加入錢包*/
            'mgYPLmNuZymK...e2XUNF6VFnT',         /*接收方地址*/
            2,                                    /*轉賬OMNI代幣ID,2:TOMN*/
            '0.000001'                            /*轉賬OMNI代幣數量*/
         );

$ret = $wallet->broadcast($rawtx);                /*廣播OMNI裸交易*/
var_dump($ret);

注意:

  • Wallet實例利用錢包中的私鑰生成地址列表,并利用這些地址從第三方服務獲取utxo信息。因此需要錢包中的私鑰對應地址在鏈上有utxo存在,Wallet對象才能夠成功構造裸交易。
  • 轉賬目標地址應當與創建Wallet對象時指定的鏈ID一致,例如mainnet的p2pkh地址,前綴應當為1

3.2 指定Omni交易的手續費支付地址

在Omni協議層不需要支付交易手續費,但是Omni交易所嵌入的比特幣交易依然需要支付手續費。默認情況下omniSendTx()方法使用發送方地址支付比特幣交易手續費,但可以傳入額外的參數來指定其他地址支付交易手續費,當你的PHP應用需要實現多賬戶歸集功能時,使用統一的手續費支付地址會更容易管理一些。

例如,下面的代碼使用地址mnRo8JyTHDd5NxRb3UvGbAhCBPQTQ4UZ8W支付omni交易的手續費:

$rawtx = $wallet->omniSendTx(
            $addressList[0],                      /*發送方地址,私鑰必須已經加入錢包*/
            'mgYPLmNuZymK...e2XUNF6VFnT',         /*接收方地址*/
            2,                                    /*轉賬OMNI代幣ID,2:TOMN*/
            '0.000001',                           /*轉賬OMNI代幣數量*/
            'mnRo8JyTHDd5...CBPQTQ4UZ8W'          /*交易手續費支付地址*/
         );

注意:

  • 即使指定了余額充足的手續費支付地址,Omni交易的發送方依然必須有微量的比特幣余額(546 SATOSHI),因為Omni協議需要交易發送方至少有一個可用UTXO。
  • 手續費支付地址同時也是找零地址,多余的比特幣將返回至該地址

3.3 指定Omni交易的比特幣轉賬數量

由于Omni交易要求發送方必須有可用的UTXO,因此為了便于接收Omni代幣的地址可以繼續流通所持有的Omni代幣,omniSendTx()方法在默認情況下將向接收方地址轉入微量的比特幣(546 SATOSHI),可以在調用該方法時修改這個默認數值。

例如,下面的代碼轉入接收方1000個SATOSHI:

$rawtx = $wallet->omniSendTx(
            $addressList[0],                      /*發送方地址,私鑰必須已經加入錢包*/
            'mgYPLmNuZymK...e2XUNF6VFnT',         /*接收方地址
            2,                                    /*轉賬OMNI代幣ID,2:TOMN*/
            '0.000001',                           /*轉賬OMNI代幣數量*/
            'mnRo8JyTHDd5...CBPQTQ4UZ8W',         /*交易手續費支付地址*/
            1000                                  /*轉賬比特幣數量,單位:SATOSHI*/
         );

3.4 比特幣轉賬

OmniTool也支持比特幣轉賬裸交易的生成與廣播。

例如,下面的代碼從錢包的第一個地址向指定接受地址轉入1000個SATOSHI:

<?php
require('../vendor/autoload.php');

use OmniTool\Wallet;

$wallet = Wallet::cloud('./demo.wallet','testnet');
$addressList = $wallet->getAddressList();

$rawtx = $wallet->btcSendTx(
                    $addressList[0],                /*發送方地址*/
                    'moneyqMan7u...8qVrc9ikLP',     /*接收方地址*/
                    1000,                           /*轉賬比特幣數量,單位:SATOSHI*/
                    500                             /*手續費,單位:SATOSHI*/
                  );                       
echo 'btc rawtx => ' . $rawtx . PHP_EOL;

$ret = $wallet->broadcast($rawtx);                  /*廣播裸交易*/

默認情況下,btcSendTx()使用發送方地址作為找零地址,也可以在調用時指定其他地址作為找零地址,例如,下面的代碼創建一個新地址接收找零:

$changeAddress = $wallet->getNewAddress();          /*創建新地址*/
$rawtx = $wallet->btcSendTx(
                    $addressList[0],                /*發送方地址*/
                    'moneyqMan7u...8qVrc9ikLP',     /*接收方地址*/
                    1000,                           /*轉賬比特幣數量,單位:SATOSHI*/
                    500,                            /*手續費,單位:SATOSHI*/
                    $changeAddress                  /*找零地址*/
                  );                       

4、UTXO收集器

OmniTool使用接口UtxoCollectorInterface來約定UTXO的收集功能。該接口的實現需要支持獲取指定地址的候選UTXO集合,可指定多個地址。

接口方法:

  • collect($addressList):提取并返回候選UTXO集合

參數$addressList用來聲明要收集UTXO的地址清單,類型為數組。

當前實現類:

  • CloudUtxoCollector:基于blockchain.com的開放API實現的Utxo收集器
  • LocalUtxoCollector:基于omnicored節點RPC API實現的Utxo收集器

例如,下面的代碼使用CloudUtxoCollector獲取地址mi8BvbK73nDQfaN3acpaFGYQKhfQ5ysKRn的UTXO:

use OmniTool\CloudUtxoCollector;

$collector = new CloudUtxoCollector(
                    'testnet'                       /*測試網*/
                 );
$candidateBag = $collector->collect(
                    ['mi8BvbK73nDQ...KhfQ5ysKRn']   /*地址清單*/
                );

5、UTXO篩選器

OmniTool使用UtxoSelectorInterface來約定UTXO篩選功能。該接口的實現需要根據目標金額從候選UTXO中選擇可用UTXO,并返回新的UtxoBag實例。

接口方法:

  • select(target,candidates):選擇可消費UTXO,返回UtxoBag對象

參數$target聲明要達成的最低金額目標,單位:wei。

參數$candidates是候選的utxo集合,通常是UtxoCollectorInterface實現對象的collect()調用返回的UtxoBag對象。

當前實現類:

  • DefaultUtxoSelector

例如下面的代碼使用DefaultUtxoSelector實例從候選UTXO中刪選出至少100000 wei 的UTXO:

use OmniTool\DefaultUtxoSelector;

$selector = new DefaultUtxoSelector();
$selectedBag = $selector->select(
                  100000,                         /*最低目標金額*/
                  $candidateBag                   /*候選UTXO集合*/
               );

考慮到UTXO的不可分割性,篩選出的若干UTXO的總和,有可能超過目標金額??梢允褂肬txoBag實例的getTotal()方法查看集合中的UTXO總額:

echo 'total wei in bag => ' . $selectedBag->getTotal() . PHP_EOL;

6、裸交易廣播器

OmniTool使用BroadcasterInterface來約定裸交易廣播的功能。該接口的實現應當將裸交易廣播到Omni網絡中。

接口方法:

  • broadcast($rawtx):廣播裸交易

參數$rawtx用來聲明要廣播的裸交易,類型為16進制字符串。

當前實現類:

  • CloudBroadcaster
  • LocalBroadcaster

例如,下面的代碼使用CloudBroadcaster將裸交易碼流廣播到Omni網絡中:

use OmniTool\CloudBroadcaster;

$broadcaster = new CloudBroadcaster(
                      'testnet'                     /*測試網*/
                   );
$ret = $broadcaster->broadcast(
        '01000000011da9283b4...59f58488ac00000000'  /*裸交易*/
       );

7、數據查詢接口

OmniTool使用ExplorerInterface來約定Omni數據查詢功能。

接口方法:

  • getBtcBalance($address):查詢指定地址的比特幣余額
  • getOmniBalance(address,propertyId):查詢指定地址的Omni代幣余額

當前實現類:

  • CloudBroadcaster
  • LocalBroadcaster

例如,下面的代碼使用CloudExplorer查詢地址1Jekm8ZswQmDhLFMp9cuYb1Kcq26riFp6m的比特幣余額與USDT代幣余額:

use OmniTool\CloudExplorer;

$explorer = new CloudExplorer('mainnet');

$address = '1Jekm8ZswQmDhLFMp9cuYb1Kcq26riFp6m';

$balance = $explorer->getBtcBalance($address);
echo 'btc balance => ' . PHP_EOL;

$balance = $explorer->getOmniBalance($address,31);
echo 'usdt balance => ' . $balance['balance']. PHP_EOL;

如果你想學習區塊鏈并在Blockchain Technologies建立職業生涯,那么請查看我們分享的一些以太坊、比特幣、EOS、Fabric、Tendermint等區塊鏈相關的交互式在線編程實戰教程:

  • java以太坊開發教程,主要是針對java和android程序員進行區塊鏈以太坊開發的web3j詳解。
  • python以太坊,主要是針對python工程師使用web3.py進行區塊鏈以太坊開發的詳解。
  • php以太坊,主要是介紹使用php進行智能合約開發交互,進行賬號創建、交易、轉賬、代幣開發以及過濾器和交易等內容。
  • 以太坊入門教程,主要介紹智能合約與dapp應用開發,適合入門。
  • 以太坊開發進階教程,主要是介紹使用node.js、mongodb、區塊鏈、ipfs實現去中心化電商DApp實戰,適合進階。
  • ERC721以太坊通證實戰,課程以一個數字藝術品創作與分享DApp的實戰開發為主線,深入講解以太坊非同質化通證的概念、標準與開發方案。內容包含ERC-721標準的自主實現,講解OpenZeppelin合約代碼庫二次開發,實戰項目采用Truffle,IPFS,實現了通證以及去中心化的通證交易所。
  • C#以太坊,主要講解如何使用C#開發基于.Net的以太坊應用,包括賬戶管理、狀態與交易、智能合約開發與交互、過濾器和交易等。
  • java比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Java代碼中集成比特幣支持功能,例如創建地址、管理錢包、構造裸交易等,是Java工程師不可多得的比特幣開發學習課程。
  • php比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在Php代碼中集成比特幣支持功能,例如創建地址、管理錢包、構造裸交易等,是Php工程師不可多得的比特幣開發學習課程。
  • c#比特幣開發教程,本課程面向初學者,內容即涵蓋比特幣的核心概念,例如區塊鏈存儲、去中心化共識機制、密鑰與腳本、交易與UTXO等,同時也詳細講解如何在C#代碼中集成比特幣支持功能,例如創建地址、管理錢包、構造裸交易等,是C#工程師不可多得的比特幣開發學習課程。
  • EOS入門教程,本課程幫助你快速入門EOS區塊鏈去中心化應用的開發,內容涵蓋EOS工具鏈、賬戶與錢包、發行代幣、智能合約開發與部署、使用代碼與智能合約交互等核心知識點,最后綜合運用各知識點完成一個便簽DApp的開發。
  • 深入淺出玩轉EOS錢包開發,本課程以手機EOS錢包的完整開發過程為主線,深入學習EOS區塊鏈應用開發,課程內容即涵蓋賬戶、計算資源、智能合約、動作與交易等EOS區塊鏈的核心概念,同時也講解如何使用eosjs和eosjs-ecc開發包訪問EOS區塊鏈,以及如何在React前端應用中集成對EOS區塊鏈的支持。課程內容深入淺出,非常適合前端工程師深入學習EOS區塊鏈應用開發。
  • Hyperledger Fabric 區塊鏈開發詳解,本課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啟動、鏈碼通信接口等核心概念,也包含Fabric網絡設計、nodejs鏈碼與應用開發的操作實踐,是Nodejs工程師學習Fabric區塊鏈開發的最佳選擇。
  • Hyperledger Fabric java 區塊鏈開發詳解,課程面向初學者,內容即包含Hyperledger Fabric的身份證書與MSP服務、權限策略、信道配置與啟動、鏈碼通信接口等核心概念,也包含Fabric網絡設計、java鏈碼與應用開發的操作實踐,是java工程師學習Fabric區塊鏈開發的最佳選擇。
  • tendermint區塊鏈開發詳解,本課程適合希望使用tendermint進行區塊鏈開發的工程師,課程內容即包括tendermint應用開發模型中的核心概念,例如ABCI接口、默克爾樹、多版本狀態庫等,也包括代幣發行等豐富的實操代碼,是go語言工程師快速入門區塊鏈開發的最佳選擇。
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,250評論 6 530
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 97,923評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,041評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,475評論 1 308
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,253評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,801評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,882評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,023評論 0 285
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,530評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,494評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,639評論 1 366
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,177評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,890評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,289評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,552評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,242評論 3 389
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,626評論 2 370

推薦閱讀更多精彩內容

  • 1 貨幣的演變——從貝殼到比特幣 當社會分工產生之后,人類就產生了商品交換的需求。在貨幣被發明之前,人類是以以物換...
    longlee閱讀 7,649評論 1 23
  • 創建交易是大多數比特幣應用程序所做的事情。本節介紹如何使用比特幣核心的RPC接口創建具有各種屬性的交易。 你的應用...
    編程狂魔閱讀 2,917評論 0 1
  • 看到JVM就不得不說垃圾回收,說到垃圾回收(Garbage Collection,GC),顧名思義,垃圾回收就是釋...
    激情的狼王閱讀 1,619評論 0 2
  • 人生沒有捷徑,成長卻能加速。我們是一群在加速奔跑路上的伙伴。 11月10號到11號,很有幸在這個光棍節的日子里,我...
    婉章閱讀 303評論 0 0