>백엔드 개발 >Golang >golang 이더리움 전송

golang 이더리움 전송

PHPz
PHPz원래의
2023-05-14 14:06:381111검색

암호화폐의 인기와 함께 이더리움은 비트코인과 함께 가장 인기 있는 암호화폐 중 하나가 되었습니다. 이더리움은 사용자가 더 광범위한 거래와 상호작용을 수행할 수 있게 해주는 강력한 스마트 계약 기능을 갖춘 플랫폼입니다. Golang은 빠르고 성능 효율적인 프로그래밍 언어로, 이더리움 트랜잭션을 처리하는 데 이상적인 언어입니다. 이 기사에서는 Golang을 사용하여 Ethereum 전송 프로그램을 작성하는 방법을 소개합니다.

  1. Golang 설치

Golang Ethereum 전송 작성을 시작하기 전에 Golang이 컴퓨터에 설치되어 있는지 확인해야 합니다. https://golang.org/dl/을 방문하여 운영 체제에 맞는 Golang 설치 프로그램을 다운로드할 수 있습니다.

  1. Web3 라이브러리 설치

Web3는 Ethereum 노드와 상호 작용하기 위한 인터페이스를 제공하는 JavaScript 라이브러리입니다. 이를 사용하여 Ethereum 거래를 보내고 Ethereum 계정 잔액을 확인할 수 있습니다.

Golang에서 Web3 라이브러리를 사용하려면 golang.org/x/crypto/sha3 라이브러리를 사용하여 이더리움 거래와 관련된 해시를 계산해야 합니다. 다음 명령을 사용하여 두 라이브러리를 모두 설치할 수 있습니다.

go get -u github.com/ethereum/go-ethereum

go get -u golang.org/x/crypto/sha3
  1. Ethereum 노드에 연결

Ethereum 트랜잭션을 보내기 전에 Ethereum 노드에 연결해야 합니다. 이더리움 노드는 이더리움 블록체인을 실행하는 컴퓨터이며 트랜잭션 전송, 블록 높이 쿼리 등과 같은 요청을 보내 통신할 수 있습니다.

Ethereum 노드의 설정과 코드가 실행되는 환경에 따라 HTTP 또는 IPC를 통해 Ethereum 노드에 연결할 수 있습니다.

다음 예에서는 Ethereum 공개 노드에 연결합니다. 다음 코드를 사용하여 Ethereum 노드에 연결할 수 있습니다:

package main

import (
    "context"
    "fmt"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/ethclient"
)

func main() {
    client, err := ethclient.Dial("https://mainnet.infura.io")
    if err != nil {
        fmt.Println("Failed to connect to the Ethereum network: ", err)
        return
    }

    // Do something with the client...
}

이 코드는 Ethereum 공용 노드(https://mainnet.infura.io)에 연결하고 Ethereum과 함께 사용할 수 있는 ethclient.Client 인스턴스를 반환합니다. 상호작용할 노드.

  1. 거래 생성

이더리움으로 거래를 보내기 전에 거래 매개변수를 설정해야 합니다. 가장 중요한 것은 다음과 같습니다:

  • Sender Address
  • Receiver Address
  • Transfer Amount
  • Gas Price
  • Gas Limit

Gas는 Ethereum 네트워크에서 계산 비용을 측정하는 단위입니다. 가격은 가스 단위당 지불할 의사가 있는 이더리움의 양입니다. 한도는 거래에 대해 지불할 의사가 있는 최대 가스 금액입니다.

다음 코드를 사용하여 거래를 생성할 수 있습니다:

// Sender and recipient addresses
fromAddress := common.HexToAddress("0xA97c32E990157aEbe7b14dD062a45C454a035B64")
toAddress := common.HexToAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")

// Amount to transfer
amount := big.NewInt(1000000000000000000) // 1 ETH

// Gas price and gas limit
gasPrice, err := client.SuggestGasPrice(context.Background())
if err != nil {
    fmt.Println("Failed to get gas price: ", err)
    return
}
gasLimit := uint64(21000)

// Nonce
nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
if err != nil {
    fmt.Println("Failed to get nonce: ", err)
    return
}

// Create transaction
tx := types.NewTransaction(
    nonce,
    toAddress,
    amount,
    gasLimit,
    gasPrice,
    nil,
)

//TODO: Sign transaction

이 코드에서는 보내는 사람 주소, 받는 사람 주소, 이체 금액, 가스 가격, 가스 한도 및 Nonce(거래 일련 번호)를 설정합니다.

위 데이터가 포함된 서명되지 않은 새 트랜잭션(types.Transaction)도 생성합니다. 그러나 우리는 또한 이더리움 노드가 발신자가 승인했는지 확인할 수 있도록 트랜잭션에 서명해야 합니다.

  1. 서명된 거래

이더리움에서 거래는 개인 키를 사용하여 서명됩니다. 개인 키는 이더리움 계정 주소에 해당하며 보낸 사람의 개인 키를 사용하여 거래에 서명해야 합니다.

개인 키를 사용하여 거래에 서명하는 방법은 다음과 같습니다.

// Private key (32 byte slice)
privateKey := []byte{...}

// Sign transaction
signer := types.NewEIP155Signer(big.NewInt(1)) // Chain ID: 1 (Mainnet)
signedTx, err := types.SignTx(tx, signer, privateKey)
if err != nil {
    fmt.Println("Failed to sign transaction: ", err)
    return
}

이 코드에서는 유형.SignTx 함수를 사용하여 보낸 사람의 개인 키와 함께 거래에 서명합니다. 또한 이 특정 계약에 대한 체인 ID를 설정했습니다(1은 이더리움 메인넷을 나타냄).

이제 ethclient.Client를 사용하여 서명된 트랜잭션을 보낼 수 있습니다.

// Send signed transaction
err = client.SendTransaction(context.Background(), signedTx)
if err != nil {
    fmt.Println("Failed to send transaction: ", err)
    return
}

fmt.Printf("Transaction sent: %s
", signedTx.Hash().Hex())
  1. 전체 코드 예
package main

import (
    "context"
    "crypto/ecdsa"
    "fmt"
    "log"
    "math/big"

    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/ethclient"
    "github.com/ethereum/go-ethereum/core/types"
)

func main() {
    client, err := ethclient.Dial("https://mainnet.infura.io")
    if err != nil {
        log.Fatalf("Failed to connect to the Ethereum network: %v", err)
    }

    // Sender and recipient addresses
    fromAddress := common.HexToAddress("0xA97c32E990157aEbe7b14dD062a45C454a035B64")
    toAddress := common.HexToAddress("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")

    // Amount to transfer
    amount := big.NewInt(1000000000000000000) // 1 ETH

    // Gas price and gas limit
    gasPrice, err := client.SuggestGasPrice(context.Background())
    if err != nil {
        log.Fatalf("Failed to get gas price: %v", err)
    }
    gasLimit := uint64(21000)

    // Nonce
    nonce, err := client.PendingNonceAt(context.Background(), fromAddress)
    if err != nil {
        log.Fatalf("Failed to get nonce: %v", err)
    }

    // Create transaction
    tx := types.NewTransaction(
        nonce,
        toAddress,
        amount,
        gasLimit,
        gasPrice,
        nil,
    )

    // Private key (32 byte slice)
    privateKey, err := crypto.HexToECDSA("YOUR_PRIVATE_KEY_HERE")
    if err != nil {
        log.Fatalf("Failed to get private key: %v", err)
    }

    // Sign transaction
    chainID, err := client.NetworkID(context.Background())
    if err != nil {
        log.Fatalf("Failed to get chain ID: %v", err)
    }
    signer := types.NewEIP155Signer(chainID)
    signedTx, err := types.SignTx(tx, signer, privateKey)
    if err != nil {
        log.Fatalf("Failed to sign transaction: %v", err)
    }

    // Send signed transaction
    err = client.SendTransaction(context.Background(), signedTx)
    if err != nil {
        log.Fatalf("Failed to send transaction: %v", err)
    }

    fmt.Printf("Transaction sent: %s
", signedTx.Hash().Hex())
}

위는 Golang을 사용하여 Ethereum 전송 프로그램을 작성하는 전체 과정입니다. 물론 개인 키 관리, 거래 확인 등 고려해야 할 세부 사항과 보안 문제가 더 있습니다.

위 내용은 golang 이더리움 전송의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.