Реализация передачи токена Ethereum с помощью Golang

задняя часть Go блокчейн Эфириум

Личный профиль

[HundredLee]

  • Начал бизнес в 2013 году и начал работать в области разработки цифровых валют, инженером по разработке блокчейнов, iOS и веб-разработчиком. В настоящее время является техническим директором известного отечественного разработчика платформы для торговли цифровой валютой. Четыре года технических осадков, клиенты распространились по всей стране и за рубежом, и есть высокоскоростной механизм согласования JAVA собственной разработки.
  • Вейбо:Weibo.com/сотня Ли2…
  • Почта :hundred9411#gmail.com
  • Blog : blog.sodroid.com

Что такое жетоны?

В 2017 году блокчейн стал популярным во всем интернет-финансовом кругу, особенно с появлением ICO, благодаря которому многие люди узнали о цифровой валюте. Мы знаем, что Ethereum в настоящее время является самой популярной системой цифровой валюты и блокчейна, и eth достиг 2000+ юаней каждая. Помню, когда я впервые познакомился с Эфириумом, их было более 30 штук.

  • Так что же такое токены? В блокчейне Ethereum мы называем токен Token, который является цифровым активом, который каждый в блокчейне Ethereum может выпускать произвольно. И он должен соответствовать стандарту erc20.Что касается стандарта erc20, вы можете обратиться к этой статье.тебе туда um.wiki/me/index.php…
  • На самом деле это часть кода смарт-контракта, который должен иметь следующие функции и события.
contract ERC20 {
      function totalSupply() constant returns (uint totalSupply);
      function balanceOf(address _owner) constant returns (uint balance);
      function transfer(address _to, uint _value) returns (bool success);
      function transferFrom(address _from, address _to, uint _value) returns (bool success);
      function approve(address _spender, uint _value) returns (bool success);
      function allowance(address _owner, address _spender) constant returns (uint remaining);
      event Transfer(address indexed _from, address indexed _to, uint _value);
      event Approval(address indexed _owner, address indexed _spender, uint _value);
 }
  • Код Smart Contract работает в виртуальной машине Ethereum Smart Contract. Заинтересованные студенты могут учиться. Прикрепите документ:Solidity.читать документ S.IO/ru/latest/i…

  • Мы видим приведенный выше код, похожий на интерфейс в golang, который содержит такие методы, как общая сумма, баланс и перевод. Сегодня мы сосредоточимся на использовании golang для реализации методов Transfer и TransferFrom.

  • Введите тему ниже.

Подключиться к узлу Ethereum RPC

  • В настоящее время широко используется go-ethereum, имя его клиента — geth. Вы можете скомпилировать, установить и т. д., чтобы создать узел на своем компьютере или сервере и открыть службу rpc. В этой статье этот шаг пропущен, в Интернете есть статьи, которые вы можете понять.
  • Прикрепите гитхаб:GitHub.com/ether EU M/иди...
  • Порт rpc по умолчанию для geth:8545, я использую порт по умолчанию, мы все используем его позжеhttp://127.0.0.1:8545как наше соединение rpc.

Сначала получите код go-ethereum

  • go get github.com/ethereum/go-ethereum
  • Затем идем в каталог ethereum, если нет проблем с вашей средой golang, то это должен быть этот путь.
  • cd $GOPATH/src/github.com/ethereum/go-ethereum
  • Когда вы войдете в каталог и увидите, что код полностью стянулся, то можно переходить к следующему шагу.

Подключиться к узлу RPC

  • Не бб.. мы переходим непосредственно к коду.

import (
    "github.com/ethereum/go-ethereum/rpc"
    "github.com/ethereum/go-ethereum/ethclient"
)

rpcDial, err := rpc.Dial("http://127.0.0.1:8545")
if err != nil {
    panic(err);    
}
client := ethclient.NewClient(rpcDial)
  • Если паники нет, то мы успешно подключили узел. (^__^)

Создать тестовую учетную запись

  • Чтобы выполнить тест передачи, нам нужны две учетные записи Ethereum. Мы используем golang для его генерации, мы знаем, что закрытый ключ учетной записи Ethereum находится в файле хранилища ключей, который является частью json, и пароль может быть установлен при его создании. Он имеет то же значение, что и файл wallet.dat в биткойнах: если вы его не видите, ваши активы навсегда останутся в сети блокчейна, и их нельзя будет снова получить.
  • Ниже мы используем код для создания двух учетных записей Ethereum.

import (
    "github.com/ethereum/go-ethereum/accounts/keystore"
)

ks := keystore.NewKeyStore("/", keystore.StandardScryptN, keystore.StandardScryptP)

address, _ := ks.NewAccount("password")
account, err := ks.Export(address, "password", "password")

if err != nil {
    panic(err)
}
  • Как видно из приведенного выше кода, я создал учетную запись Ethereum с паролем, установленным наpasswordи экспорт. наконец-тоaccountПеременная — это закрытый ключ учетной записи, который представляет собой фрагмент текста json. Мы можем видеть, как это выглядит.
  • пройти черезaddressпеременная, мы можем получить адрес счета. нравитсяaddress.Address.Hex()

{"address":"41e2f6a4eb0e61f627207ec4a3f7098388174368","crypto":{"cipher":"aes-128-ctr","ciphertext"
:"c0b10f9a3ca83837de83d38ca95bef200170d97e818f15bbc35642b6076c4a16",
"cipherparams":{"iv":"e46c3f2c76b35eedd7b065677faf6927"},
"kdf":"scrypt",
"kdfparams":
{"dklen":32,"n":262144,"p":1,"r":8,"salt"
:"05c8493a6a8518451c18ac05785e6c60507d906b130ee859e99804f0df90b63d"},
"mac"
:"62f52d9c4a078765b496cf76ed50634199c509e2d6e91106e24276d51124b971"}
,"id"
:"6c00339c-773b-4862-bb61-3a51a6f671ee",
"version":3}
  • В любом случае, это такой кусок json, который надо правильно хранить.

Генерация файла токенов

  • Открытымcd $GOPATH/src/github.com/ethereum/go-ethereum/cmd/abigenвы можете увидеть файл main.go
  • воплощать в жизньgo build main.go, создастmainбинарный файл.

  • Сохраните следующий json как token.abi и поместите его в текущий каталог.


[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"stop","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"guy","type":"address"},{"name":"wad","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"owner_","type":"address"}],"name":"setOwner","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint128"}],"name":"push","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"name_","type":"bytes32"}],"name":"setName","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint128"}],"name":"mint","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"stopped","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"authority_","type":"address"}],"name":"setAuthority","outputs":[],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"src","type":"address"},{"name":"wad","type":"uint128"}],"name":"pull","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"wad","type":"uint128"}],"name":"burn","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"bytes32"}],"payable":false,"type":"function"},{"constant":false,"inputs":[{"name":"dst","type":"address"},{"name":"wad","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"type":"function"},{"constant":false,"inputs":[],"name":"start","outputs":[],"payable":false,"type":"function"},{"constant":true,"inputs":[],"name":"authority","outputs":[{"name":"","type":"address"}],"payable":false,"type":"function"},{"constant":true,"inputs":[{"name":"src","type":"address"},{"name":"guy","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"type":"function"},{"inputs":[{"name":"symbol_","type":"bytes32"}],"payable":false,"type":"constructor"},{"anonymous":true,"inputs":[{"indexed":true,"name":"sig","type":"bytes4"},{"indexed":true,"name":"guy","type":"address"},{"indexed":true,"name":"foo","type":"bytes32"},{"indexed":true,"name":"bar","type":"bytes32"},{"indexed":false,"name":"wad","type":"uint256"},{"indexed":false,"name":"fax","type":"bytes"}],"name":"LogNote","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"authority","type":"address"}],"name":"LogSetAuthority","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"}],"name":"LogSetOwner","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"}]
  • Выясняет заказ./main --abi token.abi --pkg main --type Token --out token.go

  • Мы видим каталог для созданияtoken.goдокумент. Готово.

начать передачу

  • Сначала поместите предыдущий шагtoken.goПеретащите в проект.
  • Следующее описание я написал в комментариях к коду
import (
    "github.com/ethereum/go-ethereum/accounts/abi/bind"
)

//首先导入上面生成的账户密钥(json)和密码
auth, err := bind.NewTransactor(strings.NewReader("json"), "password")
//这句用的是生成的token.go里面的方法
//client变量是我们第一步连接以太坊rpc节点的时候创建的

//contractAddress 是代币地址,比如eos 的地址是0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0
//那么我们转账针对的就是账户里的eos代币
//具体看这里 https://etherscan.io/token/0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0
token, err := NewToken(common.HexToAddress("0x86fa049857e0209aa7d9e616f7eb3b3b78ecfdb0"), client)
if err != nil {
    panic(err)
}

//每个代币都会有相应的位数,例如eos是18位,那么我们转账的时候,需要在金额后面加18个0
decimal, err := token.Decimals(nil)
if err != nil {
    panic(err)
}

//这是处理位数的代码段
tenDecimal := big.NewFloat(math.Pow(10, float64(decimal)))
convertAmount, _ := new(big.Float).Mul(tenDecimal, amount).Int(&big.Int{})

//然后就可以转账到你需要接受的账户上了
//toAddress 是接受eos的账户地址
txs, err := token.Transfer(auth, common.HexToAddress(toAddress), convertAmount)
  • Таким образом, передача завершена. Кроме того, есть много других методов в токен.О.О. Заинтересованные студенты могут учиться сами по себе.

Конец этой статьи

  • Мой адрес эфириума 0x67f883a42031215622e0b84c96d0E4DcA7A3ce81
  • Ха-ха-ха, поддержка EOS, OMG, TNT и другой валюты, пожалуйста, выпейте чашку Starbucks.
  • Конечно, ETH не откажет. Или вы можете отсканировать код, ниже QR-код моей коллекции Ethergar. Спасибо.

-w265
-w265