iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 19
0
Blockchain

區塊鏈開發(Blockchain/DLT Application Development)系列 第 19

Hyperledger Fabric:Hyperledger Fabirc Client, HFC

Fabric 軟件開發工具包(Software Development Kit, SDK)

Fabric Client 做為客戶端,連結節點的智能合約 - 鏈碼(chaincode),目前功能較完整的有 Node.js SDK。

Fabric-ca

Fabric-ca 是 Fabric 內建的 ca 服務,提供有以下 API,可取得 E-Cert、T-Cert 等。

  • Register:註冊新的用戶帳號,一般用戶帳號,僅能新增同個組織用戶帳號。
  • Eronll:登入,無狀態(session-less),取得 E-Cert、T-Cert 憑證。
  • Reenroll:重新登入,更新 E-Cert 憑證,取得更多 T-Cert 憑證。
  • Revoke:撤銷帳號。

https://ithelp.ithome.com.tw/upload/images/20181103/20103635f2D0WNM2bO.png

  • KeyValueStore:下載後的憑證,儲存在本地端,稱為 FileKeyValueStore。
  • 加密套件(Crypto Suite):使用的加密演算法
    • 對非對稱密鑰:ECDSA、RSA
    • 對稱密鑰:AES
    • 哈希函式:SHA2、SHA3

HFC

客戶端(Client)程式構成如下:
Gateway(RESTful API)

  • express
  • hfc
    Hyperledger
  • GRPC

初始化

//建立chaincode實體
chain = hfc.newChain("mychain");
//設定key pair儲存位置
chain.setKeyValStore(hfc.newFileKeyValStore(StorePath));
//設定hfc連線,使用grpc通訊協定
chain.setMemberServicesUrl("grpc://" + memberAddress);
chain.addPeer("grpc://" + peerAddress);
//設定為開發模式
chain.setDevMode(true);
//設定deploy返回時間
chain.setDeployWaitTime(3);
//設定交易返回時間
chain.setInvokeWaitTime(3);

使用者

//Enroll
chain.enroll
(
    'admin'
    , 'Xurw3yU9zI0l'
    , function(err, admin) 
    {
        if (err) 
        {
            console.log("admin註冊失敗:%s", err);
            process.exit(1);
        }
        chain.setRegistrar(admin);
        blockChainUser = admin;
    }
);

//Account
var request = 
{
    enrollmentID: 'ID',
    affiliation: “Bank",
    attributes: 
    [
        {
             name: 'name'
             ,value: 'Name'
        }
        ,{
            name: 'position',
            value: 'Position'
            }
    ]
};

//register
chain.register(request, function (err, user1) 
{
    if (err) 
    {
        console.log(err);
    }
    blockChainUser = user1
    //CallBack()
})

//registerAndEnroll
chain.registerAndEnroll(request, function (err, user1) 
{
    if (err) 
    {
        console.log(err);
    }
    blockChainUser  = user1
    //CallBack()
})

鏈碼(Chaincode)呼叫

//Init
func (t *Handler) Init(stub shim.ChaincodeStubInterface) peer.Response {
}
//Invoke
func (t *Handler) Invoke(stub shim.ChaincodeStubInterface) peer.Response {
}
//Query
func (t *Handler) Query(stub shim.ChaincodeStubInterface, args []string) peer.Response {
}

enroll

app.post('/enroll', function(req, res) 
{
    var enrollID = req.body.enrollID;
    var enrollSecret = req.body.enrollSecret;
    userEnroll(enrollID, enrollSecret, function(result) 
    {
        res.send(result);
    })
})

deploy

app.post('/deploy', function(req, res) 
{
    var args = req.body.args;
    var deployRequest = 
    {
        chaincodeName: chaincodeName,
        args: args,
        fcn: "init"
    }
    if (blockChainUser != null) 
    {
        var tx = blockChainUser.deploy(deployRequest);
    }
}

tx.on('complete', function(results) 
{
    chainCodeID = results.chaincodeID;
    res.send('ChainCodeID:' + chainCodeID);
});
tx.on('error', function(error) 
{
    res.send('Deploy失敗:' + error);
});

invoke

app.post('/invoke', function(req, res) 
{
    var args = req.body.args;
    var invokeRequest = 
    {
        chaincodeID: chainCodeID,
        fcn: "invoke",
        args: args
    };
    
    var tx = blockChainUser.invoke(invokeRequest);
}

tx.on('complete', function(results) 
{
     res.send('交易結果:' + JSON.stringify(results));
});
tx.on('error', function(error) 
{
     res.send('交易失敗:' + error);
})

query

app.post('/query', function(req, res) 
{
    var args = req.body.args;
    var queryRequest = 
    {
        chaincodeID: chainCodeID,
        args: args,
        fcn: "query"
    }
    var tx = blockChainUser.query(queryRequest);
}

tx.on('complete', function(results) 
{
    var result = new Buffer(results.result, 'hex').toString()
    res.send('返回結果:' + result);
});
tx.on('error', function(error) 
{
    res.send('查詢失敗:' + error);
})

ajax

function postToServer(args, url) 
{
    $.post(url, 
    {
        args: args
    }
    ,function(data, state) 
    {
        alert(data);
    })
}

上一篇
Hyperledger Fabric:隱私安全
下一篇
R3 Corda
系列文
區塊鏈開發(Blockchain/DLT Application Development)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言