0%

Crypto-批量创建钱包和转账

Pre:

需求:

  1. 创建40个bsc新钱包

  2. 由1个主钱包把某代币平均分发到40个新钱包中去


脚本:

创建钱包:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from web3 import Web3, HTTPProvider
from web3.middleware import geth_poa_middleware


def create_wallet():
bscUrl = ""
web3 = Web3(HTTPProvider(bscUrl))
web3.middleware_stack.inject(geth_poa_middleware, layer=0)

password = ""
bscAccount = web3.eth.account.create(password)

bscAddress = bscAccount.address
privateKey = bscAccount.privateKey.hex()

这一步遇到的问题主要是,web3js的文档和web3py的有些差异,使用上需要注意。

转账代币:

这一步也很简单,调用代币合约里的transfer函数即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
contract_address = ''  # 代币地址
contract = web3.eth.contract(address=contract_address, abi=abi)

# 转账数量
amount_ether = web3.toWei(amount, 'ether')
logger.debug("[*] send amount: {}".format(amount))

nonce = web3.eth.getTransactionCount(main_address)

# 构建交易对象
token_tx = contract.functions.transfer(to_addr, amount_ether).buildTransaction({
'chainId': 56, 'gas': 200000, 'gasPrice': web3.toWei("5", 'gwei'), 'nonce': nonce
})
# 私钥签名,然后发送交易

代币合约:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/**
* @title ERC20 interface
* @dev see https://github.com/ethereum/EIPs/issues/20
*/
interface IERC20 {
function totalSupply() external view returns (uint256);

function balanceOf(address who) external view returns (uint256);

function allowance(address owner, address spender)
external view returns (uint256);

function transfer(address to, uint256 value) external returns (bool);

function approve(address spender, uint256 value)
external returns (bool);

function transferFrom(address from, address to, uint256 value)
external returns (bool);

event Transfer(
address indexed from,
address indexed to,
uint256 value
);

event Approval(
address indexed owner,
address indexed spender,
uint256 value
);
}
1
2
contract ERC20 is IERC20 { ...
}

看一下代币合约的solidity代码,可知大部分代币都是符合erc20标准的,都有几个基础函数.

  • totalSupply():总供应量

  • balanceOf():余额

  • allowance():授权的代币数量

  • transfer():转账

  • approve():批准花费代币

  • transferFrom():转账


ERC20:

什么是Token(代币)?

在Ethereum中,代币几乎可以代表任何东西,从在线平台的信誉点、游戏中角色的技能、彩票到金融资产债券,再到真正的商品,如公司的股份、货币、金盎司等!如此强大的功能,值得也必须处理好。如此强大的功能,理应也必须由一个强大的标准来处理,对吗?这正是ERC-20的作用所在,ERC-20就是针对这些发布的Token(代币)制定的一个固定的基础的标准原则。


什么是 ERC20:

ERC-20引入了可替代Token的标准。换句话说,它们具有使每个Token与另一个Token完全相同(在类型和价值上)的属性。例如,ERC-20,Token的行为与ETH相同,这意味着任意1个遵循ERC-20规则的Token与所有其他所有Token是平等和相同的。

简单地说,任何ERC-20代币都能立即兼容以太坊钱包(几乎所有支持以太币的钱包,包括Jaxx、MEW、imToken等,也支持 erc-20的代币)

由于交易所已经知道这些代币是如何操作的,它们可以很容易地整合这些代币。这就意味着,在很多情况下,这些代币都是可以立即进行交易的。

标准化非常有利,也就意味着这些资产可以用于不同的平台和项目,否则只能用在特定的场合。

代币(Token)是区块链中定义价值的方式,用于标定金融或数字资产。

在以太坊上,代币使用相同的标准,这样代币之间的兑换和DAPP支持就会变得容易


标准规定了哪些内容:

ERC20 是各个代币的标准接口。

ERC20 代币仅仅是以太坊代币的子集。为了充分兼容 ERC20,开发者需要将一组特定的函数(接口)集成到他们的智能合约中,以便在高层面能够执行以下操作:

  • 获得代币总供应量

  • 获得账户余额

  • 转让代币

  • 批准花费代币

ERC20 让以太坊区块链上的其他智能合约和去中心化应用之间无缝交互。


ERC20 标准:

ERC20 标准定义了一个兼容协议, 需要实现的函数. 具体如下.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
// ----------------------------------------------------------------------------
// ERC Token Standard #20 Interface
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {
function totalSupply() public constant returns (uint);
function balanceOf(address tokenOwner) public constant returns (uint balance);
function allowance(address tokenOwner, address spender) public constant returns (uint remaining);
function transfer(address to, uint tokens) public returns (bool success);
function approve(address spender, uint tokens) public returns (bool success);
function transferFrom(address from, address to, uint tokens) public returns (bool success);
event Transfer(address indexed from, address indexed to, uint tokens);
event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

同时规定了三个必须定义的变量,分别是

  • 合约名称

  • 合约代号

  • 合约进制

1
2
3
string public constant name = "Token Name";
string public constant symbol = "SYM";
uint8 public constant decimals = 18; // 18 is the most common number of decimal places

Summary:

cool,脚本是挺简单的,顺便了解了一下erc20的代币标准


refs: