¿Cómo puedo ejecutar comandos geth con secuencias de comandos con parámetros de línea de comandos específicos?

Tengo un contrato ejecutándose en la red de prueba, y cada vez que necesito llamar a una función, después de abrir Geth tengo que escribir (o pegar):

primary = eth.accounts[0];
personal.unlockAccount(primary, 'mypassword');
var source = "contract FooContract {...}";
var compiled = web3.eth.compile.solidity(source);
var contract = web3.eth.contract(compiled.FooContract.info.abiDefinition);
var fooContract = contract.at("0xf00");

¿Hay alguna manera de hacer que Geth lo recuerde después de cerrarlo?

Este es un cambio de vida. ¿Puedes creer que solía hacer que todos mis scripts esperaran a que geth estuviera disponible, luego lo abría, ejecutaba el script y lo cerraba? Hable acerca de la eficiencia... Puede que no esté relacionado, pero ¿tiene una solución para ejecutar scripts con argumento? Mi solución actual es tan fea como puede ser...
Supongo que puedo llamar a la multipleCommandsecuencia de comandos con un argumento, y soltar algunos $1y $2en los comandos, eso debería funcionar. Voy a actualizar mi pregunta anterior sobre argumentos con sus soluciones, es mucho mejor.

Respuestas (2)

Siguiendo con sus comentarios anteriores de que está buscando un script que tome parámetros opcionales, aquí hay un script de ejemplo con parámetros de línea de comando que puede personalizar:

#!/bin/bash
# ------------------------------------------------------------------------------
# Check account balance
#
# Works on Linux and OS/X. May work on Windows with Cygwin.
#
# Usage:
#   1. Download this script to checkBalance
#   2. `chmod 700 checkBalance`
#   3. Run `geth console` in a window.
#   4. Then run this script `./checkBalance` in a separate window.
#
# Parameters:
#   account    Account to check the balance. Defaults to GOLEM multisig
#   block      Blocknumber. Defaults to "latest"
#
# Sample Usage:
#   ./checkBalance
#   '0x7da82c7ab4771ff031b66538d2fb9b0b047f6cf9' at 'latest' has 770001.899999999999999999 ETH
#   ./checkBalance 0x7da82c7ab4771ff031b66538d2fb9b0b047f6cf9 2691189
#   '0x7da82c7ab4771ff031b66538d2fb9b0b047f6cf9' at '2691189' has 820002.9 ETH
#
# History:
#   * Jan 07 2017 - Version 1.0
#
# Enjoy. (c) BokkyPooBah 2016. The MIT licence.
# ------------------------------------------------------------------------------

# Leave ATTACHPARAMETER as undefined normally
# RPC
# ATTACHPARAMETER="rpc:http://localhost:8545"
# OS/X IPC
# ATTACHPARAMETER="ipc:$HOME/Library/Ethereum/geth.ipc"

# Golem multisig
ACCOUNT=${1:-"0x7da82c7ab4771ff031b66538d2fb9b0b047f6cf9"}
BLOCK=${2:-"latest"}

# echo "ACCOUNT: $ACCOUNT"
# echo "ATTACHPARAMETER: $ATTACHPARAMETER"

# Uncomment the following line and comment the next line using // while debugging this script
# geth attach $ATTACHPARAMETER << EOF
geth attach $ATTACHPARAMETER << EOF | grep "Data: " | sed "s/Data: //"

var balance=web3.fromWei(eth.getBalance("$ACCOUNT", "$BLOCK"), "ether");
console.log("Data: '$ACCOUNT' at '$BLOCK' has " + balance + " ETH");

EOF

Referencia: ¿Cómo escribir un script bash que tome argumentos de entrada opcionales?

¿Es posible asignar algunas de las variables de la parte javascript a las variables bash? Realmente no sé lo que puedo y no puedo hacer entre geth attach <<EOFy el segundo EOF. Si, por ejemplo, quiero guardar mi saldo en una variable, enviar una transacción y luego guardar mi saldo en otra variable, ¿hay alguna forma de hacerlo?
Actualmente estoy trabajando en pruebas de seguridad de algunos contratos de intercambio sin confianza descentralizados para cotizar en cryptoderivatives.market. Puede ver mi última versión de scripts de prueba en github.com/bokkypoobah/TokenTrader/tree/master/testing/… . Leo las variables de los archivos y las paso a través de un script para geth JavaScript (busque PASSWORD). Guardo direcciones y ABI (ver factoryData). (Actualizado para la versión actual)
Solo una pequeña pregunta (no creo que deba abrir una nueva pregunta para eso) ¿qué hace sed "s/^.*=//"? Busqué algún documento para sed y expresiones regulares, pero no puedo llegar a una conclusión definitiva. ¿Se mantiene sólo la parte posterior =? (Quiero decir, sé que eso es lo que hace, pero no entiendo cómo)
Sí. sed "s/{from}/{to}/"sustituye la cadena from con la cadena to. En la cadena from, ^coincide con el comienzo de la línea, .coincide con cualquier carácter, *opera en el elemento anterior y coincide con cero o más del último elemento y =coincide con =. Entonces, el comando sustituye cualquier cosa, desde el comienzo de la línea hasta el =carácter con una cadena en blanco. Si su línea es TEST=123, el sedcomando la cambiará a 123.
Gran explicación, gracias! Agregué ?después =para poder hacer contract={...a=b...}y aún obtener todo, no solo la parte después de la última =. No sé si hay mejores lugares para almacenar contratos que en el archivo de configuración (mi proyecto gira en torno a un solo contrato, tal vez tenga menos sentido con diferentes proyectos)

Lo estás haciendo al revés.

Lo que desea hacer es tener geth ejecutándose como un demonio y luego su JavaScript se conecta a Geth a través del protocolo web3.js / JSON-RPC. (Es el mismo objeto web3 expuesto que está disponible en el indicador geth). Puede ejecutar scripts de JavaScript usando nodeel comando.

A continuación se muestra un ejemplo. Puede encontrar ejemplos en esta publicación de blog tutorial: Programación de transacciones de contratos inteligentes de Ethereum en JavaScript .

Cree un package.jsonpara su proyecto para instalar web3:

 npm install --save web3

Primero inicie geth en modo testnet/mining con el archivo de génesis de Ropsten testnet :

   geth --rpc --rpcapi "db,eth,net,web3,personal" --verbosity 3 --rpccorsdomain "*" --cache 384 --datadir /home/ubuntu/.ethereum/ropsten --networkid 3 --mine

Luego ejecute un archivo JavaScript que se conecte a su geth y realice las llamadas necesarias (no es el mismo ejemplo que en su pregunta, pero debería tener una idea):

/* Call the contract using web3-
 *
 * To run:
 *
 *        nvm use 7.2.1
 *       ./node_modules/babel-cli/bin/babel-node.js --presets es2015 ./tests/callcontract.js
 *
 */

import fs from "fs";
import Web3  from 'web3';

let web3 = new Web3();
web3.setProvider(new web3.providers.HttpProvider('http://localhost:8545'));

// Fetch ABI - see blog post how to generate contracts.json
let source = fs.readFileSync("contracts/contracts.json");
let contracts = JSON.parse(source)["contracts"];
let abi = JSON.parse(contracts.SampleContract.abi);

// Get a proxy on our Ropsten contract
let SampleContract = web3.eth.contract(abi);
let contract = SampleContract.at('0xe0b79b3d705cd09435475904bf54520929eae4e8');

// Perform a transaction using ETH from the geth coinbase account
web3.personal.unlockAccount(web3.eth.coinbase, "");

// Set the account from where we perform out contract transactions
web3.eth.defaultAccount = web3.eth.coinbase;

let tx = contract.setValue(3000, {gas: 200000});
console.log("Our tx is https://testnet.etherscan.io/tx/" + tx);
Este no es un script de node.js, ¿verdad? Usaría requireen lugar de import, y parece let que no es compatible.
Por favor, lea el primer comentario en el guión.
No entiendo por qué tendrías que hacer eso. Puede cambiar un poco la sintaxis y ejecutarlo con node callcontract.js. ¿Cuáles son los beneficios de hacer eso? Estoy usando var Web3 = require('web3'); web3 = new Web3(new Web3.providers.HttpProvider("http://localhost:8545"))var en lugar de let y funciona de maravilla. No lo tomes a mal, pero no quiero usar cosas que no entiendo. (Si puedo hacerlo con babel-cli, lo haré a menos que me diga por qué debería usarlo)
Estoy aplicando tecnologías modernas de desarrollo de JavaScript para poder trabajar de manera más productiva utilizando los últimos estándares ECMAScript, azúcar sintático y mejores prácticas de desarrollo. No me preocupa si esto está fuera del alcance del lector.
Esa es una muy buena razón, no sabía sobre ECMAScript. Puede que no empiece a usarlo en este momento, pero tu ejemplo es bastante útil, no obstante.
Solo por hoy, pruebe algunas cosas alucinantes que harán que su desarrollo de JavaScript sea mucho más fácil babeljs.io ;)
¿Necesita minar hasta que se procese la transacción? En los ejemplos hacen algo como while(eth.pendingTransaction[0]!=undefined) {admin.sleepBlock(1);}. No puedo ir admina trabajar, pero parece que mis transacciones no se cancelan.