|
@ -26,44 +26,49 @@ trap 'rm -rf "$TMPDIR"' EXIT |
|
|
initialize_account() { |
|
|
initialize_account() { |
|
|
# Generate or load mnemonic |
|
|
# Generate or load mnemonic |
|
|
if [ ! -f "mnemonic.txt" ]; then |
|
|
if [ ! -f "mnemonic.txt" ]; then |
|
|
# Generate 24-word mnemonic using Python |
|
|
# Generate entropy and convert to hex |
|
|
python3 -c " |
|
|
openssl rand -hex 32 > mnemonic.txt |
|
|
from eth_account.hdaccount import generate_mnemonic |
|
|
|
|
|
print(generate_mnemonic(language='english')) |
|
|
|
|
|
" > mnemonic.txt |
|
|
|
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
# Read and process mnemonic |
|
|
# Read entropy |
|
|
MNEMONIC=$(cat mnemonic.txt) |
|
|
ENTROPY=$(cat mnemonic.txt) |
|
|
|
|
|
|
|
|
# Derive address and keys using Python |
|
|
# Create temporary directory for key operations |
|
|
IDENTITY=$(python3 -c " |
|
|
TMPDIR=$(mktemp -d) |
|
|
from eth_account import Account |
|
|
trap 'rm -rf "$TMPDIR"' EXIT |
|
|
from eth_keys import keys |
|
|
|
|
|
import json |
|
|
# Generate secp256k1 private key |
|
|
|
|
|
openssl ecparam -name secp256k1 -genkey -noout -out "$TMPDIR/private.pem" |
|
|
Account.enable_unaudited_hdwallet_features() |
|
|
|
|
|
mnemonic = '$MNEMONIC'.strip() |
|
|
# Extract private key in hex format |
|
|
account = Account.from_mnemonic(mnemonic) |
|
|
PRIVATE_KEY=$(openssl ec -in "$TMPDIR/private.pem" -text -noout 2>/dev/null | |
|
|
address = account.address |
|
|
grep priv -A 3 | tail -n +2 | tr -d '\n[:space:]:' | cut -c3-) |
|
|
private_key = account.key.hex()[2:] |
|
|
|
|
|
pk = keys.PrivateKey(account.key) |
|
|
# Generate public key and address |
|
|
public_key = pk.public_key.to_hex()[2:] |
|
|
PUBLIC_KEY=$(openssl ec -in "$TMPDIR/private.pem" -pubout -outform DER 2>/dev/null | |
|
|
|
|
|
tail -c 65 | xxd -p -c 65) |
|
|
identity = { |
|
|
|
|
|
'did': f'did:ethr:{address}', |
|
|
# Generate Ethereum address (last 20 bytes of keccak256 of public key) |
|
|
'keys': [{ |
|
|
ADDRESS=$(echo -n "$PUBLIC_KEY" | xxd -r -p | |
|
|
'id': f'did:ethr:{address}#keys-1', |
|
|
openssl dgst -sha3-256 -binary | |
|
|
'type': 'Secp256k1VerificationKey2018', |
|
|
tail -c 20 | xxd -p) |
|
|
'controller': f'did:ethr:{address}', |
|
|
|
|
|
'ethereumAddress': address, |
|
|
# Create identity JSON |
|
|
'publicKeyHex': public_key, |
|
|
IDENTITY=$(cat <<EOF |
|
|
'privateKeyHex': private_key |
|
|
{ |
|
|
|
|
|
"did": "did:ethr:0x${ADDRESS}", |
|
|
|
|
|
"keys": [{ |
|
|
|
|
|
"id": "did:ethr:0x${ADDRESS}#keys-1", |
|
|
|
|
|
"type": "Secp256k1VerificationKey2018", |
|
|
|
|
|
"controller": "did:ethr:0x${ADDRESS}", |
|
|
|
|
|
"ethereumAddress": "0x${ADDRESS}", |
|
|
|
|
|
"publicKeyHex": "${PUBLIC_KEY}", |
|
|
|
|
|
"privateKeyHex": "${PRIVATE_KEY}" |
|
|
}], |
|
|
}], |
|
|
'services': [] |
|
|
"services": [] |
|
|
} |
|
|
} |
|
|
print(json.dumps(identity)) |
|
|
EOF |
|
|
") |
|
|
) |
|
|
|
|
|
|
|
|
echo "Account initialized:" |
|
|
echo "Account initialized:" |
|
|
echo "$IDENTITY" | jq . |
|
|
echo "$IDENTITY" | jq . |
|
|