I am working on the fabric test network trying to fetch blocks by number and check the block hash, and i use fabric 2.5 with the new fabric gateway api. I insert a data and check the transaction for the consicutive transaction to check weather i get the data hash on the next block previous hash. but they both are always different when i check with the api.
{
"Block Number": "10",
"Previous Hash": "KSDy3jiB5Y15AT3W4PRqQWUTOarT50oKE8S100na0Ys=",
"Data Hash": "VBZBIkTTggb23aBuC2xs7+bfCk1EYeKhMPfvQNCL0ZI="
}
{
"Block Number": "11",
"Previous Hash": "Zf8YhOJlgTcrWbqm+8up4kGcrNffHMgDFnF++gnI3Dk=",
"Data Hash": "hY1pO7ljvlsNklmZBKksmTFreLRKNRX18dbvFk+5Y1g="
}
The above are the result returned after each transaction.
I have also directly queried from the cli using the command:
peer channel getinfo -c mychannel
where i got different value for data hash but my previous hash was similar in both the case
2024-12-27 11:43:47.409 IST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
Blockchain info: {"height":11,"currentBlockHash":"Zf8YhOJlgTcrWbqm+8up4kGcrNffHMgDFnF++gnI3Dk=","previousBlockHash":"KSDy3jiB5Y15AT3W4PRqQWUTOarT50oKE8S100na0Ys="}
2024-12-27 11:49:19.022 IST 0001 INFO [channelCmd] InitCmdFactory -> Endorser and orderer connections initialized
Blockchain info: {"height":12,"currentBlockHash":"1lbnSQSEWoJok327h6me1b7a5vgSdY8TGXA/uRUQDYo=","previousBlockHash":"Zf8YhOJlgTcrWbqm+8up4kGcrNffHMgDFnF++gnI3Dk="}
SDK and protos version:
"@hyperledger/fabric-gateway": "^1.7.1"
"@hyperledger/fabric-protos": "^0.2.2"
Iam using the fabric sample network and modifying the asset transfer basic gateway code.
app.get("/getBlockByNumber/:blockNumber", async (req, res) => {
try {
let { blockNumber } = req.params;
blockNumber = blockNumber.replace(/"/g, "");
blockNumber = blockNumber.replace(/s+/g, " ").trim();
const network = gateway.getNetwork("mychannel");
const blockBytes = await network
.getContract("qscc")
.evaluateTransaction("GetBlockByNumber", network.getName(), blockNumber);
console.log(
`Got block for block number ${blockNumber} with length ${String(
blockBytes.length
)}`
);
const protos = require("fabric-protos");
// Deserialize the block
const block = protos.common.Block.decode(blockBytes);
// Access block details
const data = {
"Block Number": block.header.number.toString(),
"Previous Hash": Buffer.from(block.header.previous_hash).toString(
"base64"
),
"Data Hash": Buffer.from(block.header.data_hash).toString("base64"),
};
res.send(data);
} catch (error) {
console.error("Error in getBlockByNumber:", error);
res.status(500).send("Failed to fetch block by block number");
}
});