Types Hyperledger结构:HLF交易模型类中应该存在哪些字段?

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

我想为HLF事务创建一个模型类(POJO)

我找不到任何相关文档/资源来说明原始事务负载中的所有字段


注意:我使用的是一种严格类型的语言。

是否检查了以下链接?? 链接:

您可以在下一个链接中找到所有结构原型。 链接:

您可以在下一个链接中找到所有结构原型。 链接:

例如,我在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();
退货建议;
}
}