ThinkPHP5.0使用区块链服务网络(BSN)

默认分类 2023-12-22

BSN平台类型:Fabric-2.3.2-secp256r1
创建一个区块链上链信息表保存上链记录

CREATE TABLE `bl_block_list` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `order_no` varchar(50) DEFAULT '' COMMENT '订单编号',
  `txId` varchar(100) DEFAULT '' COMMENT '区块链交易id',
  `block_hash` varchar(100) DEFAULT '' COMMENT '区块链块hash',
  `block_num` int(10) DEFAULT NULL COMMENT '区块链块号',
  `create_name` varchar(100) DEFAULT '' COMMENT '上链用户名',
  `block_time` int(10) DEFAULT NULL COMMENT '区块链交易时间',
  `createtime` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `txId` (`txId`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='区块链上链信息';

下载BSN代码压缩包BSN.zip然后将extend\venyuanbsn放到根目录extend文件夹中
在api/controller中创建BSN.php

<?php
namespace app\api\controller;

use app\common\controller\Api;
use think\Exception;
use think\Log;
use think\Request;
use venyuanbsn\Config;
use venyuanbsn\NodeServer;
use venyuanbsn\SendHelper;

class Bsn extends Api{
    protected $config;

    public function _initialize()
    {
        $this->config = Config::initConfig([
            'reqUrl' => 'https://xxxx.bsngate.com:17602',//证书节点地址
            'appInfo' => [
                'AppCode' => 'xxxxxxxx'//证书的appcode
            ],
            'userCode' => 'xxxxxx',//身份code
            'mspDir' => './mspdir',
            'httpsCert' => ''
        ]);
        parent::_initialize();
    }

    public function registUser()
    {
        $node = new NodeServer($this->config);
        try {
            $res = $node->RegisterUser([
                'name' => 'xxxx',//姓名
                'secret' => 'xxxx'//密码
            ]);
            $this->success('success',$res,0);
        } catch (Exception $e) {
            Log::error('错误:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('错误:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 保存区块链数据 
     */
    public function reqChainCode()
    {
        try {
            $baseKey = 'PR202202251002';//订单id
            $data = [
                'order_no' => 'xxxxx',
                'appoint_time' => '2023-12-16 00:00:00',
                'goods_list' => []
            ];//待保存的数据
            $node = new NodeServer($this->config);
            $value = base64_encode(json_encode($data,JSON_UNESCAPED_UNICODE));
            $res = $node->ReqChainCode([
                'args' => ['{"baseKey":"'.$baseKey.'","baseValue":"'.$value.'"}'],
                'nonce' => SendHelper::generateRandomString(),
                'chainCode' => 'cc_app0001202203021319180253003_01',
                'funcName' => 'set',
                'userName' => '',
                'transientData' => null
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('保存区块链数据失败:'.$header->msg);
                $this->error('保存区块链数据失败',[],-1);
            }
            return $res->body->blockInfo->txId;
        } catch (Exception $e) {
            Log::error('调用保存区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('调用保存区块链数据接口失败:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 更新区块链数据
     */
    public function upChainCode()
    {
        try {
            $baseKey = 'PR202202251002';//订单编号
            $data = [
                'order_no' => 'xxxx',
                'appoint_time' => '2023-12-17 00:00:00',
                'stock_in_data': []
            ];//待更新的数据
            $node = new NodeServer($this->config);
            $value = base64_encode(json_encode($data,JSON_UNESCAPED_UNICODE));
            $res = $node->ReqChainCode([
                'args' => ['{"baseKey":"'.$baseKey.'","baseValue":"'.$value.'"}'],
                'nonce' => SendHelper::generateRandomString(),
                'chainCode' => 'cc_app0001202203021319180253003_01',
                'funcName' => 'update',
                'userName' => '',
                'transientData' => null
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('更新区块链数据失败:'.$header->msg);
                $this->error('更新区块链数据失败',[],-1);
            }
            return $res->body->blockInfo->txId;

        } catch (Exception $e) {
            Log::error('调用更新区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('调用更新区块链数据接口失败:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 获取区块链上传数据
     */
    public function getChainCode()
    {        
        try {
            $baseKey = 'PR202202251002';//订单id
            $node = new NodeServer($this->config);
            $res = $node->ReqChainCode([
                'args' => [$baseKey],
                'nonce' => SendHelper::generateRandomString(),
                'chainCode' => 'cc_app0001202203021319180253003_01',
                'funcName' => 'get',
                'userName' => '',
                'transientData' => null
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('获取区块链数据失败:'.$header->msg);
                $this->error('获取区块链数据失败',[],-1);
            }
            $data = $res->body->ccRes->ccData;
            $data = json_decode(base64_decode($data),TRUE);

            $this->success('success',$data,0);
        } catch (Exception $e) {
            Log::error('调用获取区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('调用获取区块链数据接口失败:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 获取区块链历史数据
     */
    public function getHistoryChainCode()
    {        
        try {
            $baseKey = 'PR202202251002';//订单id
            $node = new NodeServer($this->config);
            $res = $node->ReqChainCode([
                'args' => [$baseKey],
                'nonce' => SendHelper::generateRandomString(),
                'chainCode' => 'cc_app0001202203021319180253003_01',
                'funcName' => 'getHistory',
                'userName' => '',
                'transientData' => null
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('获取区块链数据失败:'.$header->msg);
                $this->error('获取区块链数据失败',[],-1);
            }
            $data = $res->body->ccRes->ccData;
            $data = json_decode($data,TRUE);
            $history = [];
            foreach ($data as $item) {
                $txId = $item['txId'];
                array_push($history,$txId);
            }
            $this->success('success',$history,0);
        } catch (Exception $e) {
            Log::error('调用获取区块链数据接口失败:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('调用获取区块链数据接口失败:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 获取区块链交易信息
     * @param $txId //区块链交易id
     */
    public function getTransaction()
    {
        $txId = 'xxxxxx';//区块链交易id
        $node = new NodeServer($this->config);
        try {
            $res = $node->GetTransaction([
                'txId' => $txId
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('获取区块链数据失败:'.$header->msg);
                $this->error('获取区块链数据失败',[],-1);
            }
            return $res->body;
        } catch (Exception $e) {
            Log::error('错误:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('错误:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 获取区块链交易数据
     */
    public function getTransdata()
    {
        $txId = 'xxxxxx';//区块链交易id
        $node = new NodeServer($this->config);
        try {
            $res = $node->GetTransdata([
                'txId' => $txId
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('获取区块链数据失败:'.$header->msg);
                $this->error('获取区块链数据失败',[],-1);
            }
            $res = $res->body;
            $this->success('success',$res,0);
        } catch (Exception $e) {
            Log::error('错误:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('错误:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 获取区块链块信息
     */
    public function getBlockInfo()
    {
        $txId = 'xxxxxxxxx';//区块链交易id
        $node = new NodeServer($this->config);
        try {
            $res = $node->GetBlockInfo([
                'blockNumber' => 0,
                'blockHash' => '',
                'txId' => $txId
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('获取区块链块信息失败:'.$header->msg);
                $this->error('获取区块链块信息失败',[],-1);
            }
            $res = $res->body;
            $this->success('success',$res,0);
        } catch (Exception $e) {
            Log::error('调用获取区块链块信息失败:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('调用获取区块链块信息失败:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 获取区块链块数据
     */
    public function getBlockData()
    {
        $txId = 'xxxxxxxx';//区块链交易id
        $node = new NodeServer($this->config);
        try {
            $res = $node->GetBlockData([
                'blockNumber' => 0,
                'blockHash' => '',
                'txId' => $txId,
                'dataType' => ''
            ]);
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('获取区块链块数据失败:'.$header->msg);
                $this->error('获取区块链块数据失败',[],-1);
            }
            $res = $res->body;
            $this->success('success',$res,0);
        } catch (Exception $e) {
            Log::error('调用获取区块链块数据失败:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('调用获取区块链块数据失败:'.$e->getMessage(),[],-1);
        }
    }

    /**
     * 获取区块链最新账本信息
     */
    public function getLedgerInfo()
    {
        $node = new NodeServer($this->config);
        try {
            $res = $node->GetLedgerInfo();
            $header = $res->header;
            if ($header->code == -1) {
                Log::error('获取区块链最新账本信息失败:'.$header->msg);
                $this->error('获取区块链最新账本信息失败',[],-1);
            }
            $res = $res->body;
            $this->success('success',$res,0);
        } catch (Exception $e) {
            Log::error('调用获取区块链最新账本信息失败:'.$e->getMessage().'行:'.$e->getLine());
            $this->error('调用获取区块链最新账本信息失败:'.$e->getMessage(),[],-1);
        }
    }
}

使用

public function addBlockInfo($order_no,$trace_info)
{
    $bsn = new Bsn();
    $block_info = db('block_list')
        ->field('id')
        ->where('order_no',$order_no)
        ->order('createtime','desc')
        ->find();
     if ($block_info) {
         $res = $bsn->upChainCode($order_no,$trace_info);
     } else {
         $res = $bsn->reqChainCode($order_no,$trace_info);
     }
     $txId = $res;
     $trans = $bsn->getTransaction($txId);
     $block_data = [
         'order_no' => $order_no,
         'txId' => $txId,
         'block_hash' => $trans->blockHash,
         'block_num' => $trans->blockNumber,
         'create_name' => $trans->createName,
         'block_time' => $trans->timeSpanSec,
         'createtime' => date('Y-m-d H:i:s')
      ];
      db('block_list')->insert($block_data);
}
知识共享署名声明
本文由 admin 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论