Blokka tranzaktsiyalarni kiritish
Birinchidan, siz Transaction nomli yangi sinf yaratishingiz va unga bir nechta
maydonlarni, ular uchun oluvchilarni va konstruktorni qo'shishingiz kerak:
1 package blockchain.basic;
2
3 public class Transaction {
4
5 private String sender;
6 private String recipient;
7 private int amount;
8
9
10 public Transaction(String sender, String recipient, int amount)
11{
12 this.sender = sender;
13 this.recipient = recipient;
14 this.amount = amount;
15 }
16
17 public String getSender() {
18 return sender;
19 }
20
21 public String getRecipient() {
22 return recipient;
23 }
24
25 public int getAmount() {
26 return amount;
27 }
28
29}
Keyinchalik, blokga tranzaktsiyalarni qo'shish usuli kerak. Buning uchun
newTransaction() usuli javobgar bo'ladi:
1 /**
2 *
3 * Направляє нову транзакцію в наступний блок
4 *
5 *
6 * @param sender Адреса відправника
7 * @param recipient Адреса отримувача
8 * @param amount Сума
9 * @return Індекса блока, що буде зберігати цю транзакцію
10 */
11
12 public int newTransaction(String sender, String recipient, int
amount) {
13 this.currentTransactions.add(new Transaction(sender, recipient,
amount));
14 return this.chain.size();
15 }
newTransaction() tranzaksiyani roʻyxatga qoʻshgandan soʻng, tranzaksiya
qoʻshiladigan blok indeksini, yaʼni almashtiriladigan keyingi blokni qaytaradi. Bu
kelajakda tranzaktsiyani yuboradigan foydalanuvchi uchun foydali bo'ladi.
Yangi bloklarni yaratish
Biz yangi Block sinfini yaratamiz va unga kerakli maydonlarni, ular uchun
oluvchilarni va konstruktorni qo'shamiz:
1 package blockchain.basic;
2
3 Import java.util.List;
4
5 public class Block {
6
7 private int index;
8 private long timestamp;
9 private List transactions;
10 private int proof;
11 private String previousHash;
12
13 public Block(int index, int proof, String previousHash,
List transactions) {
14 this.index = index;
15 this.proof = proof;
16 this.previousHash = previousHash;
17 this.transactions = transactions;
18 this.timestamp = System.currentTimeMillis();
19 }
20
21 public int getIndex() {
22 return index;
23 }
24
25 public long getTimestamp() {
26 return timestamp;
27 }
28
29 public List getTransactions() {
30 return transactions;
31 }
32 public int getProof() {
33 return proof;
34 }
35
36 public String getPreviousHash() {
37 return previousHash;
38 }
39 }
Keling, newBlock() va hash() usullarini yozamiz:
1 /**
2 *
3 * @param proof Bajarilgan ishning dalili
4 * @param previousHash Oldingi blokning xeshi
5 * @return Yangi blok
6 */
7 ommaviy bloklash newBlock(int proof, String previousHash) {
8
9 // ro'yxatning nusxasini yarating
10 roʻyxat tranzaksiyalari = this.currentTransac-
tions.stream().to'plash(Kollektorlar.toList());
11
12 // yangi blok ob'ektini yarating
13 Block newBlock = new Blok(this.chain.size(), isbot, oldingi
ousHash, tranzaktsiyalar);
14
15 // tranzaktsiyalar ro'yxatini tozalang
16 this.currentTransactions.clear();
17
18 // zanjirga yangi blok qo'shing
19 this.chain.add(newBlock);
20
21 // yangi blokni qaytaring
22 yangi blokni qaytarish;
23 }
24
25 /**
26 *
27 * @param bloki Blok
28 * @return Blokning xeshi
29 */
30 umumiy statik String xesh(Blok bloki) {
31 StringBuilder hashingInputBuilder = new StringBuilder();
32
33 // blok parametrlarini ma'lum bir o'zgarmas tarzda o'zgaruvchiga qo'shing
chiziq
34 hashingInputBuilder.append(block.getIndex())
.append(block.getTimestamp()).apppend(block.getProof())
.append(block.getPreviousHash());
36
37 String hashingInput = hashingInputBuilder.toString();
38 // o'zgaruvchidan foydalanib, uning maydonlari asosida blok xeshini yarating
39 return Hashing.sha256().hashString(hashingInput, Standard-Charsets.UTF_8).toString();
40 }
Endi siz genezis bloki qo'shiladigan konstruktorni yaratishingiz kerak:
25
1 public Blockchain() {
2 newBlock(100, "0");
3 }
PoWning asosiy amalga oshirilishi
Qoida yuqorida aytib o'tilganga o'xshash bo'ladi:
Oldingi blokning yechimi bilan xeshlanganda to„rtta yetakchi nolga ega xesh hosil
qiluvchi p sonini toping.
Dostları ilə paylaş: |