자주 사용되는 big.Int 타입의 상수들을 정의합니다.
바이트열을 다루는 함수들을 정의합니다. (Conversion, Padding, Trimming, Copy, Slicing)
// 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진수 문자열을 바이트열로 변환
}
time.Duration을 예쁘게 출력하기 위한 타입들과 그 타입들의 메서드들을 정의합니다.
float64 타입의 사용자 친화적인 출력 형식을 지원하기 위해 StorageSize 타입을 정의합니다.
// 해시와 주소의 길이 (바이트 단위)
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 지원을 위한 메서드들을 정의합니다.
// 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[:]
}
읽어보기