背书节点能否在 Hyperledger Fabric 中看到传递给其链代码的瞬态数据?
Can the endorsing peer see the transient data passed to its chaincode in Hyperledger Fabric?
我正在尝试将客户端的敏感数据传递给 private data example of Hyperledger Fabric. The documentation recommends to pass sensitive data as --transient
data field and parse the transient map in the chaincode function execution 中给出的链代码函数:
@Transaction(intent = Transaction.TYPE.SUBMIT)
public Asset CreateAsset(final Context ctx) {
ChaincodeStub stub = ctx.getStub();
Map<String, byte[]> transientMap = ctx.getStub().getTransient();
if (!transientMap.containsKey("asset_properties")) {
String errorMessage = String.format("CreateAsset call must specify asset_properties in Transient map input");
System.err.println(errorMessage);
throw new ChaincodeException(errorMessage, AssetTransferErrors.INCOMPLETE_INPUT.toString());
}
byte[] transientAssetJSON = transientMap.get("asset_properties");
final String assetID;
final String type;
final String color;
int appraisedValue = 0;
int size = 0;
try {
JSONObject json = new JSONObject(new String(transientAssetJSON, UTF_8));
Map<String, Object> tMap = json.toMap();
type = (String) tMap.get("objectType");
assetID = (String) tMap.get("assetID");
color = (String) tMap.get("color");
if (tMap.containsKey("size")) {
size = (Integer) tMap.get("size");
}
if (tMap.containsKey("appraisedValue")) {
appraisedValue = (Integer) tMap.get("appraisedValue");
}
} catch (Exception err) {
String errorMessage = String.format("TransientMap deserialized error: %s ", err);
System.err.println(errorMessage);
throw new ChaincodeException(errorMessage, AssetTransferErrors.INCOMPLETE_INPUT.toString());
}
//input validations
根据定义,transient
数据从通道事务中排除并保存在对等方的临时数据存储中。
但是临时字段是否受到背书节点本身的保护?
背书节点(链代码的宿主)能否看到或解析瞬态数据?
如果是,有哪些最佳做法可以向背书同行隐藏此类敏感信息?
谢谢。
是的,背书节点可以在它收到的交易提案中看到瞬时数据。最佳做法是仅将包含私有数据的提案发送给属于应该能够看到该私有数据的组织的同行。
如果您使用的是 Hyperledger Fabric v2.4+ 和 Fabric Gateway client APIs, this is taken care of for you. If you are using an older version of Fabric or continuing to use the legacy SDKs,您可能需要明确指定背书组织或同行。
另外一个说明是瞬态数据本身没有存储在任何地方。如果交易功能将该瞬态数据写入私有数据集合,则写入的数据将记录在该私有集合中,仅存储在作为该集合成员的组织的对等点上。类似地,如果交易功能将任何临时数据写入分类帐或 returns 在交易响应中,这些值将在交易提交时记录在分类帐中。
我正在尝试将客户端的敏感数据传递给 private data example of Hyperledger Fabric. The documentation recommends to pass sensitive data as --transient
data field and parse the transient map in the chaincode function execution 中给出的链代码函数:
@Transaction(intent = Transaction.TYPE.SUBMIT)
public Asset CreateAsset(final Context ctx) {
ChaincodeStub stub = ctx.getStub();
Map<String, byte[]> transientMap = ctx.getStub().getTransient();
if (!transientMap.containsKey("asset_properties")) {
String errorMessage = String.format("CreateAsset call must specify asset_properties in Transient map input");
System.err.println(errorMessage);
throw new ChaincodeException(errorMessage, AssetTransferErrors.INCOMPLETE_INPUT.toString());
}
byte[] transientAssetJSON = transientMap.get("asset_properties");
final String assetID;
final String type;
final String color;
int appraisedValue = 0;
int size = 0;
try {
JSONObject json = new JSONObject(new String(transientAssetJSON, UTF_8));
Map<String, Object> tMap = json.toMap();
type = (String) tMap.get("objectType");
assetID = (String) tMap.get("assetID");
color = (String) tMap.get("color");
if (tMap.containsKey("size")) {
size = (Integer) tMap.get("size");
}
if (tMap.containsKey("appraisedValue")) {
appraisedValue = (Integer) tMap.get("appraisedValue");
}
} catch (Exception err) {
String errorMessage = String.format("TransientMap deserialized error: %s ", err);
System.err.println(errorMessage);
throw new ChaincodeException(errorMessage, AssetTransferErrors.INCOMPLETE_INPUT.toString());
}
//input validations
根据定义,transient
数据从通道事务中排除并保存在对等方的临时数据存储中。
但是临时字段是否受到背书节点本身的保护?
背书节点(链代码的宿主)能否看到或解析瞬态数据?
如果是,有哪些最佳做法可以向背书同行隐藏此类敏感信息?
谢谢。
是的,背书节点可以在它收到的交易提案中看到瞬时数据。最佳做法是仅将包含私有数据的提案发送给属于应该能够看到该私有数据的组织的同行。
如果您使用的是 Hyperledger Fabric v2.4+ 和 Fabric Gateway client APIs, this is taken care of for you. If you are using an older version of Fabric or continuing to use the legacy SDKs,您可能需要明确指定背书组织或同行。
另外一个说明是瞬态数据本身没有存储在任何地方。如果交易功能将该瞬态数据写入私有数据集合,则写入的数据将记录在该私有集合中,仅存储在作为该集合成员的组织的对等点上。类似地,如果交易功能将任何临时数据写入分类帐或 returns 在交易响应中,这些值将在交易提交时记录在分类帐中。