Types Hyperledger结构:HLF交易模型类中应该存在哪些字段?
我想为HLF事务创建一个模型类(POJO) 我找不到任何相关文档/资源来说明原始事务负载中的所有字段Types Hyperledger结构:HLF交易模型类中应该存在哪些字段?,types,model,transactions,hyperledger-fabric,payload,Types,Model,Transactions,Hyperledger Fabric,Payload,我想为HLF事务创建一个模型类(POJO) 我找不到任何相关文档/资源来说明原始事务负载中的所有字段 注意:我使用的是一种严格类型的语言。是否检查了以下链接?? 链接: 您可以在下一个链接中找到所有结构原型。 链接: 您可以在下一个链接中找到所有结构原型。 链接: 例如,我在Go中使用了这个结构,它工作正常 prop := &pb.Proposal{ Header: protoutil.MarshalOrPanic(&cb.Header{ Chan
注意:我使用的是一种严格类型的语言。是否检查了以下链接?? 链接: 您可以在下一个链接中找到所有结构原型。 链接: 您可以在下一个链接中找到所有结构原型。 链接: 例如,我在Go中使用了这个结构,它工作正常
prop := &pb.Proposal{
Header: protoutil.MarshalOrPanic(&cb.Header{
ChannelHeader: protoutil.MarshalOrPanic(&cb.ChannelHeader{
Type: int32(cb.HeaderType_ENDORSER_TRANSACTION),
ChannelId: "mychannel",
Extension: protoutil.MarshalOrPanic(&pb.ChaincodeHeaderExtension{
ChaincodeId: &pb.ChaincodeID{
Name: "mycc",
},
}),
TxId: sha256Hash,
}),
SignatureHeader: protoutil.MarshalOrPanic(&cb.SignatureHeader{
Creator: protoutil.MarshalOrPanic(&mspproto.SerializedIdentity{
Mspid: "Org1MSP",
}),
Nonce: []byte("nonce"),
}),
}),
Payload: protoutil.MarshalOrPanic(&pb.ChaincodeProposalPayload{
Input: protoutil.MarshalOrPanic(&pb.ChaincodeInvocationSpec{
ChaincodeSpec: &pb.ChaincodeSpec{
Input: &pb.ChaincodeInput{
Args: [][]byte{[]byte("invoke"), []byte("a"), []byte("b"), []byte("10")},
},
},
}),
}),
}
//signedProposal creation
signedProposal := &pb.SignedProposal{
ProposalBytes: protoutil.MarshalOrPanic(prop),
Signature: creator,
}
在java(严格类型化语言)中,我使用以下内容构建:
public class ProposalBuilder {
private Collection<ByteString> args = new ArrayList<ByteString>();
private String channelName;
private String chaincodeName;
private Proposal proposal = null;
private User user;
// empty constructor
private ProposalBuilder() {}
/**
* Creates new Instance of ProposalBuilder
* @return ProposalBuilder
*/
public static ProposalBuilder newBuilder() {
return new ProposalBuilder();
}
/**
* Sets the arguments of the proposal
* @param args is a {@link List} of {@link String} type arguments
* @return {@link ProposalBuilder}
*/
public ProposalBuilder setArgs(List<String> args) {
this.args.clear();
for (String arg : args) {
this.args.add(ByteString.copyFromUtf8(arg));
}
return this;
}
/**
* This method sets the channel name where the transaction will take place
* @param channelName is a {@link String}
* @return {@link ProposalBuilder}
*/
public ProposalBuilder setChannelName(String channelName) {
this.channelName = channelName;
return this;
}
/**
* This method sets the chaincode name
* @param chaincodeName is a {@link String}
* @return {@link ProposalBuilder}
*/
public ProposalBuilder setChaincodeName(String chaincodeName) {
this.chaincodeName = chaincodeName;
return this;
}
/**
* This method sets the user
* @param user is of type {@link user.User}}
* @return {@link ProposalBuilder}
*/
public ProposalBuilder setUser(User user) {
this.user = user;
return this;
}
/**
* This method builds and returns the proposal
* @return proposal is of type {@link ProposalPackage.Proposal}
*/
public Proposal build() {
this.proposal = makeProposal(this.args, this.channelName, this.chaincodeName, this.user);
return this.proposal;
}
private Proposal makeProposal(Collection<ByteString> args, String channelName, String chaincodeName, User user) {
// Making proposal header
ChaincodeID chaincodeID = ChaincodeID.newBuilder().setName(chaincodeName).build();
ChaincodeHeaderExtension chaincodeHeaderExtension = ChaincodeHeaderExtension.newBuilder().setChaincodeId(chaincodeID).build();
ByteString nonce = ByteString.copyFromUtf8(String.valueOf(Calendar.getInstance().getTimeInMillis()));
SerializedIdentity creator = SerializedIdentity.newBuilder()
.setMspid(user.getMspId())
.setIdBytes(ByteString.copyFromUtf8(user.getCertificate()))
.build();
SignatureHeader signatureHeader = SignatureHeader.newBuilder()
.setCreator(creator.toByteString())
.setNonce(nonce)
.build();
String txId = CryptoUtils.computeHash(signatureHeader.getNonce().toByteArray(),
signatureHeader.getCreator().toByteArray());
ChannelHeader channelHeader = ChannelHeader.newBuilder()
.setType(HeaderType.ENDORSER_TRANSACTION_VALUE)
.setChannelId(channelName)
.setExtension(chaincodeHeaderExtension.toByteString())
.setTxId(txId)
.build();
Header header = Header.newBuilder()
.setChannelHeader(channelHeader.toByteString())
.setSignatureHeader(signatureHeader.toByteString())
.build();
// Making proposal payload
ChaincodeInput chaincodeInput = ChaincodeInput.newBuilder()
.addAllArgs(args)
.build();
ChaincodeSpec chaincodeSpec = ChaincodeSpec.newBuilder()
.setInput(chaincodeInput)
.build();
ChaincodeInvocationSpec input = ChaincodeInvocationSpec.newBuilder()
.setChaincodeSpec(chaincodeSpec)
.build();
ChaincodeProposalPayload chaincodeProposalPayload = ChaincodeProposalPayload.newBuilder()
.setInput(input.toByteString())
.build();
Proposal proposal = Proposal.newBuilder()
.setHeader(header.toByteString())
.setPayload(chaincodeProposalPayload.toByteString())
.build();
return proposal;
}
公共类ProposalBuilder{
私有集合args=new ArrayList();
私有字符串名;
私有字符串chaincodeName;
私人提案=空;
私人用户;
//空构造函数
私有ProposalBuilder(){}
/**
*创建ProposalBuilder的新实例
*@return-ProposalBuilder
*/
公共静态ProposalBuilder newBuilder(){
返回新的ProposalBuilder();
}
/**
*设置建议的参数
*@param args是{@link String}类型参数的{@link List}
*@return{@link ProposalBuilder}
*/
公共ProposalBuilder设置参数(列表参数){
this.args.clear();
for(字符串arg:args){
this.args.add(ByteString.copyFromUtf8(arg));
}
归还这个;
}
/**
*此方法设置事务将在其中发生的通道名称
*@param channelName是一个{@link String}
*@return{@link ProposalBuilder}
*/
公共ProposalBuilder setChannelName(字符串channelName){
this.channelName=channelName;
归还这个;
}
/**
*此方法设置链码名称
*@param chaincodeName是一个{@link String}
*@return{@link ProposalBuilder}
*/
公共ProposalBuilder setChaincodeName(字符串chaincodeName){
this.chaincodeName=chaincodeName;
归还这个;
}
/**
*此方法设置用户
*@param user的类型为{@link user.user}
*@return{@link ProposalBuilder}
*/
公共ProposalBuilder设置用户(用户用户){
this.user=用户;
归还这个;
}
/**
*此方法生成并返回建议
*@退货建议的类型为{@link ProposalPackage.proposal}
*/
公共提案建设(){
this.proposal=makeProposal(this.args,this.channelName,this.chaincodeName,this.user);
返回此建议;
}
私人提案makeProposal(集合参数、字符串channelName、字符串chaincodeName、用户){
//提出建议标题
ChaincodeID ChaincodeID=ChaincodeID.newBuilder().setName(chaincodeName.build();
ChaincodeHeaderExtension ChaincodeHeaderExtension=ChaincodeHeaderExtension.newBuilder().setChaincodeId(chaincodeID).build();
ByteString nonce=ByteString.copyFromUtf8(String.valueOf(Calendar.getInstance().getTimeInMillis());
SerializedDidEntity创建者=SerializedDidEntity.newBuilder()
.setMspid(user.getMspId())
.setIdBytes(ByteString.copyFromUtf8(user.getCertificate()))
.build();
SignatureHeader SignatureHeader=SignatureHeader.newBuilder()
.setCreator(creator.toByteString())
.setNonce(nonce)
.build();
字符串txId=CryptoUtils.computeHash(signatureHeader.getNonce().toByteArray(),
signatureHeader.getCreator().toByteArray());
ChannelHeader ChannelHeader=ChannelHeader.newBuilder()
.setType(HeaderType.ENDORSER\u事务值)
.setChannelId(channelName)
.setExtension(chaincodeHeaderExtension.toByteString())
.setTxId(txId)
.build();
Header Header=Header.newBuilder()
.setChannelHeader(channelHeader.toByteString())
.setSignatureHeader(signatureHeader.toByteString())
.build();
//提出建议
ChaincodeInput ChaincodeInput=ChaincodeInput.newBuilder()
.addAllArgs(args)
.build();
ChaincodeSpec ChaincodeSpec=ChaincodeSpec.newBuilder()
.setInput(链码输入)
.build();
ChaincodeInvocationSpec输入=ChaincodeInvocationSpec.newBuilder()
.setChaincodeSpec(chaincodeSpec)
.build();
ChaincodeProposalPayload ChaincodeProposalPayload=ChaincodeProposalPayload.newBuilder()
.setInput(input.toByteString())
.build();
提案=提案.newBuilder()
.setHeader(header.toByteString())
.setPayload(chaincodeProposalPayload.toByteString())
.build();
退货建议;
}
}