簡體   English   中英

Hyperledger Fabric:HLF 事務模型類中應該存在哪些所有字段?

[英]Hyperledger Fabric: What all fields should be present in a HLF Transaction Model class?

我想為 HLF 事務創建一個模型類(POJO)。

我無法找到任何相關文檔/資源來說明原始交易有效負載中的所有字段。

注意:我使用的是嚴格類型的語言。

你有沒有檢查以下鏈接? 鏈接: https : //github.com/hyperledger/fabric-protos-go/blob/master/peer/transaction.pb.go

您可以在下一個鏈接中找到所有fabric-protos-go。 鏈接: https : //github.com/hyperledger/fabric-protos-go

您可以在下一個鏈接中找到所有結構原型。 鏈接: https : //github.com/hyperledger/fabric-protos

例如,我在 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;
}

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM