C\#자신의 블록 체인 채굴 알고리즘 을 작성 합 니 다.
7245 단어 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\#를 사용 하여 자신의 블록 체인 채굴 알고리즘 을 작성 하 는 것 입 니 다.여러분 에 게 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 메 시 지 를 남 겨 주세요.편집장 님 께 서 신속하게 답 해 드 리 겠 습 니 다.여기 서도 저희 사이트 에 대한 여러분 의 지지 에 감 사 드 립 니 다!
만약 당신 이 본문 이 당신 에 게 도움 이 된다 고 생각한다 면,전 재 를 환영 합 니 다.번 거 로 우 시 겠 지만 출처 를 밝 혀 주 십시오.감사합니다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.