从链代码中的命令行请求获取 MSPID
Get MSPID from a command line request in chaincode
我目前正在尝试评估请求者 MSPID 以授权特定的成员列表能够在链代码上请求函数,但是当我请求 "stub.getCreator().mspId" 它总是给我 "undefined"
我目前正在通过 "docker exec" 之类的命令调用该函数。我检查过我的交易应该在 "getCreator" 之前签署才能工作,但我不知道是否可以通过命令行调用签署交易。
我的命令行请求是:
docker exec cli.example.com peer chaincode invoke -o orderer.example.com:7050 -C examplechannel -c '{"Args":["createVcc", "{ \"date\": 12345, \"reference\": \"anything\", \"serialNumber\": \"BR-12345\", \"presentedTo\": \"Example project\", \"quantity\": 22279 }"]}' -n example
验证函数:
const isAdmin = (func, creator) => {
if (!adminList.includes(creator)) {
throw new Error(`Organization ${creator} does not have access to perform function ${func}`);
}
}
在链码中使用验证函数:
async (stub, data) => {
...
isAdmin('createVcc', stub.getCreator().mspId);
...
}
我收到了:
Error: endorsement failure during invoke. response: status:500 message:"transaction returned with failure: Organization undefined does not have access to perform function createVcc"
我希望 "getCreator().mspid" 不会未定义,有人知道什么可以解决我的问题吗?
在我的代码段下方尝试
const ClientIdentity = require('fabric-shim').ClientIdentity;
let cid = new ClientIdentity(stub);
let mspID = cid.getMSPID()
let isAuthorized = false;
if (cid.assertAttributeValue('createVcc', mspID){
isAuthorized = true;
}
使用 Node 链码(智能合约),您应该可以使用 Client Identity object 然后 getMSPID()
或 getID()
如果您使用新编程模型 - 特别是 fabric-contract-api, then this includes the Client Identity object. Using this you can also check Attributes from the certificate allowing you more flexibility in your access control. There is a tutorial here 和最新的 Fabric 示例使用新编程模型。
您可能还想考虑使用 fabric-contract-api 提供的 beforeTransaction
并将其用作执行所有访问控制、检查函数名称和 "IDs".
我目前正在尝试评估请求者 MSPID 以授权特定的成员列表能够在链代码上请求函数,但是当我请求 "stub.getCreator().mspId" 它总是给我 "undefined"
我目前正在通过 "docker exec" 之类的命令调用该函数。我检查过我的交易应该在 "getCreator" 之前签署才能工作,但我不知道是否可以通过命令行调用签署交易。
我的命令行请求是:
docker exec cli.example.com peer chaincode invoke -o orderer.example.com:7050 -C examplechannel -c '{"Args":["createVcc", "{ \"date\": 12345, \"reference\": \"anything\", \"serialNumber\": \"BR-12345\", \"presentedTo\": \"Example project\", \"quantity\": 22279 }"]}' -n example
验证函数:
const isAdmin = (func, creator) => {
if (!adminList.includes(creator)) {
throw new Error(`Organization ${creator} does not have access to perform function ${func}`);
}
}
在链码中使用验证函数:
async (stub, data) => {
...
isAdmin('createVcc', stub.getCreator().mspId);
...
}
我收到了:
Error: endorsement failure during invoke. response: status:500 message:"transaction returned with failure: Organization undefined does not have access to perform function createVcc"
我希望 "getCreator().mspid" 不会未定义,有人知道什么可以解决我的问题吗?
在我的代码段下方尝试
const ClientIdentity = require('fabric-shim').ClientIdentity;
let cid = new ClientIdentity(stub);
let mspID = cid.getMSPID()
let isAuthorized = false;
if (cid.assertAttributeValue('createVcc', mspID){
isAuthorized = true;
}
使用 Node 链码(智能合约),您应该可以使用 Client Identity object 然后 getMSPID()
或 getID()
如果您使用新编程模型 - 特别是 fabric-contract-api, then this includes the Client Identity object. Using this you can also check Attributes from the certificate allowing you more flexibility in your access control. There is a tutorial here 和最新的 Fabric 示例使用新编程模型。
您可能还想考虑使用 fabric-contract-api 提供的 beforeTransaction
并将其用作执行所有访问控制、检查函数名称和 "IDs".