Skip to content

Commit da08ded

Browse files
committed
fix(SOLNENG-27): fix eth packaging
1 parent 3c9d747 commit da08ded

File tree

5 files changed

+429
-18
lines changed

5 files changed

+429
-18
lines changed

ethereum-staking/buildervault/golang/go.mod

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ go 1.21.0
55
require (
66
github.com/ethereum/go-ethereum v1.13.14
77
github.com/fatih/structs v1.1.0
8+
github.com/joho/godotenv v1.5.1
89
gitlab.com/Blockdaemon/go-tsm-sdkv2 v0.0.0-20240227205306-65d60d978f8d
910
golang.org/x/sync v0.6.0
1011
)
@@ -24,7 +25,6 @@ require (
2425
github.com/go-ole/go-ole v1.3.0 // indirect
2526
github.com/gorilla/websocket v1.4.2 // indirect
2627
github.com/holiman/uint256 v1.2.4 // indirect
27-
github.com/joho/godotenv v1.5.1 // indirect
2828
github.com/mmcloughlin/addchain v0.4.0 // indirect
2929
github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible // indirect
3030
github.com/supranational/blst v0.3.11 // indirect

ethereum-staking/buildervault/nodejs/ethereum-stake-bv.ts

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ function createStakeIntent(
3737
bossApiKey: string,
3838
request: CreateStakeIntentRequest,
3939
): Promise<CreateStakeIntentResponse> {
40+
41+
// * Create a stake intent with the Staking Integration API: https://docs.blockdaemon.com/reference/postethereumstakeintent
4042
const requestOptions = {
4143
method: 'POST',
4244
headers: {
@@ -49,7 +51,7 @@ function createStakeIntent(
4951
};
5052

5153
return fetch(
52-
'https://svc.blockdaemon.com/boss/v1/ethereum/holesky/stake-intents',
54+
`https://svc.blockdaemon.com/boss/v1/ethereum/${process.env.ETHEREUM_NETWORK}/stake-intents`,
5355
requestOptions,
5456
).then(response => response.json() as Promise<CreateStakeIntentResponse>);
5557
}
@@ -84,6 +86,7 @@ async function main() {
8486

8587
// Set buildervault endpoints
8688

89+
// * BuilderVault mTLS authentication with publickey pinning: https://builder-vault-tsm.docs.blockdaemon.com/docs/authentication-3#public-key-pinning
8790
const serverMtlsPublicKeys = {
8891
0: `-----BEGIN CERTIFICATE-----\nMIICMTCCAdegAwIBAgICB+MwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMw\nEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtMb3MgQW5nZWxlczEUMBIGA1UE\nCgwLQmxvY2tkYWVtb24xFDASBgNVBAsMC0Jsb2NrZGFlbW9uMRQwEgYDVQQDDAtC\nbG9ja2RhZW1vbjEkMCIGCSqGSIb3DQEJARYVYWRtaW5AYmxvY2tkYWVtb24uY29t\nMB4XDTI0MDIxMzE3MjE0OFoXDTI5MDIxMzE3MjE0OFowTjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgTCkNhbGlmb3JuaWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMRQwEgYD\nVQQKEwtCbG9ja2RhZW1vbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABGlixcUc\nYC0ByeutoHHdi3zxWCg5iPAJcxVLvzBUdD2+XdCWEgS/xwFEef9Tl3xFdfK4iWSQ\nnjmtYMTaHMM6mfWjUjBQMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEF\nBQcDAgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUW6ouasv5oWo7MZ4ZzlE/mpbDrIMw\nCgYIKoZIzj0EAwIDSAAwRQIgSDKHZmsnylzL8kopFSeo8L6LQGxyd/NsBRb+8STI\n1cECIQChi4cl5nJgTXCBzJEHicnRk/0vl+9zq6iABMV+KTXJxA==\n-----END CERTIFICATE-----`,
8992
1: `-----BEGIN CERTIFICATE-----\nMIICMjCCAdegAwIBAgICB+MwCgYIKoZIzj0EAwIwgaAxCzAJBgNVBAYTAlVTMRMw\nEQYDVQQIDApDYWxpZm9ybmlhMRQwEgYDVQQHDAtMb3MgQW5nZWxlczEUMBIGA1UE\nCgwLQmxvY2tkYWVtb24xFDASBgNVBAsMC0Jsb2NrZGFlbW9uMRQwEgYDVQQDDAtC\nbG9ja2RhZW1vbjEkMCIGCSqGSIb3DQEJARYVYWRtaW5AYmxvY2tkYWVtb24uY29t\nMB4XDTI0MDIxMzE3MjEzMloXDTI5MDIxMzE3MjEzMlowTjELMAkGA1UEBhMCVVMx\nEzARBgNVBAgTCkNhbGlmb3JuaWExFDASBgNVBAcTC0xvcyBBbmdlbGVzMRQwEgYD\nVQQKEwtCbG9ja2RhZW1vbjBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABKz8yGcE\nYIhaQYCA2As30cRIL2rLrB2uKpcFpydE55RoI3Hw+QaeNCfR5znZQZM4bVVquT4i\nxDGhVnQKU5EQU/WjUjBQMA4GA1UdDwEB/wQEAwIHgDAdBgNVHSUEFjAUBggrBgEF\nBQcDAgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAUW6ouasv5oWo7MZ4ZzlE/mpbDrIMw\nCgYIKoZIzj0EAwIDSQAwRgIhAO9yXpssqar6IdgmEOIfAsha0ZIWG56nwE8/GbyN\nBiTaAiEAhhEClrSm/TzmWxODXamBz0pmQ9qNFsrtbGsDhLOe8O8=\n-----END CERTIFICATE-----`,
@@ -104,7 +107,7 @@ async function main() {
104107
await TSMClient.withConfiguration(config1),
105108
];
106109

107-
const threshold = 1; // The security threshold for this key
110+
const threshold = 1; // * The security threshold for this key https://builder-vault-tsm.docs.blockdaemon.com/docs/security-overview#security-model
108111

109112
const masterKeyId = await getKeyId(clients, threshold, "key.txt");
110113

@@ -174,7 +177,8 @@ async function main() {
174177
const totalDepositAmount =
175178
stakes.reduce((sum, next) => sum + BigInt(next.amount), 0n) * gwei;
176179

177-
const web3 = new Web3(`https://svc.blockdaemon.com/ethereum/holesky/native?apiKey=${process.env.BLOCKDAEMON_API_KEY}`);
180+
// * Using Blockdaemon RPC API for Ethereum: https://docs.blockdaemon.com/reference/how-to-access-ethereum-api
181+
const web3 = new Web3(`https://svc.blockdaemon.com/ethereum/${process.env.ETHEREUM_NETWORK}/native?apiKey=${process.env.BLOCKDAEMON_API_KEY}`);
178182

179183
// log initial balances
180184
console.log("Initial balance:", await web3.eth.getBalance(address));
@@ -201,20 +205,16 @@ async function main() {
201205
console.log('Transaction Hash:', web3.utils.toHex(txHash));
202206
const {r,s,v} = await signTx(txHash, clients, masterKeyId, chainPath);
203207

204-
const signedTransaction = transaction._processSignature(v, web3.utils.hexToBytes(r), web3.utils.hexToBytes(s));
205-
206-
console.log('Get Sender Address:', signedTransaction.getSenderAddress().toString());
207-
console.log('Get Sender pk:', web3.utils.bytesToHex(signedTransaction.getSenderPublicKey()));
208+
const signedTransaction = transaction._processSignature(v.valueOf(), web3.utils.hexToBytes(r), web3.utils.hexToBytes(s));
208209

209210
const serializeTx = TransactionFactory.fromTxData(signedTransaction).serialize();
210211
console.log('Signed Transaction:', web3.utils.toHex(serializeTx));
211-
const txReceipt = await web3.eth.sendSignedTransaction(serializeTx)
212+
const txReceipt = await web3.eth.sendSignedTransaction(serializeTx);
212213

213-
console.log(txReceipt);
214+
console.log(`Broadcasted transaction hash: https://${process.env.ETHEREUM_NETWORK}.etherscan.io/tx/${txReceipt.transactionHash}`);
214215
}
215216

216217

217-
218218
async function signTx(
219219
messageToSign: Uint8Array,
220220
clients: TSMClient[],
@@ -224,14 +224,31 @@ async function signTx(
224224

225225

226226
console.log(`Builder Vault signing transaction hash...`);
227+
228+
// ToDo: Change to newStaticSessionConfig once TSM nodes are publically signed
229+
230+
// The public keys of the other players to encrypt MPC protocol data end-to-end
231+
const playerB64Pubkeys = [
232+
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEtDFBfanInAMHNKKDG2RW/DiSnYeI7scVvfHIwUIRdbPH0gBrsilqxlvsKZTakN8om/Psc6igO+224X8T0J9eMg==",
233+
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEqvSkhonTeNhlETse8v3X7g4p100EW9xIqg4aRpD8yDXgB0UYjhd+gFtOCsRT2lRhuqNForqqC+YnBsJeZ4ANxg==",
234+
];
235+
236+
const playerPubkeys = [];
237+
const playerIds = new Uint32Array(Array(clients.length).fill(0).map((_, i) => i));
238+
for (const i of playerIds) {
239+
const pubkey = Buffer.from(playerB64Pubkeys[i], "base64");
240+
playerPubkeys.push(pubkey);
241+
}
242+
243+
const sessionConfig = await SessionConfig.newSessionConfig(await SessionConfig.GenerateSessionID(), playerIds, playerPubkeys);
244+
245+
// const sessionConfig = await SessionConfig.newStaticSessionConfig(
246+
// await SessionConfig.GenerateSessionID(),
247+
// clients.length
248+
// );
227249

228250
const partialSignatures: string[] = [];
229251

230-
const sessionConfig = await SessionConfig.newStaticSessionConfig(
231-
await SessionConfig.GenerateSessionID(),
232-
clients.length
233-
);
234-
235252
const partialSignaturePromises: Promise<void>[] = [];
236253

237254
for (const [_, client] of clients.entries()) {
@@ -312,7 +329,8 @@ async function getKeyId(
312329
// await SessionConfig.GenerateSessionID(),
313330
// clients.length
314331
// );
315-
332+
333+
// * Generate an ECDSA master key: https://builder-vault-tsm.docs.blockdaemon.com/docs/getting-started-demo-tsm-golang
316334
const masterKeyIds: string[] = [];
317335

318336
clients.forEach(() => masterKeyIds.push(""));

0 commit comments

Comments
 (0)