Я пишу блокчейн в node.js. Я начал с express app.
const express = require("express");
const app = express();
Я написал все маршруты с "app". все обработчики маршрута находятся на одной странице и с текущей структурой «приложение» работает, ошибки нет. Поскольку это длинная страница, я хотел разделить маршруты с express роутером, но маршруты, которые делают запрос API, не работают должным образом. Они не выдают никакой ошибки, как бы то ни было, они не делают то, что должны. Например, я выделил этот код следующим образом:
const router = require("express").Router();
const Blockchain = require("../blockchain");
const bitcoin = new Blockchain();
const rp = require("request-promise");
const { v4: uuidv4 } = require("uuid");
const currentNodeUrl = process.argv[3];
const nodeAddress = uuidv4().split("-").join("");
router.get("/", function (req, res) {
const lastBlock = bitcoin.getLastBlock();
const previousBlockHash = lastBlock["hash"];
const currentBlockData = {
transactions: bitcoin.pendingTransactions,
index: lastBlock["index"] + 1,
};
const nonce = bitcoin.proofOfWork(previousBlockHash, currentBlockData);
const blockHash = bitcoin.hashBlock(
previousBlockHash,
currentBlockData,
nonce
);
const newBlock = bitcoin.createNewBlock(nonce, previousBlockHash, blockHash);
const requestPromises = [];
bitcoin.networkNodes.forEach((networkNodeUrl) => {
const requestOptions = {
uri: networkNodeUrl + "/receive-new-block",
method: "POST",
body: { newBlock: newBlock },
json: true,
};
requestPromises.push(rp(requestOptions));
});
Promise.all(requestPromises)
.then((data) => {
const requestOptions = {
uri: bitcoin.currentNodeUrl + "/transaction/broadcast",
method: "POST",
body: {
amount: 12.5,
sender: "00",
recipient: nodeAddress,
},
json: true,
};
return rp(requestOptions);
})
.then((data) => {
res.json({
note: "New block mined & broadcast successfully",
block: newBlock,
});
})
.catch((e) => console.log(e));
});
module.exports = router;
и в приложении. js
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use("/mine", require("./routes/mine"));
При первом запросе предполагается сделать запрос POST для / Маршрут request-new-block и этот маршрут должны создать блок и добавить новый блок в цепочку, но он этого не делает, и я не получаю никакой ошибки.
Другие маршруты, которые не отправляют ни одного почтового запроса, работают правильно с маршрутизатором.
вот / получить-новый-блок в приложении. js
app.post("/receive-new-block", (req, res) => {
const newBlock = req.body.newBlock;
//first we need to check if the block is legitimite
const lastBlock = bitcoin.getLastBlock();
const correctHash = lastBlock.hash === newBlock.previousBlockHash;
const correctIndex = lastBlock["index"] + 1 === newBlock["index"];
if (correctHash && correctIndex) {
bitcoin.chain.push(newBlock);
bitcoin.pendingTransactions = [];
res.json({ note: "new block received and accepted", newBlock });
} else {
res.json({ note: "new block rejected", newBlock });
}
});
вот репо