Contract code verification
This commit is contained in:
parent
b90ac50ec9
commit
9cd85e6541
|
@ -34,7 +34,11 @@
|
||||||
"Owned": {"deploy": false},
|
"Owned": {"deploy": false},
|
||||||
"IdentityGasRelay": {"gasLimit": 4000000},
|
"IdentityGasRelay": {"gasLimit": 4000000},
|
||||||
"IdentityKernel": {"deploy": false},
|
"IdentityKernel": {"deploy": false},
|
||||||
"IdentityFactory": {"args":["0x00"], "gasLimit": 4000000},
|
"IdentityFactory": {
|
||||||
|
"args":["0x00"],
|
||||||
|
"gasLimit": 5000000,
|
||||||
|
"onDeploy": ["IdentityFactory.methods.setKernel('$IdentityGasRelay').send({gasLimit: 1000000})"]
|
||||||
|
},
|
||||||
"SNTController": {"deploy": false},
|
"SNTController": {"deploy": false},
|
||||||
"UpdatedIdentityKernel": {"deploy": false},
|
"UpdatedIdentityKernel": {"deploy": false},
|
||||||
"TestContract": {"deploy": false}
|
"TestContract": {"deploy": false}
|
||||||
|
|
|
@ -13,7 +13,8 @@ contract Factory is Controlled {
|
||||||
bytes32 codeHash;
|
bytes32 codeHash;
|
||||||
}
|
}
|
||||||
|
|
||||||
mapping (address => uint256) versionMap;
|
mapping(bytes32 => uint256) hashToVersion;
|
||||||
|
mapping(address => uint256) versionMap;
|
||||||
|
|
||||||
Version[] versionLog;
|
Version[] versionLog;
|
||||||
uint256 latestUpdate;
|
uint256 latestUpdate;
|
||||||
|
@ -50,6 +51,10 @@ contract Factory is Controlled {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function isKernel(bytes32 _codeHash) public returns (bool){
|
||||||
|
return hashToVersion[_codeHash] > 0;
|
||||||
|
}
|
||||||
|
|
||||||
function isKernel(address _addr) public returns (bool){
|
function isKernel(address _addr) public returns (bool){
|
||||||
return versionMap[_addr] > 0;
|
return versionMap[_addr] > 0;
|
||||||
}
|
}
|
||||||
|
@ -86,6 +91,7 @@ contract Factory is Controlled {
|
||||||
require(_kernel != latestKernel);
|
require(_kernel != latestKernel);
|
||||||
bytes32 _codeHash = getCodeHash(_kernel);
|
bytes32 _codeHash = getCodeHash(_kernel);
|
||||||
versionMap[_kernel] = versionLog.length;
|
versionMap[_kernel] = versionLog.length;
|
||||||
|
hashToVersion[_codeHash] = versionLog.length;
|
||||||
versionLog.push(Version({blockNumber: block.number, timestamp: block.timestamp, kernel: _kernel, codeHash: _codeHash}));
|
versionLog.push(Version({blockNumber: block.number, timestamp: block.timestamp, kernel: _kernel, codeHash: _codeHash}));
|
||||||
latestUpdate = block.timestamp;
|
latestUpdate = block.timestamp;
|
||||||
latestKernel = _kernel;
|
latestKernel = _kernel;
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
"name": "Ethereum",
|
"name": "Ethereum",
|
||||||
"symbol": "ETH"
|
"symbol": "ETH"
|
||||||
},
|
},
|
||||||
"0xf8a85AfA502a0A27aAA3528C62eB059Db97a6007": {
|
"0xD10e6dAe987Dcc0B3ADaA375C9f59690a4C97a27": {
|
||||||
"minRelayFactor": 10000,
|
"minRelayFactor": 10000,
|
||||||
"name": "Random Test Token",
|
"name": "Random Test Token",
|
||||||
"symbol": "RDN",
|
"symbol": "RDN",
|
||||||
|
@ -37,8 +37,8 @@
|
||||||
"IdentityGasRelay": {
|
"IdentityGasRelay": {
|
||||||
"abiFile": "../abi/IdentityGasRelay.json",
|
"abiFile": "../abi/IdentityGasRelay.json",
|
||||||
"isIdentity": true,
|
"isIdentity": true,
|
||||||
"factoryAddress": "0xdd8b8aCf484875dC6565F6B614B8Dc9C7f074C00",
|
"factoryAddress": "0x5F6cDe612C45039AaC867075703Bc118cEA4D531",
|
||||||
"kernelVerification": "isKernel(address _addr)",
|
"kernelVerification": "isKernel(bytes32)",
|
||||||
"allowedFunctions": [
|
"allowedFunctions": [
|
||||||
{
|
{
|
||||||
"function": "approveAndCallGasRelayed(address,address,uint256,bytes,uint256,uint256,uint256,address,bytes)",
|
"function": "approveAndCallGasRelayed(address,address,uint256,bytes,uint256,uint256,uint256,address,bytes)",
|
||||||
|
|
|
@ -1,5 +1,3 @@
|
||||||
const md5 = require('md5');
|
|
||||||
|
|
||||||
class ContractSettings {
|
class ContractSettings {
|
||||||
|
|
||||||
constructor(config, web3, eventEmitter){
|
constructor(config, web3, eventEmitter){
|
||||||
|
@ -45,7 +43,7 @@ class ContractSettings {
|
||||||
this.pendingToLoad++;
|
this.pendingToLoad++;
|
||||||
this.web3.eth.getCode(this.contracts[topicName].address)
|
this.web3.eth.getCode(this.contracts[topicName].address)
|
||||||
.then(code => {
|
.then(code => {
|
||||||
this.contracts[topicName].code = md5(code);
|
this.contracts[topicName].code = this.web3.utils.soliditySha3(code);
|
||||||
this.pendingToLoad--;
|
this.pendingToLoad--;
|
||||||
if(this.pendingToLoad == 0) this.events.emit("setup:complete", this);
|
if(this.pendingToLoad == 0) this.events.emit("setup:complete", this);
|
||||||
})
|
})
|
||||||
|
|
|
@ -46,7 +46,7 @@ class MessageProcessor {
|
||||||
|
|
||||||
// Get code from address and compare it against the contract code
|
// Get code from address and compare it against the contract code
|
||||||
if(!contract.isIdentity){
|
if(!contract.isIdentity){
|
||||||
const code = md5(await this.web3.eth.getCode(input.address));
|
const code = this.web3.utils.soliditySha3(await this.web3.eth.getCode(input.address));
|
||||||
if(code != contract.code){
|
if(code != contract.code){
|
||||||
this._reply('Invalid contract code', message);
|
this._reply('Invalid contract code', message);
|
||||||
return false;
|
return false;
|
||||||
|
@ -57,11 +57,14 @@ class MessageProcessor {
|
||||||
|
|
||||||
async _validateInstance(message, input){
|
async _validateInstance(message, input){
|
||||||
const contract = this.settings.getContractByTopic(message.topic);
|
const contract = this.settings.getContractByTopic(message.topic);
|
||||||
const kernelVerifSignature = this.web3.utils.sha3(contract.kernelVerification).slice(0, 10);
|
const instanceCodeHash = this.web3.utils.soliditySha3(await this.web3.eth.getCode(input.address));
|
||||||
|
const kernelVerifSignature = this.web3.utils.soliditySha3(contract.kernelVerification).slice(0, 10);
|
||||||
|
|
||||||
return await this.web3.eth.call({
|
let verificationResult = await this.web3.eth.call({
|
||||||
to: contract.factoryAddress,
|
to: contract.factoryAddress,
|
||||||
data: kernelVerifSignature + "000000000000000000000000" + input.address.slice(2)});
|
data: kernelVerifSignature + instanceCodeHash.slice(2)});
|
||||||
|
|
||||||
|
return web3.eth.abi.decodeParameter('bool', verificationResult);;
|
||||||
}
|
}
|
||||||
|
|
||||||
_extractInput(message){
|
_extractInput(message){
|
||||||
|
|
Loading…
Reference in New Issue