[英]What data type should an MVC model class use to back/represent a database column of type Image?
[英]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.