C\#자신의 블록 체인 채굴 알고리즘 을 작성 합 니 다.

무엇이 암호 화폐 발굴 입 니까?
하나의 암호 화폐의 가 치 는 희소 성에 나타난다.만약 에 누구나 비트 코 인 을 임의로 구성 할 수 있다 면 비트 코 인 은 가치 가 없 기 때문에 비트 코 인의 블록 체인 은 참여 자 에 게'작업'을 완성 하 게 하고 이 작업 의 최종 결과 에 따라 비트 코 인 을 나 누 어 주 는데 이 과정 을'채굴'이 라 고 부른다.황금 광부 가 일 하 는 데 시간 을 들 여 황금 을 얻 는 것 과 비슷 하 다.
채굴 의 원리
바 이 두/구 글 이 비트 코 인 채굴 원 리 를 검색 하면 복잡 한 수학 문 제 를 계산 하 는 것 이 라 고 할 수 있 지만 이렇게 말 하 는 것 은 너무 추상 적 이 고 간단 하 다.채광 엔진 이 어떻게 작 동 하 는 지 는 중요 한 지식 이기 때문에 우 리 는 암호학 지식 과 해시 알고리즘 에 관 한 지식 을 알 아야 광산 발굴 의 기본 원 리 를 알 수 있다.
해시
단 방향 암호 화 인간 이 이해 할 수 있 는 입력,예 를 들 어 Hello World 를 특정한 암호 화 함수(이른바 복잡 한 수학 문제)에 버 리 면 암호 화 함수 의 알고리즘 이 복잡 할 수록 역방향 공정 이 어렵다.
예 를 들 어 SHA-256 의 예 를 들 어 이 사이트(링크:http://tool.oschina.net/encrypt?type=2)는 해시 값 을 빠르게 계산 할 수 있 습 니 다.'Hello World'를 해시 하여 어떤 결 과 를 얻 을 수 있 는 지 보 겠 습 니 다.

몇 번 을 시험 해 보 더 라 도 똑 같은 해시 값 을 얻 을 수 있 습 니 다.프로 그래 밍 에서 이러한 것 을 멱 등 성 이 라 고 합 니 다.
암호 화 알고리즘 의 기본 적 인 특징 중 하 나 는 역방향 공 사 를 통 해 명문 결 과 를 얻 기 어렵 지만 그들의 암호 화 결 과 를 검증 하기 쉽다 는 것 이다.예 를 들 어 이곳 의'Hello World'는 역방향 공 사 를 통 해 그의 원래 명문 결 과 를 얻 기 어렵다.비트 코 인 은 Double SHA-256,즉 명문 을 SHA-256 로 한 번 계산 한 후에SHA-256 을 해시 값 에 대해 다시 계산 합 니 다.여기 서 우 리 는 SHA-256 만 사용 하여 암호 화 합 니 다.
작업 증명서
비트 코 인 은 참여 자 에 게 무 작위 자모 와 숫자의 조합 을 산열 시 켜 계산 한 산열 이 전도 0 을 포함 할 때 까지 한다.
예 를 들 어 우리 가 886 의 산열 값 을 계산 하면 다음 과 같은 결 과 를 얻 을 수 있다.
000f21ac06aceb9cdd0575e82d0d85fc39bed0a7a1d71970ba1641666a44f530
그것 은 0 을 접두사 로 하 는 해시 값 3 개 를 되 돌려 주 었 으 나,886 이 계산 한 해시 결과 가 3 개 0 이 생 겼 다 는 것 을 어떻게 알 았 습 니까?
답 은 내 가 알 필요 가 없다 는 거 야.나 는 광부 가 나 에 게 준 산열 값 전도 에 0 이 몇 개 있 는 지 알 아야 한다.복잡 한 알고리즘 으로 전체 산열 값 의 유효성 을 검증 할 필요 가 없다.
비트 코 인 은 조금 복잡 합 니 다.10 분 마다 새로운 블록 을 생 성 합 니 다.새로운 블록 의 해시 값 의 난이 도 는 동태 적 으로 조정 할 수 있 습 니 다.CLR 의 GC 와 같이 현재 채굴 하 는 인원수 에 따라 난이도 동태 적 으로 조정 할 수 있 습 니 다.만약 에 채굴 하 는 사람 이 많 으 면 난이 도 를 높 일 수 있 고 적 으 면 낮 출 수 있 습 니 다.
개발 에 착수 하 다
1.프로젝트 설정
먼저 Asp.Net Core 프로젝트 를 새로 만 든 다음 Empty Project(빈 프로젝트)형식 을 선택 하 십시오.생 성 이 완료 되면 어떠한 설정 도 할 필요 가 없습니다.
2.데이터 모델
여기 서 구체 적 인 블록 데이터 모델 을 만 들 고 Struct 구조 체 를 사용 합 니 다.

public struct Block 
{ 
  /// <summary> 
  ///      
  /// </summary> 
  public int Index { get; set; } 
  /// <summary> 
  ///         
  /// </summary> 
  public string TimeStamp { get; set; } 
  /// <summary> 
  ///      
  /// </summary> 
  public int BPM { get; set; } 
  /// <summary> 
  ///    SHA-256     
  /// </summary> 
  public string Hash { get; set; } 
  /// <summary> 
  ///       SHA-256     
  /// </summary> 
  public string PrevHash { get; set; } 
  /// <summary> 
  ///           
  /// </summary> 
  public int Difficulty { get; set; } 
  /// <summary> 
  ///     
  /// </summary> 
  public string Nonce { get; set; } 
}
Difficulty 는 성형 입 니 다.그 는 우리 가 하 쉬 선도 0 의 수량 을 얻 고 싶 어 하 는 것 을 정 의 했 습 니 다.선도 0 이 많 을 수록 정확 한 해시 값 을 만 드 는 것 이 어렵 습 니 다.우 리 는 지금 1 부터 시작 합 니 다.
Nonce 는 블록 해시 값 을 계산 할 때마다 필요 한 무 작위 값 입 니 다.
3.업무 증명서
우 리 는 먼저 생 성 된 해시 값 이 지정 한 수량의 전도 0 을 포함 하 는 지 검증 하 는 새로운 방법 을 추가 합 니 다.

/// <summary> 
///    Hash      
/// </summary> 
/// <param name="hashStr">Hash  </param> 
/// <param name="difficulty">  </param> 
/// <returns></returns> 
public static bool IsHashValid(string hashStr, int difficulty) 
{ 
      var bytes = Enumerable.Range(0, hashStr.Length) 
        .Where(n => n % 2 == 0) 
        .Select(n => Convert.ToByte(hashStr.Substring(n, 2), 16)) 
        .ToArray(); 
      var bits = new BitArray(bytes); 
      for (var i = 0; i < difficulty; i++) 
      { 
        if (bits[i]) return false; 
      } 
      return true; 
}
그리고 저 희 는 이전 블록 Hash 의 생 성 방법 을 변 경 했 습 니 다.

/// <summary> 
///      HASH   
/// </summary> 
/// <param name="block">    </param> 
/// <returns>          </returns> 
public static string CalculateHash(Block block) 
{ 
  string calculationStr = $"{block.Index}{block.TimeStamp}{block.BPM}{block.PrevHash}{block.Nonce}"; 
  SHA256 sha256Generator = SHA256.Create(); 
  byte[] sha256HashBytes = sha256Generator.ComputeHash(Encoding.UTF8.GetBytes(calculationStr)); 
  StringBuilder sha256StrBuilder = new StringBuilder(); 
  foreach (byte @byte in sha256HashBytes) 
  { 
    sha256StrBuilder.Append(@byte.ToString("x2")); 
  } 
  return sha256StrBuilder.ToString(); 
}
여기 서 우 리 는 해시 생 성의 근거 로 Nonce 랜 덤 값 을 새로 추 가 했 습 니 다.
그럼 우리 가 새로운 블록 을 만 드 는 김 에 광산 을 파 보 자.

/// <summary> 
///        
/// </summary> 
/// <param name="oldBlock">      </param> 
/// <param name="BPM">  </param> 
/// <returns>    </returns> 
public static Block GenerateBlock(Block oldBlock, int BPM) 
{ 
  Block newnewBlock = new Block() 
  { 
    Index = oldBlock.Index + 1, 
    TimeStamp = CalculateCurrentTimeUTC(), 
    BPMBPM = BPM, 
    PrevHash = oldBlock.Hash, 
    DifficultyDifficulty = Difficulty 
  }; 
  //    ing... 
  for (int i = 0; ; i++) 
  { 
    newBlock.Nonce = i.ToString("x2"); 
    if (!IsHashValid(CalculateHash(newBlock), Difficulty)) 
    { 
      Console.WriteLine($"    :{CalculateHash(newBlock)} ,     ..."); 
      Task.Delay(1); 
      continue; 
    } 
    else 
    { 
      Console.WriteLine($"    :{CalculateHash(newBlock)} ,    ..."); 
      newBlock.Hash = CalculateHash(newBlock); 
      break; 
    } 
  } 
  //      
  // newBlock.Hash = CalculateHash(newBlock); 
  return newBlock; 
}
효과.


결어
사실 코드 는 복잡 하지 않 지만 이 몇 십 줄 의 코드 는 블록 체인 채굴 의 본질 을 나타 낸다.그 다음 에 원문 을 참고 하여 P2P 와 주주 권 권익 증명 방법 과 스마트 계약 을 실현 할 수 있다.
총결산
위 에서 말씀 드 린 것 은 C\#를 사용 하여 자신의 블록 체인 채굴 알고리즘 을 작성 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!

좋은 웹페이지 즐겨찾기