Как добавить используя post API - PullRequest
0 голосов
/ 23 марта 2020

Я пытаюсь написать этот проект о блокчейне, он имеет функции для получения блоков и получает цепочку также для добавления нового блока. Я борюсь с тем, чтобы добавить новый блок в цепочку с помощью API. теперь программа добавляет блок следующим образом:

const BChain = new bs.BlockChain ();

BChain.addBlock ({ отправитель: «Заказчик-А», получатель: «Поставщик-4», сумма: 100});

BlockChain. js

class Block {
   constructor(index, data, prevHash, timestamp, hash) {


       this.index = index;
      if(timestamp === undefined)  this.timestamp = Math.floor(Date.now() / 1000); else this.timestamp = timestamp;
       this.data = data;
       this.prevHash = prevHash;
       if(hash === undefined)    this.hash=this.getHash();else this.hash = hash;
   }

   getHash() {
       let encript=JSON.stringify(this.data) + this.prevHash + this.index + this.timestamp;
       let hash=crypto.createHmac('sha256', "secret")
       .update(encript)
       .digest('hex');
       return hash;
   }
}


class BlockChain {
   constructor() {
    if(arguments.length>0)
    {
         Object.assign(this, arguments[0]);
         for (var i = 0; i <    this.chain.length; i++) {
            this.chain[i] = new Block(this.chain[i].index, this.chain[i].data, this.chain[i].prevHash, this.chain[i].timestamp,this.chain[i].hash);

        }
    }
    else{
        this.chain = [];
    }
   }


   addBlock(data) {
       let index = this.chain.length;
       let prevHash = this.chain.length !== 0 ? this.chain[this.chain.length - 1].hash : 0;
       let block = new Block(index, data, prevHash);
       this.chain.push(block);
   }


    getBlockByID(id){
        for(let i=0;i<this.chain.length;i++){
            if(this.chain[i].index == id)
            return this.chain[i];
        }

    }

    storeChain(path){
        let str = JSON.stringify(this);
        fs.writeFileSync(path,str);
    }
}

function loadChain(path) {
    let str = fs.readFileSync(path)
    let obj = JSON.parse(str);
    const BChain2 =new BlockChain(obj);
    return BChain2

}


module.exports ={
    Block: Block,
    BlockChain : BlockChain,
    loadChain: loadChain
};

Указатель. js

const port = 8000;

const app = express();



const BChain = new bs.BlockChain();
BChain.addBlock({sender: "Customer-A", reciver: "Supplier-4", amount: 100});
BChain.addBlock({sender: "OEM-7", reciver: "Customer-B", invoice: '908987897'});
BChain.addBlock({sender: "Test5", reciver: "Customer-A", amount: 75});



const chain_path = path.resolve(__dirname, '..','./data/chain.json');
const data_path = path.resolve(__dirname, '..','./data/');


if (!fs.existsSync(data_path)){
    fs.mkdirSync(data_path);
}


BChain.storeChain(chain_path);


BChain2 = bs.loadChain(chain_path);

app.get('/' ,(req,res)=>{
res.send('Hello World');
});

app.get('/api/getchain' ,(req,res)=>{
    res.send(JSON.stringify(BChain2.chain));
});


app.get('/api/getblock' ,(req,res)=>{
    let id = req.query.id;
    console.log(id);
    res.send(JSON.stringify(BChain2.getBlockByID(id)));

});


app.post('/api/addblock', (req , res) =>{

    const BChain2 = new bs.BlockChain();

    res.send(JSON.stringify(BChain2.addBlock));


});


app.listen(port,()=> console.log("I am alive"));

1 Ответ

0 голосов
/ 04 апреля 2020

Вы не добавляете блок в блокчейн через API, вы делаете запрос к конечной точке API, и блокчейн MINE блокирует. Я имею в виду, что вы не отправляете никаких данных. Для добавления чего-либо вы делаете запрос «POST», но в этом случае вы делаете запрос get к конечной точке.

Я думаю, что ваш подход неверен. Потому что вы определяете класс BLOCK и класс BLOCKCHAIN. Это разные классы, однако майнинг - это метод внутри блокчейна. Поскольку каждый экземпляр класса Blockchain будет иметь этот метод, лучше указывать его в porototype.

    Blockchain.prototype.createNewBlock=function(){}

Думайте Blockchain как блокнот с неограниченным количеством страниц. Все страницы имеют одинаковый размер, и вы записываете транзакции внутри страниц. Заполнив страницу, вы должны надежно подписать ее, прежде чем перейти на следующую пустую страницу. Эта подпись называется ha sh. Вы берете последний блок ha sh, транзакции внутри страницы и одноразовый номер этой страницы, который является доказательством работы, и вы помещаете внутрь функцию sha256, чтобы создать шестнадцатеричные 64 символа ha sh. Поскольку вы надежно подписали страницу, вам нужно написать для этой страницы метку с такими свойствами: index, nonce, previousBlockHa sh, currentHa sh, отметка времени и транзакции. как только это будет сделано, вы можете добавить это в цепочку, поэтому у вас должно быть свойство внутри класса Blockchain для отслеживания блоков.

  this.chain = [];//everytime you create a new block, you push them here

У вас должен быть массив транзакций внутри вашей цепочки блоков.

          this.pendingTransactions = [];

Затем, когда вы создаете новые транзакции, вы должны заполнить этот массив новой транзакцией. вам также нужно создать метод-прототип для создания транзакций.

создание метода Block:

Blockchain.prototype.createNewBlock = function(nonce, previousBlockHash, hash) {
  const newBlock = {
    index: this.chain.length + 1,//
    timestamp: Date.now(),
    transactions: this.pendingTransactions,
    nonce: nonce,
    hash: hash,
    previousBlockHash: previousBlockHash
  };
  //after a block is hashed, we cleared up the pendingTransactions[] for the new block 
  this.pendingTransactions = [];
  this.chain.push(newBlock);
  return newBlock;
};

после того, как вы создали блок, вам нужно создать конечную точку для MINE блок.

app.get("/mine", (req, res) => {
  const lastBlock = blockchain.getLastBlock();// this.chain[this.chain.length - 1]
  const previousBlockHash = lastBlock["hash"];
  const currentBlockData = {
    transactions: blockchain.pendingTransactions,
    index: lastBlock["index"] + 1
  };
  const nonce = blockchain.proofOfWork(previousBlockHash, currentBlockData);//based on your algorithm find the nonce
  const blockHash = blockchain.hashBlock(
    previousBlockHash,
    currentBlockData,
    nonce
  );

  blockchain.createNewTransaction(6.25, "00", "address of the miner");// you need to reward the miner so create a new transaction
  const newBlock = blockchain.createNewBlock(nonce, previousBlockHash, blockHash);

  res.send({ note: "NEW BLOCK IS CREATED", blocks: newBlock });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...