// TxData는 트랜잭션의 기본 데이터를 나타내기 위한 인터페이스입니다.//// 이 인터페이스는 DynamicFeeTx, LegacyTx, AccessListTx에 의해 구현됩니다.type TxData interface {
txType() byte// 트랜잭션 타입 ID를 반환합니다.copy() TxData // 깊은 복사본을 만들어 새로운 TxData를 반환합니다.
chainID() *big.Int
accessList() AccessList
data() []byte
gas() uint64
gasPrice() *big.Int
gasTipCap() *big.Int
gasFeeCap() *big.Int
value() *big.Int
nonce() uint64
to() *common.Address
rawSignatureValues() (v, r, s *big.Int)
setSignatureValues(chainID, v, r, s *big.Int)
// effectiveGasPrice는 트랜잭션이 지불하는 가스 가격을 계산합니다. 트랜잭션이 포함된 블록의 baseFee가 주어집니다.//// 다른 TxData 메서드와 달리, 반환된 *big.Int는 계산된 값의 독립적인 복사본이어야 합니다.// 즉, 호출자는 결과를 변경할 수 있습니다. 메서드 구현은 'dst'를 사용하여 결과를 저장할 수도 있습니다.
effectiveGasPrice(dst *big.Int, baseFee *big.Int) *big.Int
encode(*bytes.Buffer) error
decode([]byte) error
}
// LegacyTx는 근본 이더리움 트랜잭션 데이터입니다.type LegacyTx struct {
Nonce uint64// 발신자 계정의 nonce
GasPrice *big.Int // 가스당 wei
Gas uint64// 가스 한도
To *common.Address `rlp:"nil"`// 수신자의 주소. nil이면 컨트랙트 생성 트랜잭션
Value *big.Int // wei 단위의 이더량
Data []byte// 컨트랙트 생성 트랜잭션의 경우 생성자의 바이트코드. 그 외의 경우 호출 데이터
V, R, S *big.Int // 서명 값
}
// AccessList은 EIP-2930에 정의된 접근 목록입니다.type AccessList []AccessTuple
// AccessTuple은 접근 목록의 요소입니다.type AccessTuple struct {
Address common.Address `json:"address" gencodec:"required"`
StorageKeys []common.Hash `json:"storageKeys" gencodec:"required"`
}
// AccessListTx는 EIP-2930 접근 목록 트랜잭션의 데이터입니다.type AccessListTx struct {
ChainID *big.Int // 대상 체인 ID
Nonce uint64// 발신자 계정의 nonce
GasPrice *big.Int // 가스당 wei
Gas uint64// 가스 한도
To *common.Address `rlp:"nil"`// 수신자의 주소. nil이면 컨트랙트 생성 트랜잭션
Value *big.Int // wei 단위의 이더량
Data []byte// 컨트랙트 생성 트랜잭션의 경우 생성자의 바이트코드. 그 외의 경우 호출 데이터
AccessList AccessList // 접근 목록
V, R, S *big.Int // 서명 값
}
// SignTx는 주어진 서명자와 개인 키를 사용하여 트랜잭션에 서명합니다.funcSignTx(tx *Transaction, s Signer, prv *ecdsa.PrivateKey)(*Transaction, error) {
h := s.Hash(tx) // 서명 해시 생성 (Signer에 따라 다르게 생성됨)
sig, err := crypto.Sign(h[:], prv) // 개인 키로 서명 (직렬화된 서명 데이터 반환)if err != nil {
returnnil, err
}
return tx.WithSignature(s, sig) // 트랜잭션에 서명 데이터 추가 (V, R, S 값 설정 + 서명자의 체인 ID 설정)
}
// Signer는 트랜잭션 서명 처리 기능을 캡슐화합니다. 이 타입의 이름은 약간 오해의 소지가 있습니다.// 왜냐하면 Signer는 실제로 서명하지 않고 서명을 검증하고 처리하기 위한 것이기 때문입니다.//// 참고로 이 인터페이스는 안정적인 API가 아니며 새로운 프로토콜 규칙을 수용하기 위해 언제든지 변경될 수 있습니다.type Signer interface {
// Sender는 트랜잭션의 발신자 주소를 반환합니다.
Sender(tx *Transaction) (common.Address, error)
// SignatureValues는 주어진 서명에 해당하는 원시 R, S, V 값을 반환합니다.
SignatureValues(tx *Transaction, sig []byte) (r, s, v *big.Int, err error)
ChainID() *big.Int
// Hash는 '서명 해시'를 반환합니다. 즉, 개인 키를 사용하여 서명되기 전의 트랜잭션 해시입니다.// 이 해시는 트랜잭션을 고유하게 식별하지는 않습니다.
Hash(tx *Transaction) common.Hash
// Equal은 주어진 서명자가 수신자와 동일한지 여부를 반환합니다.
Equal(Signer) bool
}