Имея простую структуру контракта, подобную этой:
pragma solidity ^ 0.4 . 8 ; contract A {
uint public a1 ;
} contract B is A { uint8 public b1 ;
}
Я могу скомпилировать это с:
> solc -- combined - json "abi,bin" inheritance . sol > ./ out / test_output . json
Чтобы получить следующее:
{
"contracts" : {
"A" : {
"abi" : "[{\"constant\":true,\"inputs\":[],\"name\":\"a1\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"}]" ,
"bin" : "6060604052346000575b608e806100176000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063119552a114603c575b6000565b346000576046605c565b6040518082815260200191505060405180910390f35b600054815600a165627a7a723058205a60899c35d4ed35d09808494352b2a1170b28969925c2aa7e86a45128a569c60029"
},
"B" : {
"abi" : "[{\"constant\":true,\"inputs\":[],\"name\":\"a1\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"b1\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"}]" ,
"bin" : "606060405234610000575b60d1806100186000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063119552a1146046578063ee495002146066575b6000565b346000576050608c565b6040518082815260200191505060405180910390f35b3460005760706092565b604051808260ff1660ff16815260200191505060405180910390f35b60005481565b600160009054906101000a900460ff16815600a165627a7a72305820c2b3dacd4eb8217e675d9a1ab699d05e0e267d2f98d09a8a81a0b1251e8adfbe0029"
}
},
"version" : "0.4.8+commit.60cc1668.Darwin.appleclang"
}
При добавлении конструктора в контракт A
я получаю пустую секцию bin для B
Исходный код:
pragma solidity ^ 0.4 . 8 ; contract A {
uint public a1 ;
function A ( address _a ) {
}
} contract B is A { uint8 public b1 ;
}
Результирующий JSON:
{
"contracts" : {
"A" : {
"abi" : "[{\"constant\":true,\"inputs\":[],\"name\":\"a1\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"inputs\":[{\"name\":\"_a\",\"type\":\"address\"}],\"payable\":false,\"type\":\"constructor\"}]" ,
"bin" : "6060604052346000576040516020806100c4833981016040528080519060200190919050505b5b505b608e806100366000396000f30060606040526000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063119552a114603c575b6000565b346000576046605c565b6040518082815260200191505060405180910390f35b600054815600a165627a7a72305820b498791e10bedac88be35dd16a0733002f88d24b34bb81fd03d029cda7db4fa00029"
},
"B" : {
"abi" : "[{\"constant\":true,\"inputs\":[],\"name\":\"a1\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"b1\",\"outputs\":[{\"name\":\"\",\"type\":\"uint8\"}],\"payable\":false,\"type\":\"function\"}]" ,
"bin" : ""
}
},
"version" : "0.4.8+commit.60cc1668.Darwin.appleclang"
}
Беспараметрический конструктор в A
не мешает секции bin
в B
Вы не можете построить A
если не дадите ему параметр. Это даст вам двоичный файл для B:
контракт А { Uint Public A1; функция A (адрес _a) { } } контракт B является A { uint8 public b1; функция B (адрес _a) A (_a) { } }
Это тоже:
контракт А { Uint Public A1; функция A (адрес _a) { } } контракт B является A { uint8 public b1; функция B () A (0x0011223344556677889900112233445566778899) { } }
Конор Свенссон