因为整个区块链系统是点对点的对等网络,没有统一的中心机构协调各个节点的行为,所以在生成区块时,各个节点的行为都是相互独立的,很有可能同时由多个矿工在同一区块高度生成出2个以上的区块来。这些区块打包的交易很可能是不一样的,同时满足条件的数字n不是唯一的,多个矿工之间生成的数字n是不一样的,但是同样是满足不等式的。在这种情况下,网络中的其他节点很可能同步到不同的区块数据,并且这些数据在数学上都是合法的、有效的。当不同的节点中的不同的区块作为当前最新区块时,就会存在分叉的情况,即不同的矿机对同一高度的区块生产了内存不一样的新区快,并且这些矿工都找到了满足不等式的数字n。
def transfer_eth(target_address,amount,gas_price=5,gas_limit=21000):
nonce=web3.eth.getTransactionCount(address)
params={
'nonce':nonce,
'to':target_address,
'value':web3.toWei(amount,'ether'),
'gas':gas_limit,
'gasPrice':web3.toWei(gas_price,'gwei'),
'from':address,
}
signed_tx=web3.eth.account.signTransaction(params,private_key=private_key)
tx_hash=web3.eth.sendRawTransaction(signed_tx.rawTransaction)
return tx_hash
def transfer_token(token_contract,target_address,amount,gas_price=5,gas_limit=500000):
params={
"from":address,
"value":0,
'gasPrice':web3.toWei(gas_price,'gwei'),
"gas":gas_limit,
"nonce":web3.eth.getTransactionCount(address),
}
func=token_contract.functions.transfer(target_address,web3.toWei(amount,"ether"))
tx=func.buildTransaction(params)
signed_tx=web3.eth.account.sign_transaction(tx,private_key=private_key)
tx_hash=web3.eth.sendRawTransaction(signed_tx.rawTransaction)
return tx_hash