Thuật toán băm khối là gì? Tìm hiểu về thuật toán Hashcash

loading...

Thuật toán băm khối là gì? Tìm hiểu về thuật toán Hashcash trong tiền ảo hay điển hình nhất là Bitcoin. Bài viết này chúng tôi sẽ giới thiệu về khái niệm thuật toán băm khối nhằm tạo ra các các đồng Bitcoin mới hay đơn giản là tạo ra các chuỗi khối mới trong Blockchain Bitcoin. Nào hãy cùng chúng tôi tìm hiểu về khái niệm thuật toán Hashcash này nhé.

Thuật toán băm khối là gì? Tìm hiểu về thuật toán Hashcash
Thuật toán băm khối là gì? Tìm hiểu về thuật toán Hashcash

Thuật toán băm khối là gì?

Thuật toán Hashcash hay còn được gọi là băm khối. Tiếng Anh là Block Hashing Algorithm. Khai thác Bitcoin sử dụng hashcash bằng chứng về chức năng làm việc (PoW); thuật toán hashcash yêu cầu các tham số sau: chuỗi dịch vụ, nonce và bộ đếm. Trong bitcoin, chuỗi dịch vụ được mã hóa trong cấu trúc dữ liệu tiêu đề khối và bao gồm trường phiên bản, băm của khối trước đó, băm gốc của cây Merkle của tất cả các giao dịch trong khối, thời gian hiện tại và độ khó. 

Bitcoin lưu trữ nonce trong trường extraNonce là một phần của giao dịch Coinbase, được lưu trữ như nút lá bên trái (leaf node) trong cây Merkle (Coinbase là giao dịch đầu tiên đặc biệt trong khối). Tham số truy cập nhỏ ở 32 bit nên mỗi khi nó kết thúc, trường extraNonce phải được tăng lên (hoặc được thay đổi) để tránh lặp lại công việc. Các khái niệm cơ bản của thuật toán hashcash khá dễ hiểu. Khi khai thác Bitcoin, thuật toán hashcash liên tục băm tiêu đề khối trong khi tăng các trường đếm và đếm ngược. Gia tăng trường extraNonce đòi hỏi phải tính toán lại cây merkle, vì giao dịch Coinbase là nút lá bên trái. Khối này cũng đôi khi được cập nhật khi bạn đang làm việc trên nó.

Mô tả về thuật toán băm khối Hashcash

Phần thân của khối chứa các giao dịch. Chúng được băm chỉ gián tiếp thông qua gốc Merkle. Bởi vì các giao dịch không được băm trực tiếp, việc băm một khối với 1 giao dịch thực hiện chính xác cùng một lượng công sức như băm một khối với 10.000 giao dịch.

Định dạng nhỏ gọn của mục tiêu là một loại mã hóa dấu chấm động đặc biệt sử dụng 3 byte mantissa, byte hàng đầu làm số mũ (chỉ có 5 bit thấp nhất được sử dụng) và cơ sở của nó là 256. Hầu hết các trường này sẽ giống nhau cho tất cả người dùng. Có thể có một số biến thể nhỏ trong khoảng thời gian. Các nonce thường sẽ khác nhau, nhưng nó tăng một cách nghiêm ngặt tuyến tính. “Nonce” bắt đầu từ 0 và được tăng lên cho mỗi băm. Bất cứ khi nào Nonce tràn ra (mà nó thường xuyên), phần extraNonce của giao dịch thế hệ được tăng lên, thay đổi gốc Merkle.

Hơn nữa, nó là rất khó cho hai người có cùng một Merkle gốc vì giao dịch đầu tiên trong khối của bạn là một thế hệ “gửi” đến một trong những địa chỉ Bitcoin duy nhất của bạn. Vì khối của bạn khác với các khối của người khác, bạn (gần như) được đảm bảo để tạo ra các băm khác nhau. Mỗi băm bạn tính có cơ hội chiến thắng giống như mọi băm khác được tính bởi mạng.

Bitcoin sử dụng: SHA256 (SHA256 (Block_Header)) nhưng bạn phải cẩn thận về thứ tự byte.

Ví dụ, mã python này sẽ tính toán giá trị băm của khối có băm nhỏ nhất vào tháng 6 năm 2011, Chặn 125552. Tiêu đề được xây dựng từ sáu trường được mô tả ở trên, được nối với nhau dưới dạng giá trị nhỏ trong ký hiệu hex:

>>> import hashlib
>>> header_hex = ("01000000" +
 "81cd02ab7e569e8bcd9317e2fe99f2de44d49ab2b8851ba4a308000000000000" +
 "e320b6c2fffc8d750423db8b1eb942ae710e951ed797f7affc8892b0f1fc122b" +
 "c7f5d74d" +
 "f2b9441a" +
 "42a14695")
>>> header_bin = header_hex.decode('hex')
>>> hash = hashlib.sha256(hashlib.sha256(header_bin).digest()).digest()
>>> hash.encode('hex_codec')
'1dbd981fe6985776b644b173a4d0385ddc1aa2a829688d1e0000000000000000'
>>> hash[::-1].encode('hex_codec')
'00000000000000001e8d6829a8a21adc5d38d0a473b144b6765798e61f98bd1d'

Endianness trong thuật toán băm khối Hashcash

Lưu ý rằng băm, là một số 256 bit, có rất nhiều byte không có hàng đầu khi được lưu trữ hoặc được in dưới dạng hằng số thập lục phân lớn, nhưng nó có dấu 0 byte khi được lưu trữ hoặc được in ở phần nhỏ. Ví dụ, nếu được hiểu là một chuỗi và thấp nhất (hoặc bắt đầu của) địa chỉ chuỗi giữ byte quan trọng thấp nhất, nó là little-endian.

Đầu ra của blockexplorer hiển thị các giá trị băm như số big-endian; ký hiệu cho số là bình thường (chữ số đầu là các chữ số quan trọng nhất được đọc từ trái sang phải).

Ví dụ khác, đây là một phiên bản trong mã nguồn lập trình C mà không có bất kỳ tối ưu hóa, luồng hoặc kiểm tra lỗi.

Đây là ví dụ tương tự trong PHP đơn giản mà không có bất kỳ tối ưu hóa nào.

<?
  //This reverses and then swaps every other char
  function SwapOrder($in){
      $Split = str_split(strrev($in));
      $x='';
      for ($i = 0; $i < count($Split); $i+=2) {
          $x .= $Split[$i+1].$Split[$i];
      } 
      return $x;
  }
  
  //makes the littleEndian
  function littleEndian($value){
      return implode (unpack('H*',pack("V*",$value)));
  }
  
  $version = littleEndian(1);
  $prevBlockHash = SwapOrder('00000000000008a3a41b85b8b29ad444def299fee21793cd8b9e567eab02cd81');
  $rootHash = SwapOrder('2b12fcf1b09288fcaff797d71e950e71ae42b91e8bdb2304758dfcffc2b620e3');
  $time = littleEndian(1305998791);
  $bits = littleEndian(440711666); 
  $nonce = littleEndian(2504433986); 
  
  //concat it all
  $header_hex = $version . $prevBlockHash . $rootHash . $time . $bits . $nonce;
  
  //convert from hex to binary 
  $header_bin  = hex2bin($header_hex);
  //hash it then convert from hex to binary 
  $pass1 = hex2bin(  hash('sha256', $header_bin )  );
  //Hash it for the seconded time
  $pass2 = hash('sha256', $pass1);
  //fix the order
  $FinalHash = SwapOrder($pass2);
  
  echo   $FinalHash;
?>

Lời kết:

Trên là một số thông tin và kiến thức về thuật toán băm khối Hashcash. Nếu bạn có góp ý hoặc thắc mắc thì hãy bình luận ngay bên dưới bài viết này nhé. Thời Đại Blockchain xin chân thành cảm ơn.

Biên soạn bởi ThoiDaiBlockchain.Com

Thuật toán băm khối là gì? Tìm hiểu về thuật toán Hashcash
4.8 (95%) 4 votes
loading...

BÌNH LUẬN

Vui lòng nhập bình luận của bạn!
Vui lòng nhập tên của bạn tại đây