0

我目前正在尝试评估请求者 MSPID 以授权能够在链码上请求函数的特定成员列表,但是当我要求“stub.getCreator().mspId”时,它总是给我“未定义”

我目前正在使用诸如通过“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”不是未定义的,有人知道什么可以解决我的问题吗?

4

2 回答 2

2

试试我的代码片段

    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;
    }
于 2019-09-03T13:47:02.577 回答
0

使用节点链码(智能合约),您应该能够使用客户端身份对象,然后getMSPID()getID()

如果您使用新编程模型 - 特别是fabric-contract-api,那么这包括客户端身份对象。使用它,您还可以检查证书中的属性,从而使您的访问控制更加灵活。这里有一个教程,最新的 Fabric Samples 使用新的编程模型。

您可能还想考虑使用beforeTransactionfabric-contract-api 提供的,并将其用作进行所有访问控制、检查函数名称和“ID”的地方。

于 2019-09-03T13:48:12.843 回答