enigma-core
and enigma-p2p
communicate via zeromq
architechture.
The communication is done with REQ
and REP
sockets.
enigma-p2p
is the REQ
(requester) and enigma-core
is the REP
(responder).
Request:
{
id : <unique_request_id>,
type : GetRegistrationParams
}
Response:
{
id : <unique_request_id>,
type : GetRegistrationParams,
result : {
signingKey : hex,
report: hex,
signature: hex,
}
}
Request:
{
id : <unique_request_id>,
type : GetTip,
input : [Secret Contract Address]
}
Response:
{
id : <unique_request_id>,
type : GetTip,
result : {
key : [],
data : []
}
}
Request:
{
id : <unique_request_id>,
type : GetTips,
input : [Array<Secret Contract Address>]
}
Response:
{
id : <unique_request_id>,
type : GetTips,
result : {
tips : [Array<{address,key,data}>]
}
}
Request:
{
id : <unique_request_id>,
type : GetAllTips
}
Response:
{
id : <unique_request_id>,
type: GetAllTips,
result : {
tips : [Array<{address,key,data}>]
}
}
Request:
{
id : <unique_request_id>,
type : GetAllAddrs
}
Response:
{
id : <unique_request_id>,
type : GetAllAddrs,
result : {
addresses : [Array<Secret contract Addrs>]
}
}
Request:
{
id : <unique_request_id>,
type : GetDelta,
input : [{address, key}]
}
Response:
{
id : <unique_request_id>,
type : GetDelta,
result : {
delta : []
}
}
Request:
{
id : <unique_request_id>,
type : GetDeltas,
input : [{address, from:key, to:key}, ...]
}
Response:
{
id : <unique_request_id>,
type : GetDeltas,
result : {
deltas : [{address, key, data},...]
}
}
Request:
{
id : <unique_request_id>,
type : GetContract,
input : address
}
Response:
{
id : <unique_request_id>,
type : GetContract,
result : {
address: ...,
bytecode : []
}
}
Request:
{
id : <unique_request_id>,
type : UpdateNewContract,
address : ...,
bytecode : [Secret Contract Address]
}
Response:
{
id : <unique_request_id>,
type : UpdateNewContract,
address : ...,
result : {
status : 0 or err code
}
}
Request:
{
id : <unique_request_id>,
type : UpdateNewContractOnDeployment,
address : ...,
bytecode : 'the-bytecode'
delta : [key, data : []]
}
Response:
{
id : <unique_request_id>,
type : UpdateNewContractOnDeployment,
address : ...,
result : {
status : 0 or err code
}
}
Request:
{
id : <unique_request_id>,
type : RemoveContract,
address : ...,
}
Response:
{
id : <unique_request_id>,
type : RemoveContract,
address : ...,
result : {
status : 0 or err code
}
}
Request:
{
id : <unique_request_id>,
type : UpdateDeltas,
deltas : [{address, key, data : []}, ...]
}
Response:
{
id : <unique_request_id>,
type : UpdateDeltas,
result : {
status: 0 or err code,
errors: [{address, key, status : }, ...]
}
}
Request:
{
id : <unique_request_id>,
type : RemoveDeltas,
input : [{address, from:key, to:key}, ...]
}
Response:
{
id : <unique_request_id>,
type : RemoveDeltas,
result : {
status: 0 or err code,
errors: [{address, key, status : }, ...]
}
}
Request:
{
id: <unique_request_id>,
type: GetPTTRequest
}
Response:
{
id : <unique_request_id>,
type : GetPTTRequest,
result: {
request: 'the-message-packed-request',
workerSig: 'the-worker-sig'
}
}
The request is a signed messagepack that looks like this:
{
prefix: b"Enigma Message",
pubkey: 'DH pubkey',
id: '12-bytes-msgID',
}
Request:
{
id : <unique_request_id>,
type : PTTResponse,
input: {
response: 'the-encrypted-response'
}
}
The response is a signed messagepack that looks like this:
{
prefix: b"Enigma Message",
data: enc([(address, stateKey)]),
pubkey: 'DH pubkey',
id: '12-bytes-msgID',
}
Response:
{
id : <unique_request_id>,
type : GetPTTRequest,
result: {
errors: [{address, status}]
}
}
The result of the rpc call GetWorkerEncryptionKey
.
Request:
{
id : <unique_request_id>,
type : NewTaskEncryptionKey,
userPubKey: 'the-user-dh-pubkey'
}
Response:
{
id: <unique_request_id>,
type: NewTaskEncryptionKey,
result : {
workerEncryptionKey : 'some-encryption-key',
workerSig : 'sign(response params)'
}
}
Request:
{
id: <unique_request_id>,
type: DeploySecretContract,
input: {
preCode: 'the-bytecode',
encryptedArgs: 'hex of the encrypted args',
encryptedFn: 'hex of the encrypted function signature',
userDHKey: 'the-user-dh-pubkey',
gasLimit: 'the-user-selected-gaslimit',
contractAddress: 'the-address-of-the-contract'
}
}
Response:
{
id: <unique_request_id>,
type: DeploySecretContract,
result : {
output: 'the-deployed-bytecode', // AKA exeCode
preCodeHash: 'hash-of-the-precode-bytecode',
delta: {key: 0, data: ...},
usedGas: 'amount-of-gas-used',
ethereumPayload: 'hex of payload for a call to the ethereum contract'',
ethereumAddress: 'address of the ethereum contract to call',
signature: 'enclave-signature',
}
}
Request:
{
id: <unique_request_id>,
type: ComputeTask,
input: {
encryptedArgs: 'hex of the encrypted args',
encryptedFn: 'hex of the encrypted function signature',
userDHKey: 'the-user-dh-pubkey',
gasLimit: 'the-user-selected-gaslimit', // from ethereum not rpc
contractAddress: 'the-address-of-the-contract'
}
}
Response:
{
id: <unique_request_id>,
type: ComputeTask,
result : {
output: 'the-output-of-the-execution', // or '' in case of no output
delta: {key, data}, // key == 0 and no data in case of no state change
usedGas: 'amount-of-gas-used',
ethereumPayload: 'hex of payload for a call to the ethereum contract'',
ethereumAddress: 'address of the ethereum contract to call',
signature: 'enclave-signature',
}
}
If a ComputeTask
or DeployTask
fails on the protocol level this message will be returned.
{
id: <unique_request_id>,
type: FailedTask,
result : {
output: 'the-output-of-the-execution',
usedGas: 'amount-of-gas-used',
signature: 'enclave-signature',
}
}
Any Code error:
{
id: <unique_request_id>,
type: <the_request_type>,
msg : "some error message",
}