Python3、以太坊——如何发送ERC20 Tokens?
Python 3, Ethereum - how to send ERC20 Tokens?
我有一些脚本用于将以太币从一个地址发送到另一个地址。我正在使用奇偶校验和 Python 3.6。它使用 Flask 看起来像:
from flask import Flask, render_template, json, request
import urllib
import requests
import binascii
from decimal import *
app = Flask(__name__)
def Eth(method,params=[]):
data = {"method":method,"params":params,"id":1,"jsonrpc":"2.0"}
headers = {'Content-type': 'application/json'}
r = requests.post(ethrpc, data=json.dumps(data), headers=headers)
r = r.text
response = json.loads(r)
return(response)
hot = str("XXXXXXX")
@app.route('/')
def index():
ethnumbers = int(10)**int(18)
hot = str("XXXXX")
balance = Eth("eth_getBalance",[hot,'latest'])
balance = balance["result"]
balance = int(balance, 16)
balance = float(balance)
balance = balance / ethnumbers
balance = str(balance)
return render_template('index.html',hot = hot,balance=balance)
@app.route('/send/',methods=['POST','GET'])
def send():
getcontext().prec = 28
ethnumbers = Decimal(10)**Decimal(18)
print(ethnumbers)
if request.method == "POST":
_myaddress = request.form['_myaddress']
_youraddress = request.form['_youraddress']
_amount = request.form['_amount']
_gas = request.form['_gas']
_gas = hex(int(_gas))
passy = str("XXXXXXXXX")
getcontext().prec = 28
_amount = Decimal(_amount)
getcontext().prec = 28
_amount = _amount * ethnumbers
getcontext().prec = 28
_amount = int(_amount)
_amount = hex(_amount)
r = [{'from':_myaddress,"to":_youraddress,"value":_amount,"gas":_gas,},str("XXXXXXXXXX!")]
print(r)
json.dumps(r)
resultio = Eth("personal_sendTransaction",r)
try:
resultio["result"]
return render_template('sent.html',resultio=resultio["result"])
except: KeyError
return render_template('sent.html',resultio=resultio["error"]["message"])
else:
return render_template('index.html')
if __name__ == "__main__":
app.run()
我很确定,我必须使用 "data" 来执行此操作,但我不知道如何通过此脚本发送 ERC20 令牌。代币交易的结构看起来像 "my address -> token address -> token receiver"。
有什么想法吗?
启动一个 geth
节点并向 JSON-RPC 接口发送一个 post 请求,例如:
data = {"method": "personal_sendTransaction",
"params":[{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0", // 30400
"gasPrice": "0x9184e72a000", // 10000000000000
"value": "0x9184e72a", // 2441406250
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"}],
"id":1,
"jsonrpc":"2.0"
}
headers = {'Content-type': 'application/json'}
r = requests.post('127.0.0.1:8545', data=json.dumps(data), headers=headers)
就代币合约而言,您需要找到部署合约的地址,查看 ABI,并确定您需要哪些信息才能调用 transfer
令牌部署方法。
web3.py
绝对是正确的选择。如果你想手动做,你只想调用标准的 ERC-20 transfer
方法,from
地址应该保持不变,to
地址应该是代币合约, 然后 data
应该是以下连接在一起并格式化为十六进制的:
- "transfer(address,uint256)" 的 keccak256 散列的前 4 个字节,这是函数的签名。
- 收件人地址,左补零为 32 字节。
- 转账金额。 (一定要考虑 token 的小数点……1 个 token 通常是 10**18,但是小数位数因 token 而异,可以通过调用
decimals()
函数来检索。)这应该也被格式化为 32 字节的数字(所以左零填充)。
web3.py
会容易得多。 :-) 类似于:
web3.eth.contract(address, abi=standard_token_abi).sendTransaction({
'from': from_address
}).transfer(to_address, amount)
伙计们,它比看起来更简单。
你只需要输入:
contract address
作为接收者并制作一个长的"data"字段,它将字符串表示为:
// method name, its constans in erc20
0xa9059cbb
//receiver address (you have to do it without "0x" because its needed only when
//you have to tell "im using hexadecimal". You did it above, in method field.
//so, receiver address:
5b7b3b499fb69c40c365343cb0dc842fe8c23887
// and fill it with zeros, it have to be lenght 64. So fill rest of address
0000000000000000000000005b7b3b499fb69c40c365343cb0dc842fe8c23887
// then you need amount, please convert it to hexadecimal, delete "0x" and
// remember, you need to integer first, so if token has 18 "decimals" it need
// to be amount / 10**18 first!!
//1e27786570c272000 and fill that with zeros, like above:
000000000000000000000000000000000000000000000001e27786570c272000
//just add string, to string, to string, and you have data field:
0xa9059cbb0000000000000000000000005b7b3b499fb69c40c365343cb0dc842fe8c23887000000000000000000000000000000000000000000000001e27786570c272000
示例交易:https://etherscan.io/tx/0x9c27df8af24e06edb819a8d7a380f548fad637de5edddd6155d15087d1619964
我有一些脚本用于将以太币从一个地址发送到另一个地址。我正在使用奇偶校验和 Python 3.6。它使用 Flask 看起来像:
from flask import Flask, render_template, json, request
import urllib
import requests
import binascii
from decimal import *
app = Flask(__name__)
def Eth(method,params=[]):
data = {"method":method,"params":params,"id":1,"jsonrpc":"2.0"}
headers = {'Content-type': 'application/json'}
r = requests.post(ethrpc, data=json.dumps(data), headers=headers)
r = r.text
response = json.loads(r)
return(response)
hot = str("XXXXXXX")
@app.route('/')
def index():
ethnumbers = int(10)**int(18)
hot = str("XXXXX")
balance = Eth("eth_getBalance",[hot,'latest'])
balance = balance["result"]
balance = int(balance, 16)
balance = float(balance)
balance = balance / ethnumbers
balance = str(balance)
return render_template('index.html',hot = hot,balance=balance)
@app.route('/send/',methods=['POST','GET'])
def send():
getcontext().prec = 28
ethnumbers = Decimal(10)**Decimal(18)
print(ethnumbers)
if request.method == "POST":
_myaddress = request.form['_myaddress']
_youraddress = request.form['_youraddress']
_amount = request.form['_amount']
_gas = request.form['_gas']
_gas = hex(int(_gas))
passy = str("XXXXXXXXX")
getcontext().prec = 28
_amount = Decimal(_amount)
getcontext().prec = 28
_amount = _amount * ethnumbers
getcontext().prec = 28
_amount = int(_amount)
_amount = hex(_amount)
r = [{'from':_myaddress,"to":_youraddress,"value":_amount,"gas":_gas,},str("XXXXXXXXXX!")]
print(r)
json.dumps(r)
resultio = Eth("personal_sendTransaction",r)
try:
resultio["result"]
return render_template('sent.html',resultio=resultio["result"])
except: KeyError
return render_template('sent.html',resultio=resultio["error"]["message"])
else:
return render_template('index.html')
if __name__ == "__main__":
app.run()
我很确定,我必须使用 "data" 来执行此操作,但我不知道如何通过此脚本发送 ERC20 令牌。代币交易的结构看起来像 "my address -> token address -> token receiver"。
有什么想法吗?
启动一个 geth
节点并向 JSON-RPC 接口发送一个 post 请求,例如:
data = {"method": "personal_sendTransaction",
"params":[{
"from": "0xb60e8dd61c5d32be8058bb8eb970870f07233155",
"to": "0xd46e8dd67c5d32be8058bb8eb970870f07244567",
"gas": "0x76c0", // 30400
"gasPrice": "0x9184e72a000", // 10000000000000
"value": "0x9184e72a", // 2441406250
"data": "0xd46e8dd67c5d32be8d46e8dd67c5d32be8058bb8eb970870f072445675058bb8eb970870f072445675"}],
"id":1,
"jsonrpc":"2.0"
}
headers = {'Content-type': 'application/json'}
r = requests.post('127.0.0.1:8545', data=json.dumps(data), headers=headers)
就代币合约而言,您需要找到部署合约的地址,查看 ABI,并确定您需要哪些信息才能调用 transfer
令牌部署方法。
web3.py
绝对是正确的选择。如果你想手动做,你只想调用标准的 ERC-20 transfer
方法,from
地址应该保持不变,to
地址应该是代币合约, 然后 data
应该是以下连接在一起并格式化为十六进制的:
- "transfer(address,uint256)" 的 keccak256 散列的前 4 个字节,这是函数的签名。
- 收件人地址,左补零为 32 字节。
- 转账金额。 (一定要考虑 token 的小数点……1 个 token 通常是 10**18,但是小数位数因 token 而异,可以通过调用
decimals()
函数来检索。)这应该也被格式化为 32 字节的数字(所以左零填充)。
web3.py
会容易得多。 :-) 类似于:
web3.eth.contract(address, abi=standard_token_abi).sendTransaction({
'from': from_address
}).transfer(to_address, amount)
伙计们,它比看起来更简单。 你只需要输入:
contract address
作为接收者并制作一个长的"data"字段,它将字符串表示为:
// method name, its constans in erc20
0xa9059cbb
//receiver address (you have to do it without "0x" because its needed only when
//you have to tell "im using hexadecimal". You did it above, in method field.
//so, receiver address:
5b7b3b499fb69c40c365343cb0dc842fe8c23887
// and fill it with zeros, it have to be lenght 64. So fill rest of address
0000000000000000000000005b7b3b499fb69c40c365343cb0dc842fe8c23887
// then you need amount, please convert it to hexadecimal, delete "0x" and
// remember, you need to integer first, so if token has 18 "decimals" it need
// to be amount / 10**18 first!!
//1e27786570c272000 and fill that with zeros, like above:
000000000000000000000000000000000000000000000001e27786570c272000
//just add string, to string, to string, and you have data field:
0xa9059cbb0000000000000000000000005b7b3b499fb69c40c365343cb0dc842fe8c23887000000000000000000000000000000000000000000000001e27786570c272000
示例交易:https://etherscan.io/tx/0x9c27df8af24e06edb819a8d7a380f548fad637de5edddd6155d15087d1619964