-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
18 changed files
with
1,813 additions
and
1,266 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,74 @@ | ||
[ | ||
{ | ||
"index": 0, | ||
"time": "1995-01-01T00:00:00.000Z", | ||
"prev_hash": "", | ||
"hash": "dff9870f61f640f245f4ef0893afdabe5320479d59b2bb7a77e5211d6a6d0c36", | ||
"tx": { | ||
"id": "", | ||
"inputs": [], | ||
"outputs": [] | ||
}, | ||
"validator": { | ||
"address": "", | ||
"signature": "", | ||
"token": 0 | ||
} | ||
}, | ||
{ | ||
"index": 0, | ||
"time": "2024-02-02T09:39:16.733Z", | ||
"prev_hash": "dff9870f61f640f245f4ef0893afdabe5320479d59b2bb7a77e5211d6a6d0c36", | ||
"hash": "d6db0e0c19d584461a54c058e1f083264c0eb40f73c6ebba946e11b859cbc12a", | ||
"tx": { | ||
"id": "1024c484-1840-463f-8ae8-100f476a5ebd", | ||
"inputs": [ | ||
{ | ||
"time": "2024-02-02T09:39:16.729Z", | ||
"from": "TaroWallet", | ||
"signature": "私は太郎です。コインを花子さんにあげることに同意します" | ||
} | ||
], | ||
"outputs": [ | ||
{ | ||
"to": "HanakoWallet", | ||
"amount": 20, | ||
"fee": 3 | ||
} | ||
] | ||
}, | ||
"validator": { | ||
"address": "YamadaWallet", | ||
"signature": "私は責任を持って取引をチェックします", | ||
"token": 1 | ||
} | ||
}, | ||
{ | ||
"index": 0, | ||
"time": "2024-02-02T09:40:25.406Z", | ||
"prev_hash": "d6db0e0c19d584461a54c058e1f083264c0eb40f73c6ebba946e11b859cbc12a", | ||
"hash": "87e0152a86a1a5a74d9edf4f845007ccf3f6bccfb4800dc054f2424897ae8d9d", | ||
"tx": { | ||
"id": "7281835d-d994-4c0c-821d-bd6cfc54ce37", | ||
"inputs": [ | ||
{ | ||
"time": "2024-02-02T09:40:25.403Z", | ||
"from": "TaroWallet", | ||
"signature": "私は太郎です。コインを花子さんにあげることに同意します" | ||
} | ||
], | ||
"outputs": [ | ||
{ | ||
"to": "HanakoWallet", | ||
"amount": 20, | ||
"fee": 3 | ||
} | ||
] | ||
}, | ||
"validator": { | ||
"address": "TanakaWallet", | ||
"signature": "私は責任を持って取引をチェックします", | ||
"token": 2 | ||
} | ||
} | ||
] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,69 @@ | ||
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
exports.__esModule = true; | ||
exports.calcBlockHash = exports.hash = void 0; | ||
var crypto = require("crypto"); | ||
function hash(str) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var hash; | ||
return __generator(this, function (_a) { | ||
hash = crypto.createHash("sha256").update(str).digest(); | ||
// ハッシュを16進数の文字列に変換 | ||
return [2 /*return*/, hash.toString("hex")]; | ||
}); | ||
}); | ||
} | ||
exports.hash = hash; | ||
function calcBlockHash(index, time, prev_hash, tx, validator) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var str; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
str = index.toString() + | ||
time + | ||
prev_hash + | ||
JSON.stringify(tx) + | ||
JSON.stringify(validator); | ||
return [4 /*yield*/, hash(str)]; | ||
case 1: return [2 /*return*/, _a.sent()]; | ||
} | ||
}); | ||
}); | ||
} | ||
exports.calcBlockHash = calcBlockHash; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
import { Tx } from "../types/tx"; | ||
import { Validator } from "../types/validator"; | ||
import * as crypto from "crypto"; | ||
|
||
export async function hash(str: string): Promise<string> { | ||
// SHA-256 ハッシュ関数を使用してハッシュを生成 | ||
const hash = crypto.createHash("sha256").update(str).digest(); | ||
|
||
// ハッシュを16進数の文字列に変換 | ||
return hash.toString("hex"); | ||
} | ||
|
||
export async function calcBlockHash( | ||
index: number, | ||
time: string, | ||
prev_hash: string, | ||
tx: Tx, | ||
validator: Validator | ||
): Promise<string> { | ||
// ブロックの中身を文字にして繋げる | ||
const str = | ||
index.toString() + | ||
time + | ||
prev_hash + | ||
JSON.stringify(tx) + | ||
JSON.stringify(validator); | ||
|
||
return await hash(str); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,65 @@ | ||
"use strict"; | ||
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { | ||
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } | ||
return new (P || (P = Promise))(function (resolve, reject) { | ||
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } | ||
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } | ||
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } | ||
step((generator = generator.apply(thisArg, _arguments || [])).next()); | ||
}); | ||
}; | ||
var __generator = (this && this.__generator) || function (thisArg, body) { | ||
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; | ||
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; | ||
function verb(n) { return function (v) { return step([n, v]); }; } | ||
function step(op) { | ||
if (f) throw new TypeError("Generator is already executing."); | ||
while (g && (g = 0, op[0] && (_ = 0)), _) try { | ||
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; | ||
if (y = 0, t) op = [op[0] & 2, t.value]; | ||
switch (op[0]) { | ||
case 0: case 1: t = op; break; | ||
case 4: _.label++; return { value: op[1], done: false }; | ||
case 5: _.label++; y = op[1]; op = [0]; continue; | ||
case 7: op = _.ops.pop(); _.trys.pop(); continue; | ||
default: | ||
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } | ||
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } | ||
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } | ||
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } | ||
if (t[2]) _.ops.pop(); | ||
_.trys.pop(); continue; | ||
} | ||
op = body.call(thisArg, _); | ||
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } | ||
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; | ||
} | ||
}; | ||
exports.__esModule = true; | ||
exports.createBlock = void 0; | ||
var calcBlockHash_1 = require("./calcBlockHash"); | ||
function createBlock(prevBlock, tx, validator) { | ||
return __awaiter(this, void 0, void 0, function () { | ||
var time, index, hash, newBlock; | ||
return __generator(this, function (_a) { | ||
switch (_a.label) { | ||
case 0: | ||
time = new Date().toISOString(); | ||
index = prevBlock.index + 1; | ||
return [4 /*yield*/, (0, calcBlockHash_1.calcBlockHash)(index, time, prevBlock.hash, tx, validator)]; | ||
case 1: | ||
hash = _a.sent(); | ||
newBlock = { | ||
index: 0, | ||
time: time, | ||
prev_hash: prevBlock.hash, | ||
hash: hash, | ||
tx: tx, | ||
validator: validator | ||
}; | ||
return [2 /*return*/, newBlock]; | ||
} | ||
}); | ||
}); | ||
} | ||
exports.createBlock = createBlock; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,25 @@ | ||
import { Block } from "../types/block"; | ||
import { Tx } from "../types/tx"; | ||
import { Validator } from "../types/validator"; | ||
import { calcBlockHash } from "./calcBlockHash"; | ||
|
||
export async function createBlock( | ||
prevBlock: Block, | ||
tx: Tx, | ||
validator: Validator | ||
): Promise<Block> { | ||
const time = new Date().toISOString(); | ||
const index = prevBlock.index + 1; | ||
const hash = await calcBlockHash(index, time, prevBlock.hash, tx, validator); | ||
|
||
const newBlock: Block = { | ||
index: 0, | ||
time: time, | ||
prev_hash: prevBlock.hash, | ||
hash: hash, | ||
tx: tx, | ||
validator: validator, | ||
}; | ||
|
||
return newBlock; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
"use strict"; | ||
exports.__esModule = true; | ||
exports.createTx = void 0; | ||
var crypto_1 = require("crypto"); | ||
// Tx を作る | ||
function createTx() { | ||
// 取引 ID | ||
var txId = (0, crypto_1.randomUUID)(); | ||
// 現在時刻 | ||
var now = new Date().toISOString(); | ||
// インプット | ||
var inputs = [ | ||
{ | ||
time: now, | ||
from: "TaroWallet", | ||
signature: "私は太郎です。コインを花子さんにあげることに同意します" | ||
}, | ||
]; | ||
// アウトプット | ||
var outputs = [ | ||
{ | ||
to: "HanakoWallet", | ||
amount: 20, | ||
fee: 3 | ||
}, | ||
]; | ||
// Tx を組み立てる | ||
var tx = { | ||
id: txId, | ||
inputs: inputs, | ||
outputs: outputs | ||
}; | ||
return tx; | ||
} | ||
exports.createTx = createTx; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
import { randomUUID } from 'crypto'; | ||
import { Input } from "../types/input"; | ||
import { Output } from "../types/output"; | ||
import { Tx } from "../types/tx"; | ||
|
||
// Tx を作る | ||
export function createTx(): Tx { | ||
// 取引 ID | ||
const txId = randomUUID(); | ||
// 現在時刻 | ||
const now = new Date().toISOString(); | ||
// インプット | ||
const inputs: Input[] = [ | ||
{ | ||
time: now, | ||
from: "TaroWallet", | ||
signature: "私は太郎です。コインを花子さんにあげることに同意します", | ||
}, | ||
]; | ||
// アウトプット | ||
const outputs: Output[] = [ | ||
{ | ||
to: "HanakoWallet", | ||
amount: 20, | ||
fee: 3, | ||
}, | ||
]; | ||
// Tx を組み立てる | ||
const tx: Tx = { | ||
id: txId, | ||
inputs: inputs, | ||
outputs: outputs, | ||
}; | ||
|
||
return tx; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,38 @@ | ||
"use strict"; | ||
exports.__esModule = true; | ||
exports.pickWinner = void 0; | ||
// バリデーターを一人くじで選ぶ | ||
function pickWinner() { | ||
// 山田さん | ||
var v1 = { | ||
address: "YamadaWallet", | ||
signature: "私は責任を持って取引をチェックします", | ||
token: 1 | ||
}; | ||
// 田中さん | ||
var v2 = { | ||
address: "TanakaWallet", | ||
signature: "私は責任を持って取引をチェックします", | ||
token: 2 | ||
}; | ||
// 斉藤さん | ||
var v3 = { | ||
address: "SaitoWallet", | ||
signature: "私は責任を持って取引をチェックします", | ||
token: 3 | ||
}; | ||
// 渡辺さん | ||
var v4 = { | ||
address: "WatanabeWallet", | ||
signature: "私は責任を持って取引をチェックします", | ||
token: 4 | ||
}; | ||
// くじの中身 | ||
var candidates = [v1, v2, v2, v3, v3, v3, v4, v4, v4, v4]; | ||
// くじをランダムに1つ取り出す | ||
var randomIndex = Math.floor(Math.random() * candidates.length); | ||
var winner = candidates[randomIndex]; | ||
console.log("".concat(winner.address, " \u304C\u30D0\u30EA\u30C7\u30FC\u30BF\u30FC\u306B\u9078\u3070\u308C\u307E\u3057\u305F")); | ||
return winner; | ||
} | ||
exports.pickWinner = pickWinner; |
Oops, something went wrong.