Skip to content

rinse/git-pow

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Git PoW Commit

Git Commitのハッシュ値の前n桁を0にするProof of Workツールです。

指定されたコミットハッシュに対して、コミットメッセージの末尾にnonceを追加することで、新しいコミットハッシュの前n桁が0になるまで計算を繰り返します。

使用方法

git-pow <COMMIT_SHA> [OPTIONS]

引数

  • <COMMIT_SHA>: 対象となるコミットのSHA-1ハッシュ値

オプション

  • --difficulty <NUMBER>: 前何桁を0にするか(デフォルト: 7)
  • --initial-nonce <NUMBER>: 初期nonce値(デフォルト: 0)

実行例

# HEADコミットの前7桁を0にする
git-pow $(git rev-parse HEAD)

# 前5桁を0にする
git-pow $(git rev-parse HEAD) --difficulty 5

# 初期nonce値を指定
git-pow $(git rev-parse HEAD) --initial-nonce 1000000

コマンドは新しいコミットハッシュを標準出力に出力します:

$ git-pow $(git rev-parse HEAD) 2>/dev/null
0000000fd579756514831a4b58a7b978b9f1205

現在のHEADを新しいコミットに更新するには、reset, rebase --onto, update-refなどのGitコマンドを使用します:

git reset --hard $(git-pow $(git rev-parse HEAD))

仕様

コミットハッシュの探索は、コミットメッセージの末尾にnonce値を16進数形式で追加することで行います。

アルゴリズム

  1. 指定されたコミットハッシュからGit Objectを読み込む
  2. コミットメッセージの末尾にnonce値(16桁の16進数)を追加
  3. 新しいコミットオブジェクトのSHA-1ハッシュを計算
  4. ハッシュの前n桁が0になるまで、nonce値をインクリメントして繰り返す

難易度設定

--difficultyオプションで指定された値に基づいて、ハッシュの前何桁を0にするかが決まります:

実装

  1. 指定されたコミットハッシュから.git/objects/ディレクトリのオブジェクトファイルを読み込む
  2. zlibで圧縮されたGit Objectを解凍・パース
  3. コミットメッセージの末尾にnonce値を追加してオブジェクトサイズを更新
  4. SHA-1ハッシュを計算し、難易度条件を満たすまで繰り返す
  5. 条件を満たすハッシュが見つかったら、新しいコミットオブジェクトを.git/objects/に保存

技術スタック

  • ハッシュ計算の速度のためRustを採用
  • SHA-1ハッシュ計算には sha1 クレートを使用
  • zlibの解凍には flate2 を使用
  • CLIの実装には clap を使用(derive機能付き)
  • テストには proptest を使用
  • packファイルは対象外
  • GPG署名は対象外

Git Objectの構造

Git Objectの全体構造:

object = header + content
header = ASCII("<type> <size>") + NUL(0x00)
type   = "commit"
size   = contentのバイト数をASCII 10進で表したもの
content = commit本文

commit本文の構造:

content = headers + "\n" + message
headers = 1行以上のheaderLineの連結(各行末は"\n")
message = 任意のバイト列(通常UTF-8テキスト)

このツールではsizemessageのみを変更します。

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages