web3-无ABI合约交互

格式

InputData = 0x 60fe47b1 0000000000000000000000000000000000000000000000000000000000000001 0000000000000000000000000000000000000000000000000000000000000002

InputData = 0x + 4字节函数选择器 + 各32字节Data

encode 函数选择器

bytes4(sha3(“set(uint256)”)) == 0x60fe47b1
def getFuncHex(funcData):
    k = sha3.keccak_256()
    k.update(funcData.encode('utf-8'))
    return k.hexdigest()[:8]

encode Data

  • 参数转16进制 [address不用转]

 web3.toHex(value)     
  • 前面补0,填充满64位\32字节(bytes32) [string除外]

// python
def to_64(hex):
    zero = ''
    hex = hex[2:]   //去除hex的0x
    zcount = 64-len(hex)
    for i in range(zcount):
        zero += '0'
    return zero+hex
  • 每个参数拼接到一起

实例:

def encodeInputData(funcName,inputArr):
    funcName = ''
    for item in inputArr:
      ---- funcData各种拼接-----

    // funcData拼接后 = 'ChangeNum(uint256,address)'
    funcHex = getFuncHex(funcData)

def getFuncHex(funcData):
    k = sha3.keccak_256()
    k.update(funcData.encode('utf-8'))
    return k.hexdigest()[:8]
funcName = 'testEasyInput'
inputArr = [    {'type':'uint256','value':11},    # {'type':'string','value':'grewgrewgreggreggregreqweeeeeeee'},    # {'type':'address','value':myAddress},    {'type':'uint256','value':22},]

encodeInputData(funcName,inputArr)