작업증명 mining

블럭을 채굴 (mining)할때는 난위도를 조정하는데
difficulty 생성방법

const Block_GNERATION_INTERVAL = 10 //	second 단위 :초 //블럭생성간격
const DIFFICULTY_ADJUSTMENT_INTERVAL = 10 // in blocks 블럭마다 난위도가 조정되는 간격 //블럭10개만들어질때마다 난위도조정

기대시간 = 초 * 난위도 (크거나작으면 특정시간을 조정해서 맞춤)

function getAdjustDifficulty(lastBlock, blocks){
	const prevAdjustmentBlcok = blocks[blocks.length - DIFFICULTY_ADJUSTMENT_INTERVAL];
	const elapsedTime = lastBlock.header.timestamp - prevAdjustmentBlcok.header.timestamp;//실제난위도 조정된간격
	const expectedTime = Block_GNERATION_INTERVAL * DIFFICULTY_ADJUSTMENT_INTERVAL;

	if (expectedTime / 2 > elapsedTime ){
		return prevAdjustmentBlcok.header.difficulty +1;//난위도올리기
	}
	else if (expectedTime *2 < elapsedTime){
		return prevAdjustmentBlcok.header.difficulty - 1;

	}
	else {
		return prevAdjustmentBlcok.header.difficulty;
	}
}

기대시간/2 보다 경과된 시간이 작으면 난위도를 올린다.
경과된시간이 기대시간/2 보다 크면 난위도를 내린다.
그외는 그냥 리턴

function getDIfficulty(blocks){
	const lastBlock = blocks[blocks.length - 1]
	if (lastBlock.header.index !==0 && 
		lastBlock.header.difficulty.index % DIFFICULTY_ADJUSTMENT_INTERVAL === 0){
		return getAdjustDifficulty(lastBlock,blocks);
	}
	return lastBlock.header.difficulty;
}

getDIfficulty함수
블럭의 헤더의 인덱스가 0 이고 (제네시스블럭)
블럭의 difficulty 인덱스를 DIFFICULTY_ADJUSTMENT_INTERVAL로 나눈 나머지가 0일때..
예를들어 지금 DIFFICULTY_ADJUSTMENT_INTERVAL가 10이니까 10배수...10,20,30...
return getAdjustDifficulty 위에 만든 함수로 난위도 조정
그외는 lastBlock.header.difficulty 리턴

타임도조정
시간구하는 함수

function getCurrentTimestamp(){
	return Math.round(Date().getTime() / 1000);
}

Math.round : 반올림

function isValidTimestamp(newBlock, prevBlock){
	if(newBlcok.header.timestamp - prevBlock.header.timestamp> 60)
		return false;
	if( getCurrentTimestamp() - newBlock.header.timestamp > 60)
		return false;

	return true;

}

isValidTimestamp 함수
newBlock.header.timestamp - prevBlock.header.timestamp 가 60보다 크면 조정
getCurrentTimestamp() - newBlock.header.timestamp 가 60보다 크면 조정

checkVaildBlock.js안에 이어서
isValidNewBlock 함수 안에

///////////////////////////////////추가
else if (!isValidTimestamp(newBlock,previousBlock)){
	console.log("Invalid Timestamp")
	return false;
}

else if(!hashMatchesDifficulty(createHash(newBlock),newBlock.header.difficulty)){
console.log("Invalid hash")
return false;
}
return true;

좋은 웹페이지 즐겨찾기