common 패키지

big.go

  • 자주 사용되는 big.Int 타입의 상수들을 정의합니다.

bytes.go

  • 바이트열을 다루는 함수들을 정의합니다. (Conversion, Padding, Trimming, Copy, Slicing)

주요 함수

FromHex 함수

// FromHex는 16진수 문자열 s로부터 바이트열을 반환합니다.
// s는 "0x"로 시작할 수 있습니다.
func FromHex(s string) []byte {
	if has0xPrefix(s) { // 0x로 시작하는 경우 - 0x 제거 (hex.DecodeString은 16진수 문자열이 아닌 경우 에러 반환 (x는 16진수가 아님))
		s = s[2:]
	}
	if len(s)%2 == 1 { // 홀수인 경우 - 앞에 0 추가
		s = "0" + s
	}
	return Hex2Bytes(s) // 16진수 문자열을 바이트열로 변환
}

debug.go

  • 디버깅을 위한 함수들을 정의합니다.

format.go

  • time.Duration을 예쁘게 출력하기 위한 타입들과 그 타입들의 메서드들을 정의합니다.

path.go

  • 파일 경로를 다루는 함수들을 정의합니다.

size.go

  • float64 타입의 사용자 친화적인 출력 형식을 지원하기 위해 StorageSize 타입을 정의합니다.

types.go

  • 자주 사용되는 타입들을 정의합니다.

주요 타입들

// 해시와 주소의 길이 (바이트 단위)
const (
	// 해시의 길이는 32바이트
	HashLength = 32
	// 주소의 길이는 20바이트
	AddressLength = 20
)

// Hash는 임의의 데이터의 Keccak256 해시를 나타냅니다. (32바이트)
type Hash [HashLength]byte

// Address는 이더리움 계정의 20바이트 주소를 나타냅니다.
type Address [AddressLength]byte

공통 기능

  • SQL Database 지원을 위한 database/sql 패키지의 Scanner, database/sql/driver 패키지의 Valuer 인터페이스를 구현합니다.
  • GraphQL 지원을 위한 메서드들을 정의합니다.

EIP-55 주소 체크섬

// Hex는 EIP55 호환성을 갖는 16진수 문자열 표현을 반환합니다.
func (a Address) Hex() string {
	return string(a.checksumHex())
}

// checksumHex는 EIP55 호환성을 갖는 16진수 문자열 표현을 바이트열로 반환합니다.
func (a *Address) checksumHex() []byte {
	buf := a.hex() // 16진수 형식의 주소 (0x 접두사 포함, 모두 소문자)

	// compute checksum
	sha := sha3.NewLegacyKeccak256()
	sha.Write(buf[2:])              // 0x를 제외한 소문자 주소를 해시 함수의 입력으로 사용
	hash := sha.Sum(nil)            // keccak256 해시
	for i := 2; i < len(buf); i++ { // 접두사 0x를 제외하고 EIP55 호환성을 위해 16진수 문자열을 대문자로 변환
		hashByte := hash[(i-2)/2] // buf[i]의 대응하는 해시 바이트
		if i%2 == 0 {             // 짝수 인덱스의 경우
			hashByte = hashByte >> 4 // 상위 4비트 추출
		} else {
			hashByte &= 0xf // 하위 4비트 추출
		}
		if buf[i] > '9' && hashByte > 7 { // buf[i]가 숫자가 아니고, hashByte가 0x8 이상인 경우
			buf[i] -= 32 // 대문자로 변환
		}
	}
	return buf[:]
}

// hex는 0x 접두사를 포함한 16진수 문자열 표현의 바이트열을 반환합니다.
func (a Address) hex() []byte {
	var buf [len(a)*2 + 2]byte
	copy(buf[:2], "0x")
	hex.Encode(buf[2:], a[:])
	return buf[:]
}

읽어보기