主页 > imtoken钱包华为安装不了 > 以太坊地址格式 Windows下使用web3
以太坊地址格式 Windows下使用web3
1.账号解锁
这是一个==“不安全”==的方法,目前应该很少用到,但是刚开始学习的时候每次发送修改区块链数据的交易都需要解锁账户(ps:如果只调用查询智能合约中数据的功能,无需解锁)。
1个
2个
3个
4个
5个
6个
7
8个
9
10
11
12
13
14
15
16
17
18
从 web3 导入 Web3
类 eth_handler():
def __init__(自我):
self.web3 = Web3(Web3.WebsocketProvider("ws://127.0.0.1:8546"))
# 检查连接是否成功
如果自己。 网络3。 已连接():
print("连接成功!")
# 先看链上账户
帐户=自我。 网络3。 伦理。 帐户
打印(帐户)
# 随机解锁一个账号以太坊地址格式,看返回值
res = self.web3.geth.personal.unlockAccount(账户[0],"123")
打印(分辨率)
如果 __name__ == '__main__':
eth = eth_handler()
由于每次调用智能合约函数,一旦函数修改了链上数据,就需要解锁账户。 这里使用web3.py调用unlock有个坑:启动geth客户端的命令中必须显式调用个人api,即:
由于使用websocket方式连接以太坊客户端,所以需要在wsapi中开启personal,否则无法在web3.py中调用unlock。
由于unlockAccount的不安全性,以太坊官方推荐使用“离线签名”方式发送交易
2.离线签名
使用 web3.py 实现离线签名在 web3.py 开发文档的__“Working with Local Private Keys”__中有示例代码。
参考开发文档中的示例代码,自我实现的部分代码如下:
1个
2个
3个
4个
5个
6个
7
8个
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
二十四
25
26
27
28
29
30
"""检查传入地址是否正确,如果不正确,将其转换为正确的地址并返回"""
def CheckAddress(自我,_地址):
如果 self.web3.isChecksumAddress(_address):
退货地址
别的:
回归自我。 网络3。 toChecksumAddress(_address)
def GetNounce(自我,_地址):
'''
返回地址的交易数量
:参数地址:
:返回:
'''
返回 self.web3.eth.getTransactionCount(
自己。 检查地址(_地址)
)
def My_Transaction(_myaddress,_privatekey):
随机数 = 自我。 GetNounce(_myaddress)
txn_dict = self.myContract.functions.SmartContractFunc(params).buildTransaction({
'chainId':9,
'气体':3000000,
'gasPrice':自我。 网络3。 toWei('1', 'gwei'),
'随机数':随机数,
})
signed_txn = self.web3.eth.account.signTransaction(txn_dict,private_key=_privatekey)
txhash = self.web3.eth.sendRawTransaction(signed_txn.rawTransaction)
# 其实一直执行到txhash=...这一步已经将交易发送到区块链
# 为了保证交易打包成功,需要等待
receipt = self.web3.waitForTransactionReceipt(self.web3.toHex(txhash))
补充:
chainId是在区块链初始化的时候在genesis文件中设置的,需要保持一致。 (看看我的第一篇笔记)
privatekey是需要从keystore密钥文件中提取出来的私钥。 (看看我的第二个笔记)
在以太坊Dapp完成之初,由于以太坊geth客户端启动时没有调用个人api,导致代码中无法使用unlockAccount,只能在geth客户端每次解锁unlockAccount智能合约函数被调用。 这很麻烦。 想了想,这个技术不能这么麻烦,然后就找到了离线签名发送交易。 可能是太笨了,希望大家在第一次接触的时候使用线下签名交易。 少走弯路以太坊地址格式,节省一些时间做其他事情!
1个
半日闲偷浮生,酒钱采桃花!