Offshift Pilot Client-Side Guide

thumbnail for this post

The following documentation serves as a guide for interacting with the Offshift Pilot from the client side.

How to Launch and Interact With Offshift v1 from the Client Side

The docker image of the project is available on DockerHub here.

To start working with the docker image it is necessary to perform the following steps:

1. Install Docker:

2. Download the image

The following command can be used to download the docker image:

docker pull offshiftxft/offshift:v1

Commands for working with the docker image:

docker images

shows a list of all uploaded images

docker ps

displays a list of running docker containers

docker run -p 10000:10000 offshiftxft/offshift:v1

run Offshift docker container

docker stop 0dc3dd70ee34

stop docker container with the following ID: “0dc3dd70ee34”

docker ps -a

list of all available docker containers

docker start 0dc3dd70ee34

command to restart the container with the following ID: “0dc3dd70ee34”


After launching the Offshift container, you can interact with it through the address bar of the browser or in the command line of the terminal.

To import the input parameters from the external file, you need to:

1. Create a text file with the inputs for the needed command. For example, for command /calculateR the file should be named calculateR.json

2. Save in a text file the input parameters in JSON structure format. For example, for /calculateR:

{
    "riSet":[
        {
        "X": 32138742690242662502241199693237900335204239496008641016955400178363039706333,
        "Y": 98206281677669063585309234705818540728303839018966295776521001268753556134537
    },
    {
        "X": 72664875838982340636391200513545812992442341844955961733021880193736610927495,
        "Y": 72911874978211977551112918690838955657286613708826885971426767283825381825555
    }
    ]
}

3. Using the terminal, go to the folder where the file “calculateR.json” is placed.

4. To run the functions that the client side supports use the command:

curl -i -X POST -H "Content-Type: application/json" -d "@calculateR.json" localhost:10000/calculateR

Commands for launching the functions:

curl -i -X POST -H "Content-Type: application/json" -d "@calculateR.json" localhost:10000/calculateR
curl -i -X POST -H "Content-Type: application/json" -d "@aggregatedPubKey.json" localhost:10000/aggregatedPubKey
curl -i -X POST -H "Content-Type: application/json" -d "@deposit.json" localhost:10000/deposit
curl -i -X POST -H "Content-Type: application/json" -d "@calculateR.json" localhost:10000/calculateR

Available functions

1. Generation of public and private keys

GET request

localhost:10000/keys

Input structure:

{
    "PublicKey": {
        "X": 42819040757234794584093116854165396038282133597267920781144937243512001014926,
        "Y": 16613036104697039678886172991403554573723255145849724300409746814594793225130
    },
    "PrivateKey": "54157417345273714740058805884274764565572769750057293434269112943657356706138"
}
2. Schnorr signature (for 1 user)

POST request

localhost:10000/singleSig

Input structure:

{
    "Message":"message",
    "PubKey": {
        "X": 42819040757234794584093116854165396038282133597267920781144937243512001014926,
        "Y": 16613036104697039678886172991403554573723255145849724300409746814594793225130
    },
    "PrivateKey":54157417345273714740058805884274764565572769750057293434269112943657356706138
}

where:

“Message” - message for signing

“PubKey” - public key

“PrivateKey” - private key

Input structure:

{
    "R": {
        "X": 26619072936970554793633308674556768341722133251180443441300007231460603320286,
        "Y": 17797583446333289396642296322720088426699648732141596014797534923278170021222
    },
    "S": "39273007503788457903883229402146682860498221642303828769312405490858972955250"
}
3. Schnorr signature (MuSig)

1) Keys aggregation

POST request

localhost:10000/aggregatedPubKey

Input structure:

{
    "publicKeySet":[
        {
        "X": 42819040757234794584093116854165396038282133597267920781144937243512001014926,
        "Y": 16613036104697039678886172991403554573723255145849724300409746814594793225130
    },
    {
        "X": 30321070545248488399817466362260044602937803709853919585846660296849009833522,
        "Y": 584349551486137423528370505680565301008648566037903166922050018102495266109
    }
    ]
}

where:

“publicKeySet” - array of public keys

Output

{
    "L": "10044379105078759254068858172401465623303715744628901774287844183625279572755",
    "aggregatedPublicKey": {
        "X": 47888315361302638903367170609134468073239076049676029663996381866167888048452,
        "Y": 33200710740928124072887427442985608165696834167521834699664649186021155932435
    }
}

2) Generation of new R pair for each participant

GET request

localhost:10000/singleRPair

Input structure:

{
    "R": {
        "X": 17529266385671245595536407394531335745706339870644603504895059274074937732906,
        "Y": 102540959697668743130910375595945245890854860109723215999926370604784619961945
    },
    "Valr": 54360372087333951267848278312006320762551551356108342357325534895569593873995
}

3) Generation of common R

POST request

localhost:10000/calculateR

Input structure:

{
    "riSet":[
        {
        "X": 32138742690242662502241199693237900335204239496008641016955400178363039706333,
        "Y": 98206281677669063585309234705818540728303839018966295776521001268753556134537
    },
    {
        "X": 72664875838982340636391200513545812992442341844955961733021880193736610927495,
        "Y": 72911874978211977551112918690838955657286613708826885971426767283825381825555
    }
    ]
}

Output structure:

{
    "X": 21954240974367986768968703217224470574531668758188507420077336449714863251255,
    "Y": 59257226922668145037564841935192103580724138939404350391193921365000813716903
}

4) Signature generation by each participant

POST request

localhost:10000/signaturePart

Input structure:

{
    "message":"1234",
    "Ri": {
        "X": 72664875838982340636391200513545812992442341844955961733021880193736610927495,
        "Y": 72911874978211977551112918690838955657286613708826885971426767283825381825555
    },
    "ri": 110277077903500845345512394751386888471914029780409723985344654177239377126024,
    "L": 92111008636566153212032464762143563073542001160751363761712155655010845645112,
    "aggregatedPublicKey": {
        "X": 53273021753290677733958181036785342793909515636172542173452266111914559687918,
        "Y": 80438816962432312406855120871023622040514830899308207189257144571508235291798
    },
    "R": {
        "X": 39187551096853091697318624048264502756276174131861726900667247414843938291671,
        "Y": 104858173701843540448383142892396261186943819363060132734804369366770619715086
    },
    "pubKey":{
        "X": 30321070545248488399817466362260044602937803709853919585846660296849009833522,
        "Y": 584349551486137423528370505680565301008648566037903166922050018102495266109
    },
    "privateKey":105670716540001694424498454195915610571798257276411699105868739679738559251819
}

where:

“Message” - message for signing

“Ri” - public key that was generated in step 2

“ri” - private key that was generated in step 2

“L” - generated value in step 1

“aggregatedPublicKey” - aggregated public key

“R” - private key that was generated in step 3

“pubKey” - public key

“privateKey” - private key

Output structure:

74443022546988139061598211812603205866830863595660865133631292810888798763966

5) Signatures aggregation

POST request

localhost:10000/aggregatedSignature

Input structure:

{
    "L": 92111008636566153212032464762143563073542001160751363761712155655010845645112,
    "aggregatedPublicKey": {
        "X": 53273021753290677733958181036785342793909515636172542173452266111914559687918,
        "Y": 80438816962432312406855120871023622040514830899308207189257144571508235291798
    },
    "R": {
        "X": 39187551096853091697318624048264502756276174131861726900667247414843938291671,
        "Y": 104858173701843540448383142892396261186943819363060132734804369366770619715086
    },
    "sigList":[
        105689801978300580997942871504732446698008366627471895897196456699423211941014,
        74443022546988139061598211812603205866830863595660865133631292810888798763966
    ]
}

where:

“L” - value generated in step 1

“aggregatedPublicKey” - aggregated public key

“R” - private key that was generated in step 3

“sigList” - list of individual signatures

Output structure:

{
    "R": {
        "X": 39187551096853091697318624048264502756276174131861726900667247414843938291671,
        "Y": 104858173701843540448383142892396261186943819363060132734804369366770619715086
    },
    "S": "51451353949343670787600886700040163140835898335017047734382576772724312283694"
}
4. Deposit

1) Schnorr signature (for 1 user)

2) Commitment generation

POST request

localhost:10000/generateCommitment

Input structure:

{
    "amount": 10000,
    "recipientPubKey": {
        "X": 53273021753290677733958181036785342793909515636172542173452266111914559687918,
        "Y": 80438816962432312406855120871023622040514830899308207189257144571508235291798
    },
    "L": 92111008636566153212032464762143563073542001160751363761712155655010845645112
}

where:

“amount” - amount of deposit

“recipientPubKey” - user’s public key

“L” - value generated while key aggregation

Output structure:

{
    "X": 19795565013315582606940396496562298516408683722983819558981515122355401190744,
    "Y": 89338180409720623908550592962307435189775861369417461463063483974668277481313
}

3) Deposit

POST request

localhost:10000/deposit

Input structure:

{
    "sender": "0x1b17552bE3192810B80AE14B6CF8769D5dF9FF9e",
    "senderPrivateKey": "88893ec39cb7725a46ac5bc44ee6e9642c5518ff507df5ca6ce37e622ed86d92",
    "commitment": {
        "X": 80896827534506630690547520492020251026855161557744096096567524235125637166228,
        "Y": 35340021902447857874733116252574618597035402700515652153758858212804173617786
    },
    "amount": 10000,
    "message": "message",
    "publicKey": {
        "X": 105012878946854625478151668840096389084932252989398520013599206687016371737084,
        "Y": 109332001306514958330197135056171475144957829515243433050908948584468608042267
    },
    "R": {
        "X": 50076431034714051257113545201217887633355089690556915100431086728944568565495,
        "Y": 100534334696491181083477625115660637245645677532597488342701629369138874590038
    },
    "S":"45407579404865038949469822443889530360183727020693714560400763628627243928653"
}

where:

“sender” - user address (metamask)

“senderPrivateKey” - private key (metamask)

“commitment” - calculated commitment

“amount” - deposit amount

“message” - message that was signed

“publicKey” - public key

“R” - part of Schnorr signature

“S” - part of Schnorr signature

5. Transfer of hidden tokens

1) Schnorr signature (MuSig)

2) Transfer

POST request

localhost:10000/transfer

Input structure:

{
    "sender": "0x1b17552bE3192810B80AE14B6CF8769D5dF9FF9e",
    "senderPrivateKey": "88893ec39cb7725a46ac5bc44ee6e9642c5518ff507df5ca6ce37e622ed86d92",
    "recipient": "0xf58FAB89AFAC097AE8DB81A67a01aaF456A361A5",
    "amount": 10000,
    "senderPubKey": {
        "X": 71274971107086009423654472625397165911876163557104606609532095793867594051721,
        "Y": 98502168618575688520806502038862068970238071196776002104116306534168193007953
    },
    "recipientPubKey": {
        "X": 20400392980662004582987447932701697310381594492307122531911924466916881217178,
        "Y": 109842135426088964300149151521482980156991777499160788235495451760041101648489
    },
    "message": "message",
    "aggregatedPublicKey": {
        "X": 105012878946854625478151668840096389084932252989398520013599206687016371737084,
        "Y": 109332001306514958330197135056171475144957829515243433050908948584468608042267
    },
    "L": 90223355694085419087863670107616094985267487352052136056399093451244047138415,
    "R": {
        "X": 50076431034714051257113545201217887633355089690556915100431086728944568565495,
        "Y": 100534334696491181083477625115660637245645677532597488342701629369138874590038
    },
    "S":"45407579404865038949469822443889530360183727020693714560400763628627243928653"
}

where:

“sender” - user address (metamask)

“senderPrivateKey” - private key (metamask)

“recipient” - recipient address

“amount” - transferred amount

“senderPubKey” - sender public key

“recipientPubKey” - recipient public key

“message” - message that was signed

“aggregatedPublicKey” - aggregated public key

“L” - value generated while key aggregation

““R” - part of Schnorr signature

“S” - part of Schnorr signature

6. Withdrawal

1) Schnorr signature (for 1 user)

2) Change commitment generation

POST request

localhost:10000/generateCommitment

Input structure:

{
    "amount": 10000,
    "recipientPubKey": {
        "X": 53273021753290677733958181036785342793909515636172542173452266111914559687918,
        "Y": 80438816962432312406855120871023622040514830899308207189257144571508235291798
    },
    "L": 92111008636566153212032464762143563073542001160751363761712155655010845645112
}

where:

“amount” - amount that left on the balance

“recipientPubKey” - recipient public key

“L” - value generated while key aggregation

Output structure:

{
    "X": 19795565013315582606940396496562298516408683722983819558981515122355401190744,
    "Y": 89338180409720623908550592962307435189775861369417461463063483974668277481313
}

3) Withdrawal

POST request

localhost:10000/withdraw

Input structure:

{
    "sender": "0x1b17552bE3192810B80AE14B6CF8769D5dF9FF9e",
    "senderPrivateKey": "88893ec39cb7725a46ac5bc44ee6e9642c5518ff507df5ca6ce37e622ed86d92",
    "commitmentOldId": 1640100991,
    "commitment": {
        "X": 29581854941473273780983167316696779832306506083614655401787514381088218353587,
        "Y": 95742839520915075053972174008082682421116400817893831937435579328761440955019
    },
    "amount": 10000,
    "message": "message",
    "publicKey": {
        "X": 105012878946854625478151668840096389084932252989398520013599206687016371737084,
        "Y": 109332001306514958330197135056171475144957829515243433050908948584468608042267
    },
    "R": {
        "X": 50076431034714051257113545201217887633355089690556915100431086728944568565495,
        "Y": 100534334696491181083477625115660637245645677532597488342701629369138874590038
    },
    "S":"45407579404865038949469822443889530360183727020693714560400763628627243928653"
}

where:

“sender” - user address (metamask)

“senderPrivateKey” - private key (metamask)

“commitmentOldId” - commitment id that is withdrew

“commitment” - change commitment calculated on step 2

“amount” - withdrawal amount

“message” - message that was signed

“publicKey” - public key

““R” - part of Schnorr signature

“S” - part of Schnorr signature


About Offshift

Offshift is leading private decentralized finance (PriFi) with the world’s first Private Derivatives Platform. It leverages zero-knowledge (zk) proofs and sources reliable, real-time price feeds from Chainlink’s decentralized oracle network to enable users to mint zkAssets, an unprecedented line of fully private synthetics. Offshift’s mostly anonymous team has developed a trusted reputation for their thorough privacy research, development and execution.

To learn more and get involved, visit the links below:

Website | Telegram | Discord | Twitter | Instagram | YouTube | Buy XFT