我想知道如何在Python中实现瘦CREATE2或提供它的包。
这是我试图从TypeScript移植到Python的函数。它用特定的盐(32大小)调用generateAddress2
:
export function getUserIdentity(walletAddr) {
const bytecode = getBytecode(walletAddr)
const addr = getAddress(
`0x${generateAddress2(ADDR_FACTORY, Buffer.alloc(32), bytecode).toString(
"hex"
)}`
)
return { bytecode, addr }
}
这是ethereumjs generateAddress2
实现:
/**
* Generates an address for a contract created using CREATE2.
* @param from The address which is creating this new address
* @param salt A salt
* @param initCode The init code of the contract being created
*/
export const generateAddress2 = function(from: Buffer, salt: Buffer, initCode: Buffer): Buffer {
assertIsBuffer(from)
assertIsBuffer(salt)
assertIsBuffer(initCode)
assert(from.length === 20)
assert(salt.length === 32)
const address = keccak256(
Buffer.concat([Buffer.from('ff', 'hex'), from, salt, keccak256(initCode)]),
)
return address.slice(-20)
}
非常感谢!
发布于 2020-12-08 09:34:53
排序,以防万一对任何人都有帮助:
@pytest.mark.parametrize('address, salt, init_code, expected_address', [
(
'0x0000000000000000000000000000000000000000',
'0x0000000000000000000000000000000000000000000000000000000000000000',
'0x00',
'0x4D1A2e2bB4F88F0250f26Ffff098B0b30B26BF38',
),
(
'0xdeadbeef00000000000000000000000000000000',
'0x0000000000000000000000000000000000000000000000000000000000000000',
'0x00',
'0xB928f69Bb1D91Cd65274e3c79d8986362984fDA3',
),
(
'0xdeadbeef00000000000000000000000000000000',
'0x000000000000000000000000feed000000000000000000000000000000000000',
'0x00',
'0xD04116cDd17beBE565EB2422F2497E06cC1C9833',
),
(
'0x0000000000000000000000000000000000000000',
'0x0000000000000000000000000000000000000000000000000000000000000000',
'0xdeadbeef',
'0x70f2b2914A2a4b783FaEFb75f459A580616Fcb5e',
),
(
'0x00000000000000000000000000000000deadbeef',
'0x00000000000000000000000000000000000000000000000000000000cafebabe',
'0xdeadbeef',
'0x60f3f640a8508fC6a86d45DF051962668E1e8AC7',
),
(
'0x00000000000000000000000000000000deadbeef',
'0x00000000000000000000000000000000000000000000000000000000cafebabe',
'0xdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeefdeadbeef',
'0x1d8bfDC5D46DC4f61D6b6115972536eBE6A8854C',
),
(
'0x0000000000000000000000000000000000000000',
'0x0000000000000000000000000000000000000000000000000000000000000000',
'0x',
'0xE33C0C7F7df4809055C3ebA6c09CFe4BaF1BD9e0',
),
])
def test_create2(address, salt, init_code, expected_address):
"""Test the CREATE2 opcode Python implementation.
EIP-104
https://github.com/ethereum/EIPs/blob/master/EIPS/eip-1014.md
"""
from eth_utils import to_checksum_address
from web3 import Web3
pre = '0xff'
b_pre = bytes.fromhex(pre[2:])
b_address = bytes.fromhex(address[2:])
b_salt = bytes.fromhex(salt[2:])
b_init_code = bytes.fromhex(init_code[2:])
keccak_b_init_code = Web3.keccak(b_init_code)
b_result = Web3.keccak(b_pre + b_address + b_salt + keccak_b_init_code)
result_address = to_checksum_address(b_result[12:].hex())
assert result_address == expected_address
https://ethereum.stackexchange.com/questions/90895
复制相似问题