Skip to content

Commit 63a3e2c

Browse files
committed
feat(lib): impl calculate minter fees methode in Block
1 parent ccecd8a commit 63a3e2c

2 files changed

Lines changed: 51 additions & 5 deletions

File tree

‎lib/src/lib.rs‎

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,21 @@ construct_uint! {
77
pub struct U256(4);
88
}
99

10-
pub const INITIAL_REWARD: i32 = 1;
11-
12-
pub const HALVING_INTERVAL: i32 = 23;
10+
// initial reward in bitcoin - multiply by 10^8 to get satoshis
11+
pub const INITIAL_REWARD: u64 = 50;
12+
// halving interval in blocks
13+
pub const HALVING_INTERVAL: u64 = 210;
14+
// ideal block time in seconds
15+
pub const IDEAL_BLOCK_TIME: u64 = 10;
16+
// minimum target
17+
pub const MIN_TARGET: U256 = U256([
18+
0xFFFF_FFFF_FFFF_FFFF,
19+
0xFFFF_FFFF_FFFF_FFFF,
20+
0xFFFF_FFFF_FFFF_FFFF,
21+
0x0000_FFFF_FFFF_FFFF,
22+
]);
23+
// difficulty update interval in blocks
24+
pub const DIFFICULTY_UPDATE_INTERVAL: u64 = 50;
1325

1426
pub mod crypto;
1527
pub mod error;

‎lib/src/types.rs‎

Lines changed: 36 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,9 +213,43 @@ impl Block {
213213

214214
pub fn calculate_miner_reward(
215215
&self,
216-
_utxo: HashMap<Hash, TransactionOutput>,
216+
utxo: HashMap<Hash, TransactionOutput>,
217217
) -> Result<u64, CoinError> {
218-
Ok(1)
218+
let mut inputs: HashMap<Hash, TransactionOutput> = HashMap::new();
219+
220+
let mut outputs: HashMap<Hash, TransactionOutput> = HashMap::new();
221+
222+
for tx in self.transactions.iter().skip(1) {
223+
for input in &tx.inputs {
224+
if inputs.contains_key(&input.prev_transaction_output_hash) {
225+
return Err(CoinError::InvalidTransaction);
226+
}
227+
228+
let option_prv_output = utxo.get(&input.prev_transaction_output_hash);
229+
230+
if option_prv_output.is_none() {
231+
return Err(CoinError::InvalidTransaction);
232+
}
233+
234+
let prev_output = option_prv_output.unwrap();
235+
236+
inputs.insert(input.prev_transaction_output_hash, prev_output.clone());
237+
}
238+
239+
for output in &tx.outputs {
240+
if outputs.contains_key(&output.hash()) {
241+
return Err(CoinError::InvalidTransaction);
242+
}
243+
244+
outputs.insert(output.hash(), output.clone());
245+
}
246+
}
247+
248+
let input_value: u64 = inputs.values().map(|x| x.value).sum();
249+
250+
let output_value: u64 = outputs.values().map(|x| x.value).sum();
251+
252+
Ok(input_value - output_value)
219253
}
220254

221255
pub fn hash(&self) -> Hash {

0 commit comments

Comments
 (0)