diff --git a/Dockerfile b/Dockerfile index d57aa1ba76081e6b9f17d3367a0b35aaa1138ad6..153dad0e705b550a5a51c5de1cdd443789a9fc16 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,14 +1,16 @@ FROM ubuntu:xenial -MAINTAINER Francisco Ruiz BFA +LABEL authors="Francisco Ruiz BFA,Matias Ruggieri UNSAM" ENV DEBIAN_FRONTEND noninteractive ENV BFAHOME=/home/bfa ENV PATH=${PATH}:${BFAHOME}/bin WORKDIR /home/bfa - +VOLUME ["/home/bfa"] +COPY src/deploy.sh /root/ RUN apt-get update && \ apt-get -y -qq upgrade && \ - apt-get install -y -qq git software-properties-common jq ncurses-bin curl - + apt-get install -y -qq git software-properties-common jq ncurses-bin curl && \ + chmod +x /root/deploy.sh -COPY src/install.sh /root/ -CMD bash -C '/root/install.sh';'bash' +CMD bash -C '/root/deploy.sh';'bash' +EXPOSE 8545 +EXPOSE 30303 diff --git a/bin/MasterDistiller.js b/bin/MasterDistiller.js deleted file mode 100755 index 1fcabecc2becf1f6e8215fe7f3ee419f9b29e263..0000000000000000000000000000000000000000 --- a/bin/MasterDistiller.js +++ /dev/null @@ -1,264 +0,0 @@ -#!/usr/bin/node - -const Libbfa = require( process.env.BFAHOME + '/bin/libbfa.js'); -const rl = require('readline').createInterface( - { input: process.stdin, output: process.stdout } - ); -var web3; -var Distillery; -var bfa; -var notation = [ 6 ]; - -function init() -{ - notation.push( 10**notation[0] ); - switch ( notation[0] ) { - case 6: - notation.push( "Mwei" ); - break; - case 9: - notation.push( "Gwei" ); - break; - default: - notation = [ 6, 10**6, "Mwei" ]; - } - bfa = new Libbfa(); - web3 = bfa.newweb3(); - Distillery = bfa.contract( web3, 'Distillery' ); - web3.eth.getBalance( Distillery.contractaddress ).then( - function receivedOwnBalance(val) { - Distillery.contractbalance = val; - getlist(); - }, - function err(x){ bfa.fatal("Can't do that: "+x);process.exit(1); } - ); -} - -function palletSort(a,b) -{ - if ( b == undefined ) - { - if ( a == undefined ) - return 0; - else - return -1; - } - if ( a == undefined ) - return 1; - var strA = a[0].toLowerCase(); - var strB = b[0].toLowerCase(); - if ( strA < strB ) - return -1; - if ( strA > strB ) - return 1; - return 0; -} - -function requestBalances( count ) -{ - var pallet = new Array; - var proms = new Array; - var i; - // Fetch addresses from the list in the contract. - for ( i=0; i<count; i++ ) - { - proms.push( - Distillery.methods.atPosition(i).call( {} ) - .then( - function(res) { pallet.push(res); }, - function(err) { bfa.fatal("Fetching position data failed: "+err) } - ) - ); - } - Promise.all( proms ).then( - function(x) { - // The Well has now been filled out - // so we will ask for the balances of the found accounts - var p2 = new Array(); - for ( i=0; i<count; i++ ) - { - var cb = setBal.bind(null,pallet,i); - p2.push( web3.eth.getBalance( pallet[i][0] ).then(cb) ); - } - Promise.all( p2 ).then( - function allbalances(a) { displayBalances(pallet) }, - function(err) { bfa.fatal("Getting balances failed: "+err) } - ); - }, - function(err) { bfa.fatal("Getting account list failed: "+err) } - ); -} - -function setBal( arr, idx, val ) -{ - arr[idx][2]=val; -} - -function editAccount( entry, pallet ) -{ - if ( entry == undefined ) - return; - var acct; - var value; - // it is an existing account address? - if ( bfa.isAddr(entry) ) - { - var i = 0; - var n = pallet.length; - while ( i < n ) - { - if (String(pallet[i][0]).toLowerCase() == String(entry).toLowerCase() ) - entry = i; - i++; - } - } - // it is a new account address? - if ( bfa.isAddr(entry) ) - { - acct = entry; - value = 0; - } - else - if ( bfa.isNumeric(entry) && entry < pallet.length ) - { - acct = pallet[entry][0]; - value = pallet[entry][1]; - } - else - if ( entry == "x" ) - { - // trigger distribution - Distillery.methods.distribute().send( {"from": bfa.account, "gas": 1000000 } ) - .then( - function distOK(x) { - console.log( - "Distribute returned succesfully in block# " - + x.blockNumber - + " using " - + x.gasUsed - + " gas." - ); - getlist(); - }, - function distFail(x) { - bfa.fatal( - "Distribute returned errors in block# " - + x.blockNumber - + " using " - + x.gasUsed - + " gas." - ); - console.log(x); - process.exit( 1 ); - } - ); - return; - } - else - bfa.fatal("I don't know what to do with \""+entry+"\"." ); - rl.question( - "Adjust the " - + notation[2] - + " fill value of " - + acct - + " (setting to 0 is the same as deleting)\n" - + "Amount?: ", - (answer) => { - if ( bfa.isNumeric(answer) ) - { - answer *= notation[1]; - console.log("Sending update to the SC..."); - Distillery.methods.setEtherAllowance(acct,answer) - .send( {"from": bfa.account } ) - .then( - function(a){ - console.log("Update accepted.") - getlist(); - }, - function(b){ - bfa.fatal( - "\nMaybe you are not authorized:\n" - +b - +"\n\n\nI think you should leave now.\n" - ); - } - ) - } - else - bfa.fatal( "I have no idea what to do with \""+answer+"\"." ); - rl.close; - } - ); -} - -function displayBalances( pallet ) -{ - var n = pallet.length; - var i; - pallet.sort(palletSort); - console.log( - "The contract's account (" - + Distillery.contractaddress - + ") has " - + Math.floor(Distillery.contractbalance/notation[1]).toFixed(0) - + " " - + notation[2] - + ".\n" - ); - var longest = 1; - for ( i=0; i<n; i++ ) - { - var len = (pallet[i][1]/notation[1]).toFixed(notation[0]).length; - if ( len > longest ) - longest = len; - } - for ( i=0; i<n; i++ ) - { - var entry = pallet[i]; - if ( entry == undefined ) - console.log( i+": <undef>" ); - else - { - var numstr = (pallet[i][1]/notation[1]).toFixed(notation[0]); - while ( numstr.length < longest ) - numstr = " "+numstr; - console.log( - i - + ": " - + pallet[i][0] - + " fills to " - + numstr - + " " - + notation[2] - + " (has " - + Number(pallet[i][2]/notation[1]).toFixed(notation[0]) - + ")." - ); - } - } - console.log("\n[ Q=quit x=distribute ]"); - rl.question("Which account to edit (enter index number of full account number)?: ", - (answer) => { - if ( answer != undefined ) - { - if ( String(answer).toUpperCase() == 'Q' ) - process.exit( 0 ); - else - editAccount(answer, pallet); - } - rl.close; - } - ) -} - -function getlist() -{ - Distillery.methods.numberOfBeneficiaries() - .call() - .then( - requestBalances, - function beneficiaryFail(x){bfa.fatal(x)} - ); -} - -init(); diff --git a/bin/attach.sh b/bin/attach.sh deleted file mode 100755 index 41ade79de4cf27b0e7f5481ea72faf7ee39020d1..0000000000000000000000000000000000000000 --- a/bin/attach.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -# 20180626 Robert Martin-Legene <robert@nic.ar> - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -geth_attach "$@" diff --git a/bin/bfalog.sh b/bin/bfalog.sh deleted file mode 100755 index 69701e18e3be634005fd28e595aaaed6d058161c..0000000000000000000000000000000000000000 --- a/bin/bfalog.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -# Robert Martin-Legene <robert@nic.ar> - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -bfaconfig node -exec tail -n 100 -F ${BFANODEDIR}/log diff --git a/bin/checkreceipt.sh b/bin/checkreceipt.sh deleted file mode 100755 index d58cdacf06b7be943da04622008631857f41ec35..0000000000000000000000000000000000000000 --- a/bin/checkreceipt.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -geth_exec "eth.getTransactionReceipt(\"$1\");" < /dev/null diff --git a/bin/compile.and.deploy.contract b/bin/compile.and.deploy.contract deleted file mode 100755 index f7a36c0ff88ab9452775a3aa6278b2b18678fe59..0000000000000000000000000000000000000000 --- a/bin/compile.and.deploy.contract +++ /dev/null @@ -1,70 +0,0 @@ -#!/bin/bash -# 20180618 Robert Martin-Legene <robert@nic.ar> - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -function create -{ - workdir=$( mktemp -p . -d ) - cleanup "$workdir" - json=$( solc --optimize --combined-json abi,bin $filename ); test $? = 0 - prefix=$( echo "$json" | jq -M '.contracts | keys | .[0]' ); - abi=$( echo "$json" | jq -rM ".contracts.${prefix}.abi" ); test $? = 0 - bin=$( echo "$json" | jq -rM ".contracts.${prefix}.bin" ); test $? = 0 - # Save abi for future use - echo $abi > ${workdir}/abi - # We could save the bin, but we don't actually use it later, plus - # it gets stored in the blockchain - #echo $bin > ${workdir}/bin - js=$( mktemp ) - cleanup "$js" - cat > $js <<EOT -var mycontract = eth.contract($abi) -var transaction = mycontract.new( { from: eth.accounts[0], data: "0x${bin}", gas: 1000000 } ) -var rcpt -while ( !rcpt ) -{ - admin.sleepBlocks( 1 ) - rcpt = eth.getTransactionReceipt( transaction.transactionHash ) -} -var address = rcpt.contractAddress -var pubcontract = mycontract.at(address) -console.log( pubcontract.address ) -EOT - echo '*** Creating contract. This will take at least 16 seconds.' - outfile=$( mktemp ) - cleanup "$outfile" - geth_exec_file $js > $outfile - if [ ` wc -l < $outfile ` = 2 -a `tail -1 < $outfile` = "true" ] - then - addr=` head -1 < $outfile ` - mkdir -p ${BFANETWORKDIR}/contracts - mv ${workdir} ${BFANETWORKDIR}/contracts/${addr} - echo Your new contract can be found in ${BFANETWORKDIR}/contracts/${addr} - ln -snf ${addr} ${BFANETWORKDIR}/contracts/${contractname} - else - echo - echo ' *** INPUT ***' - echo - cat $js - echo - echo ' *** OUTPUT ***' - echo - cat $outfile - fi -} - -filename="$1" -if [ -z "$filename" -o ! -r "$filename" ] -then - echo "Specify a filename of a contract you wish to compile." - false -fi -contractname=${filename%%.sol} -contractname=${contractname##*/} -contractname=${contractname##contract.} -contractname=${contractname%.*} -bfaconfig max -prereq jq solc geth -create diff --git a/bin/cron.sh b/bin/cron.sh deleted file mode 100755 index e1f8ca4b2ab16b5f263554635cc3dbfd8cfebdac..0000000000000000000000000000000000000000 --- a/bin/cron.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -trap 'exit 1' ERR -# Go $HOME -cd -# Log in home directory -exec < /dev/null > bfa-cron-output.log 2>&1 -# Go to script bin, 'cause we expect to find $BFAHOME/bin/env there -cd `dirname $0` -source ./env -( - ./start.sh & - # Yes, we wait 60 seconds after starting the server. - # If you don't want to wait, kill the sleep.. the || true - # will capture the ERR trap. - while sleep 60 || true - do - ./monitor.sh - done & -) diff --git a/bin/env b/bin/env deleted file mode 100644 index 2139b8492cfa7cc8b1fb1db458bc2c8b657b5cc1..0000000000000000000000000000000000000000 --- a/bin/env +++ /dev/null @@ -1,4 +0,0 @@ -export BFAHOME=${HOME}/bfa -export BFANETWORKDIR="${BFAHOME}/network5445" -export BFANETWORKID=5445 -PATH=${PATH}:${BFAHOME}/bin diff --git a/bin/explorer.sh b/bin/explorer.sh deleted file mode 100755 index 10b69ea870ada6706cd75b3d35bdbef8569bb9e8..0000000000000000000000000000000000000000 --- a/bin/explorer.sh +++ /dev/null @@ -1,98 +0,0 @@ -#!/bin/bash -# 20180619 Robert Martin-Legene <robert@nic.ar> - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -bfaconfig max -prereq tput curl -cd "${BFANETWORKDIR}" -width=$( tput cols ) -height=$( tput lines ) - -function showblock -{ - local hexblock - if [ "$1" = "latest" ] - then - hexblock="latest" - else - hexblock=$( printf '0x%x' $(( $1 )) ) - fi - local json=$( geth_rpc eth_getBlockByNumber \"${hexblock}\" true ) - if [ "${_onscreen}" != "$( echo $json | jq .hash )" ] - then - hexblock=$( echo $json | jq -r .number ) - printf '\e[H\e[JBlock %d (0x%x)\n' $(( $hexblock )) $(( $hexblock )) - echo $json | - jq -C . | - fold --width=$width | - head -$(( $height - 2 )) - _onscreen=$( echo $json | jq .hash ) - printf '\e[mj=up k=down l=latest q=quit ' - fi -} - -function latest -{ - local json=$( geth_rpc eth_blockNumber ) - local num=$( echo "$json" | jq -r . ) - # This arithmetic expansion in bash converts a hex number prefixed with 0x to a decimal number - echo $(( $num )) -} - -function tm -{ - if [ "$block" = "latest" ] - then - timeout="-t 1" - else - timeout= - fi -} - - -block=$1 -maxblock=$( latest ) -test -z "$block" && - block=latest -showblock $block -lastblock= -tm -while : -do - read -r -s -n 1 ${timeout} || true - maxblock=$( latest ) - case "${REPLY^^}" in - Q) - echo - exit 0 - ;; - K) - if [ "$block" = "latest" -a $maxblock -gt 0 ] - then - block=$(( $maxblock - 1 )) - else - if [ $block -gt 0 ] - then - block=$(( $block - 1 )) - fi - fi - ;; - J) - if [ "$block" != "latest" ] - then - block=$(( $block + 1 )) - fi - ;; - L) - block="latest" - ;; -# *) -# continue -# ;; - esac - lastblock=$block - showblock $block - tm -done diff --git a/bin/getbalance.sh b/bin/getbalance.sh deleted file mode 100755 index 823cdf0dc7ef5a3584b44a6d25d2f78e78a8c653..0000000000000000000000000000000000000000 --- a/bin/getbalance.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -function usage -{ - fatal "Usage: $0 <addr> [...<addr>]" -} - -prereq curl -test $# -ge 1 || usage - -( -while [ -n "$1" ] -do - echo "'$1'+' '+web3.fromWei(eth.getBalance('$1'), 'Ether');" - shift -done -) | geth_attach diff --git a/bin/libbfa.js b/bin/libbfa.js deleted file mode 100644 index 4af1f4172993f9c9531d5fb07ae92c9591ee299f..0000000000000000000000000000000000000000 --- a/bin/libbfa.js +++ /dev/null @@ -1,161 +0,0 @@ -// 20180724 Robert Martin-Legene <robert@nic.ar> - -module.exports = class Libbfa -{ - constructor() { - this.fs = require('fs'); - this.Web3 = require('web3'); - this._account(); - } - - fatal( txt ) - { - console.log( txt ); - process.exit( 1 ); - } - - _home() - { - if ( this.home != undefined ) - return; - if ( process.env.BFAHOME == undefined ) - fatal( "$BFAHOME not set. Did you source bfa/bin/env ?" ); - this.home = process.env.BFAHOME; - } - - _getnetworkid() - { - if ( this.networkid != undefined ) - return; - this._home(); - if ( process.env.BFANETWORKID == undefined ) - { - var netw = new Array(); - this.fs.readdirSync( this.home ).forEach( function(file){ - if ( file.startWith('network') ) - netw.push( 0 + file.substring(7) ); - }); - if ( netw.length == 0 ) - fatal( "Can't determine your network ID." ); - netw.sort(); - process.env.BFANETWORKID= - this.networkid = netw[0]; - } - else - this.networkid = process.env.BFANETWORKID; - } - - _networkdir() - { - if ( this.networkdir != undefined ) - return; - this._getnetworkid(); - if ( process.env.BFANETWORKDIR == undefined ) - process.env.BFANETWORKDIR = - this.networkdir = process.env.BFAHOME + '/network' + process.env.BFANETWORKID; - else - this.networkdir = process.env.BFANETWORKDIR; - } - - _nodedir() - { - if ( this.nodedir != undefined ) - return; - this._networkdir(); - if ( this.networkdir == undefined ) - return; - if ( process.env.BFANODEDIR == undefined ) - { - var dirs = new Array(); - //var fs = this.fs; - var nwdir = this.networkdir; - this.fs.readdirSync( this.networkdir ).forEach( - function findnodedirs(f1) { - var name1 = [nwdir,f1].join('/'); - var fs = require('fs'); - if ( fs.statSync( name1 ).isDirectory() ) - { - fs.readdirSync( name1 ).forEach( - function lookforkeystores(f2) { - var name2 = [nwdir,f1,f2].join('/'); - if (f2 == "keystore" && fs.statSync( name2 ).isDirectory() ) - { - dirs.push( name1 ); - } - } - ) - } - } - ); - if ( dirs.length == 0 ) - return; - dirs.sort(); - process.env.BFANODEDIR = - this.nodedir = dirs[0]; - } - else - this.nodedir = process.env.BFANODEDIR; - this.netport = Number.parseInt( this.fs.readFileSync( this.nodedir + '/netport' ) ); - this.rpcport = Number.parseInt( this.fs.readFileSync( this.nodedir + '/rpcport' ) ); - } - - _account() - { - this._nodedir(); - if ( this.acct != undefined ) - return; - if ( process.env.BFANODEDIR == undefined ) - return; - var files = new Array(); - this.fs.readdirSync( process.env.BFANODEDIR + '/keystore' ).forEach( function(filename) { - if ( filename.includes('--') ) - files.push( filename ); - }); - // found none? - if ( files.length == 0 ) - return; - files.sort(); - this.account = '0x' + files[0].replace( /^.*--/, '' ); - } - - contract(w3, name) - { - this._networkdir(); - var contractdir = [ this.networkdir, 'contracts', name ].join('/'); - var contractaddress = this.fs.realpathSync( contractdir ).replace(/^.*\//, ''); - if ( contractaddress == undefined ) - return; - var abi = JSON.parse( - this.fs.readFileSync( contractdir + '/abi' ).toString() - ); - if ( abi == undefined ) - return; - var c = new w3.eth.Contract( abi, contractaddress ); - c.abi = abi; - c.contractaddress = contractaddress; - return c; - } - - newweb3() - { - this._nodedir(); - var provider = 'http://127.0.0.1:' + this.rpcport; - var w3 = new this.Web3( provider ); - w3.eth.extend({ - //property: 'bfaclique', - methods: [{ - name: 'getSigners', - call: 'clique_getSigners', - params: 0 - }] - }); - return w3; - } - isNumeric(n) { - return !isNaN(parseFloat(n)) && isFinite(n); - } - - isAddr(n) { - return n.length == 42 && n.substring(0,2) == "0x"; - } -} diff --git a/bin/libbfa.sh b/bin/libbfa.sh deleted file mode 100644 index f949c4943e649ec41a63e825c5a2503bb790a920..0000000000000000000000000000000000000000 --- a/bin/libbfa.sh +++ /dev/null @@ -1,343 +0,0 @@ -# This should only be sourced, not executed directly. -# 20180626 Robert Martin-Legene <robert@nic.ar> - -trap "echo Argh! ; exit 1" ERR -set -e -o errtrace - -function fatal() -{ - echo "$@" >&2 - exit 1 -} - -trap "fatal Argh!" ERR -test -n "$BASH_VERSION" || - fatal "This file must be source(d) from bash." -test "$( caller 2>/dev/null | awk '{print $1}' )" != "0" || - fatal "This file must be source(d), not executed." - -function stderr -{ - echo "$@" >&2 -} - -function cleanup -{ - if [ $# -gt 0 ] - then - trap cleanup EXIT - cleanup_files="${cleanup_files} $@" - return - fi - rm -rf $cleanup_files -} - -function geth_attach -{ - bfaconfig node -# local cat=cat -# if echo $- | grep -q x -# then -# cat="tee /dev/tty |" -# fi -# $cat | - geth --cache 0 "$@" attach ipc:${BFANODEDIR}/geth.ipc -} - -function geth_exec_file -{ - test -r "$1" - if echo $- | grep -q x && [ -t 1 ] - then - sed "s/^/input: /" "$1" - fi - geth_attach --exec "loadScript(\"$1\")" </dev/null -} - -function geth_exec -{ - test -n "$1" - geth_attach --exec "$1" </dev/null -} - -function geth_rpc -{ - bfaconfig node - local cmd=$1 - test -n "$cmd" - local params= - shift - if [ $# -gt 0 ] - then - params=',"params":[' - while [ $# -gt 0 ] - do - params="${params}${1}," - shift - done - # Eat the last command and add a ] - params=${params/%,/]} - fi - local json=$( - curl \ - -H 'Content-type: application/json' \ - -X POST \ - --data "{\"jsonrpc\":\"2.0\",\"method\":\"${cmd}\"${params},\"id\":1}" \ - http://127.0.0.1:$rpcport \ - 2>/dev/null - ) - test -n "$json" - if [ "$( echo "$json" | jq .error )" != "null" ] - then - echo "$json" | jq -r .error.message >&2 - false - fi - echo "$json" | jq .result -} - -function getnetworkid -{ - test -n "${BFANETWORKID}" && - return - local dir="${BFANETWORKDIR}" - for dir in $( ls -1d "${BFAHOME}"/* | sort --version-sort ) - do - if [ -d "${dir}" ] - then - local base=$( basename "${dir}" ) - base=$( echo "${base}" | grep -E '^network[0-9]+$' ) || true - if [ -n "${base:7}" ] - then - BFANETWORKID=${base:7} - return - fi - fi - done -} - -function networkdir -{ - test -n "${BFAHOME}" -a -d "${BFAHOME}" || - fatal "\$BFAHOME in your environment must point to a directory." - # If no BFANETWORKDIR variable has been set, we will try to guess - # the network directory based on the directory we are in. - if [ -z "${BFANETWORKDIR}" ] - then - BFANETWORKDIR=$( - ls -1d "${BFAHOME}"/* | - grep -qE '/network[0-9]+$' | - sort --version-sort | - head -1 - ) - fi - test -n "${BFANETWORKDIR}" -a ! -d "${BFANETWORKDIR}" && - fatal "\$BFANETWORKDIR (\"${BFANETWORKDIR}\") not found." - if [ -z "${BFANETWORKDIR}" -o ! -d "${BFANETWORKDIR}" ] - then - local num=0 - while [ $num -lt 9876 ] - do - num=$(( $RANDOM * $RANDOM )) - done - stderr "I can not find your BFANETWORKDIR." - stderr "Consider running: mkdir ${BFAHOME}/network${num} or set BFANETWORKDIR in ${BFAHOME}/bin/env" - exit 1 - fi - getnetworkid - gen_genesis -} - -function nodedir -{ - networkdir - # set defaults - if [ -z "$BFANODEDIR" ] - then - # If there is no nodedir found, use the first node we - # find in the networkdir - BFANODEDIR=$( - ls -1d "${BFANETWORKDIR}"/*/keystore 2>/dev/null | - sort --version-sort | - head -1 - ) - if [ -z "${BFANODEDIR}" ] - then - BFANODEDIR="${BFANETWORKDIR}/node1" - echo "No node directories found. Initialising a new node." - geth --datadir ${BFANODEDIR} init ${BFAHOME}/src/genesis.json - else - # Get rid of the "keystore" label - BFANODEDIR=$( dirname $BFANODEDIR ) - fi - fi - test -n "${BFANODEDIR}" || - fatal "Unable to guess \$BFANODEDIR . Consider setting it explicitly in ${BFAHOME}/bin/env" - test -d "${BFANODEDIR}" || - fatal "$BFANODEDIR is not a directory." - test -d "${BFANODEDIR}/geth/chaindata" || - fatal "Node is not initialised. Consider running: geth --datadir $BFANODEDIR init ${BFAHOME}/src/genesis.json" - # Support migrating from "former" setups - if [ -r "${BFANODEDIR}/port" -a ! -r "${BFANODEDIR}/netport" ] - then - mv "${BFANODEDIR}/port" "${BFANODEDIR}/netport" - fi - # - test -r "${BFANODEDIR}/netport" || - echo $(( $RANDOM / 2 + 12345 )) > ${BFANODEDIR}/netport - netport=$( cat ${BFANODEDIR}/netport ) - test $? = 0 - test -r "${BFANODEDIR}/rpcport" || - echo $(( $RANDOM / 2 + 12345 )) > ${BFANODEDIR}/rpcport - rpcport=$( cat ${BFANODEDIR}/rpcport ) -} - -function extradata -{ - account - # something uniqueish - ## find default interface - local def_if=$( ( ip -4 route show ; ip -6 route show ) | expand | sed -ne '/^default /{s/ */ /g;s/^.* dev //;s/ .*//;p;q}' ) - local mymac=$( ip link show ${def_if} | sed -ne '/link\|ether/{s/^.*link.ether //;s/ .*//;s/://g;p;q}' ) - # - echo -n "${account:0:19}.${mymac:0:12}" -} - -function account -{ - nodedir - if [ -z "$account" ] - then - test -d "${BFANODEDIR}/keystore" - account=$( - ls -1dl "${BFANODEDIR}"/keystore/*--* 2>/dev/null | - head -1 | - sed 's/.*--//' - ) - fi - if [ -z "$account" ] - then - echo "No accounts found. Creating a new one (they are free)." - geth --datadir ${BFANODEDIR} --password /dev/null account new - if [ -n "$loop_protection" ] - then - fatal "Loop detected." - fi - loop_protection=1 - account - fi - unset loop_protection -} - -function bfaconfig -{ - case "$1" in - network) - networkdir - ;; - node) - nodedir - ;; - account|max) - account - ;; - *) - fatal "Unknown bfaconfig request" - ;; - esac -} - -function prereq -{ - err=0 - while [ -n "$1" ] - do - if ! which $1 > /dev/null - then - echo "Need $1" - err=1 - fi - shift - done - test $err -eq 0 -} - -function gen_genesis -{ - local genesis="${BFAHOME}/src/genesis.json" - test -e "${genesis}" && - return - bfaconfig account - local zero4="0000" - local zero8="${zero4}${zero4}" - local zero16="${zero8}${zero8}" - local zero20="${zero16}${zero4}" - local zero32="${zero16}${zero16}" - local zero40="${zero20}${zero20}" - local zero60="${zero40}${zero20}" - local zero64="${zero32}${zero32}" - local zero128="${zero64}${zero64}" - local zero130="${zero128}00" - local nodes=$account - local timestamp=$( printf '0x%08x' $( date +%s ) ) - local vanity_Blockchain="426c6f636b636861696e" - local vanity_Federal="4665646572616c" - local vanity_Argentina="417267656e74696e61" - local vanity_NIC="4e4943" - local vanity="${vanity_Blockchain}20${vanity_Federal}20${vanity_Argentina}20${vanity_NIC}" - ## Make sure vanity is exactly 64 characters - vanity="${vanity}${zero64}" - vanity="${vanity:0:64}" - echo -n "$vanity" | grep -Evq '[^0-9a-fA-F]' - cat <<-EOCONF > ${genesis} - { - "config": { - "chainId": ${BFANETWORKID}, - "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 4, - "eip150Hash": "0x${zero64}", - "clique": { "period": 15, "epoch": 30000 } - }, - "nonce": "0x0000000000000000", - "timestamp": "${timestamp}", - "extraData": "0x${vanity}${account}${zero130}", - "gasUsed": "0x0", "gasLimit": "0xffeeddcc", "difficulty": "0x1", - "number": "0x0", - "mixHash": "0x${zero64}", - "coinbase": "0x${zero40}", - "parentHash": "0x${zero64}", - "alloc": { "${account}": { "balance": "0x200${zero60}" } } - } - EOCONF -} - -function contract -{ - bfaconfig network - local contract="${BFANETWORKDIR}/contracts/${1}" - local realdir=$( realpath "${contract}" ) - test -r "${realdir}" - local address=$( basename "${realdir}" ) - test -n "${address}" - abi=$( cat ${contract}/abi ) - test -n "${abi}" - echo "eth.contract(${abi}).at(\"${address}\")" -} - -function contractSendTx -{ - local name=$1 - local func=$2 - shift 2 - echo "var contract = $( contract "${name}" );" - local args= - for x in $* - do - args="${args}, ${x}" - done - args="${args:1}," - if [ "$args" = "," ] - then - args= - fi - echo "contract.${func}.sendTransaction(${args} {from: eth.accounts[0], gas: 1000000} )" -} - diff --git a/bin/log.sh b/bin/log.sh deleted file mode 100755 index 43e3068cb612fd3ac6e79ed0fe0e0030f0ac76b8..0000000000000000000000000000000000000000 --- a/bin/log.sh +++ /dev/null @@ -1,26 +0,0 @@ -#!/bin/bash - -trap "echo Argh; exit 1" ERR - -true ${MAXSIZE:=$((10*1024*1024))} - -log=$1 -test -n "$log" || - log=log - -exec >> "$log" -while read -do - echo "$REPLY" - size=$( stat -c '%s' "${log}" ) - if [ $size -ge $MAXSIZE ] - then - for gen in 8 7 6 5 4 3 2 1 - do - test -e "${log}.${gen}" && - mv -f "${log}.${gen}" "${log}.$(( ${gen} + 1 ))" - done - mv -f "${log}" "${log}.1" - exec >> "$log" - fi -done diff --git a/bin/maymine.sh b/bin/maymine.sh deleted file mode 100755 index 594455c6220e8b2eb7551334f33ab929fbbce830..0000000000000000000000000000000000000000 --- a/bin/maymine.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash -# Robert Martin-Legene <robert@nic.ar> - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -bfaconfig node -res=$( geth_exec_file "${BFAHOME}/src/maymine.js" ) - -if [ "$res" = "true" ] -then - touch ${BFANODEDIR}/miner -else - rm -f ${BFANODEDIR}/miner -fi diff --git a/bin/monitor.sh b/bin/monitor.sh deleted file mode 100755 index ab3f83f8221acd9c26d359ebb9690c80a3004d33..0000000000000000000000000000000000000000 --- a/bin/monitor.sh +++ /dev/null @@ -1,90 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -function json_query -{ - cmd=$1 - params=$2 - if [ -n "$params" ] - then - params=",\"parameters\":[$2]" - fi - json=$( - curl -s -H 'Content-type: application/json' -X POST --data "{\"jsonrpc\":\"2.0\",\"method\":\"${cmd}\"${params},\"id\":1}" http://127.0.0.1:$rpcport - ) -} - -function json_err -{ - echo "$json" | jq -r '.result' -} - -function json_arraylength -{ - jq -r length -} - -function json_result -{ - echo "$json" | jq -r '.result' -} - -bfaconfig node -json_query admin_peers -numpeers=$( json_result | json_arraylength ) -statusfile=$( mktemp ) -cleanup "${statusfile}" -chmod 644 "${statusfile}" -echo -n "time: " > ${statusfile} -date >> ${statusfile} -echo "total-peer-count: ${numpeers}" >> ${statusfile} -peercount=0 -for idx in $( seq 0 $(( $numpeers - 1 )) ) -do - eth=$( echo "$json" | jq -r .result[$idx].protocols.eth ) - if [ "$eth" = "handshake" ] - then - continue - fi - #echo -n "$idx: "; echo "$eth" | jq -c - remoteid=$( - echo "$json" | - jq -r .result[$idx].id - ) - remoteaddress=$( - echo "$json" | - jq -r .result[$idx].network.remoteAddress - ) - remoteip=$( - echo "$remoteaddress" | - sed 's/:[0-9][0-9]*$//' - ) - # IPv6 has the address surrounded by [ and ] - we strip that away - if [ "${remoteip:0:1}" = "[" -a "${remoteip:$((${#remoteip}-1))}" = "]" ] - then - remoteip="${remoteip:1:$((${#remoteip}-2))}" - fi - remoteport=$( - echo "$remoteaddress" | - sed 's/^.*://' - ) - echo "peer: enode://${remoteid}@[${remoteip}]:${remoteport}" >> $statusfile - mkdir -p "${BFANETWORKDIR}/lastseen/${remoteid}" - if [ -r "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}" ] - then - storedport=$( cat "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}" ) - test "${remoteport}" = "${storedport}" && - unset remoteport - fi - if [ -n "${remoteport}" ] - then - echo "${remoteport}" > "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}" - else - touch "${BFANETWORKDIR}/lastseen/${remoteid}/${remoteip}" - fi - peercount=$(( $peercount + 1 )) -done -echo "valid-peer-count: ${peercount}" >> $statusfile -mv -f $statusfile ${BFANETWORKDIR}/status diff --git a/bin/numpending.sh b/bin/numpending.sh deleted file mode 100755 index cd77368f44364e85c31ad97b613c7a9abcf0616f..0000000000000000000000000000000000000000 --- a/bin/numpending.sh +++ /dev/null @@ -1,27 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -echo txpool.status.pending | geth_attach | grep -Ev '^> $' | tail -1 -exit - - -function json_query -{ - cmd=$1 - params=$2 - if [ -n "$params" ] - then - params=",\"parameters\":[$2]" - fi - json=$( - curl -s -H 'Content-type: application/json' -X POST --data "{\"jsonrpc\":\"2.0\",\"method\":\"${cmd}\"${params},\"id\":1}" http://127.0.0.1:$rpcport - ) -} - -bfaconfig node -json_query web3j_txpool -echo $json | jq -exit - diff --git a/bin/rewind.sh b/bin/rewind.sh deleted file mode 100755 index 947eb3c15d0e0af89c9e28b2906dd51d55ba6a9b..0000000000000000000000000000000000000000 --- a/bin/rewind.sh +++ /dev/null @@ -1,6 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -geth_exec_file ${BFAHOME}/src/rewind.js diff --git a/bin/sealeradd.sh b/bin/sealeradd.sh deleted file mode 100755 index 938c75c1edd1405cfe124ed52c62d4bd37239379..0000000000000000000000000000000000000000 --- a/bin/sealeradd.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash -# Robert Martin-Legene <robert@nic.ar> - -# Proposes to promote a new sealer or to demote an existing sealer. -# Also sends this vote to the new Sealers contract, so we have a place -# a contract can look up which addresses are sealers. - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -operation="false" -if [ $( basename $0 ) == "sealeradd.sh" ] -then - operation="true" -fi -victim="$1" -( - echo "clique.propose(\"0x${victim#0x}\", ${operation});" - contractSendTx Sealers admin_promote \"0x${victim#0x}\" ${operation} -) | geth_attach diff --git a/bin/sealerrem.sh b/bin/sealerrem.sh deleted file mode 120000 index 9f238ec6fc1160bcb11d5db94c4a25a38c68c150..0000000000000000000000000000000000000000 --- a/bin/sealerrem.sh +++ /dev/null @@ -1 +0,0 @@ -sealeradd.sh \ No newline at end of file diff --git a/bin/sendether.sh b/bin/sendether.sh deleted file mode 100755 index eb147aeef8add216cc7bb9b5a7cf8acce333eeee..0000000000000000000000000000000000000000 --- a/bin/sendether.sh +++ /dev/null @@ -1,18 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -function usage -{ - fatal "Usage: $0 <dest-addr> <amount-of-ether>" -} - -test $# -eq 2 || usage - -rcpt=$1 -eth=$2 - -cat<<EOJS | geth_attach -eth.sendTransaction({from:eth.accounts[0], to: "${rcpt}", value: web3.toWei(${eth}, "ether")}) -EOJS diff --git a/bin/start.sh b/bin/start.sh deleted file mode 100755 index be39a51ee53e94b046def0d93a9cea23f062c2e0..0000000000000000000000000000000000000000 --- a/bin/start.sh +++ /dev/null @@ -1,89 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -bootnodeid=6c81b38551fec2f1142b58ed65137cc1b7dfdc7b35bc556ef26604c41e30fcdeb12212b3c19913584f71dc7bf87d76cd67fa523e96996c0f148390fb76fdc5f7 -bootnodev6=2800:40:1:6::135 -bootnodev4=200.68.65.135 -bootnodeport=5445 -bootnodes="enode://${bootnodeid}@[$bootnodev6]:${bootnodeport},enode://${bootnodeid}@[$bootnodev4]:${bootnodeport}" - -bfaconfig max - -function accountlist -{ - local accts= - for file in ${BFANODEDIR}/keystore/*--* - do - if [ -r "$file" ] - then - acct=$( echo $file | sed 's/^.*--//' ) - accts="${accts},${acct}" - fi - done - # strip first comma - echo "--password /dev/null --unlock ${accts:1}" -} - -# touch the "miner" file if you are authorized to mine -# If you don't want to restart after touching the file, -# you can use attach.sh and issue the command: -# miner.start() - -function getminer -{ - if [ -e "${BFANODEDIR}/miner" ] - then - echo "--mine" - fi -} - -function getsyncmode -{ - local syncmode=$( cat "${BFANODEDIR}/syncmode" 2>/dev/null || true ) - syncmode=${syncmode:-fast} - echo "--syncmode ${syncmode}" -} - - -# Start the miner. -( - flock --nonblock --exclusive 9 || exit 1 - if [ -t 1 ] - then - echo Logging everything to ${BFANODEDIR}/log - echo Consider running: tail -n 1000 -F ${BFANODEDIR}/log - fi - while : - do - echo - echo '***' - echo - # (re)configure parameters (you never know if they changed) - flexargs="$( accountlist) $( getminer ) $( getsyncmode ) --extradata $( extradata )" - set -x - geth \ - --datadir ${BFANODEDIR} \ - --networkid $BFANETWORKID \ - --bootnodes "${bootnodes}" \ - --rpc \ - --rpcport $rpcport \ - --rpcapi "eth,net,web3,admin,clique,miner,personal" \ - --port $netport \ - --nousb \ - --txpool.nolocals \ - --txpool.accountslots 128 \ - --txpool.globalslots 32768 \ - --txpool.accountqueue 512 \ - --txpool.globalqueue 8192 \ - --gcmode archive \ - --cache 512 \ - --verbosity 3 \ - ${flexargs} & - set +x - echo $! > ${BFANODEDIR}/geth.pid - wait - sleep 60 - done 2>&1 | ${BFAHOME}/bin/log.sh ${BFANODEDIR}/log & -) 9>> ${BFANODEDIR}/geth.pid diff --git a/bin/syncmode.sh b/bin/syncmode.sh deleted file mode 100755 index 009d260899f968f030e86c503a46ec7bc4c8d9bf..0000000000000000000000000000000000000000 --- a/bin/syncmode.sh +++ /dev/null @@ -1,82 +0,0 @@ -#!/bin/bash -# Robert Martin-Legene <robert@nic.ar> - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -defaultmode="fast" - -echo "Available synchronization modes:" -echo " full : verify all blocks and all transactions since genesis (most secure)" -echo " fast : verify all blocks but not all transactions (faster than full, but less certain)" -echo " light: Makes this node into a light node which downloads almost" -echo " nothing, but relies on fast and full nodes in the network" -echo " to answer it's requests. This is the fastest and uses least" -echo " local resources, but outsources all trust to another node." -echo "Default mode is fast, because for many, it is a healthy compromise" -echo "between speed and paranoia. You can change the setting, according to" -echo "your needs." - -function modefilter -{ - case "$mode" in - "full"|"fast"|"light") - ;; - *) - echo "Unsupported mode." - mode="" - return - ;; - esac - true -} - -bfaconfig node -mode=$( cat ${BFANODEDIR}/syncmode 2>/dev/null || true ) -mode=${mode:-${defaultmode}} -orgmode=$mode -modefilter -echo "Your current mode is set to ${mode}" -killed=0 -mode= - -echo -while [ -z "${mode}" ] -do - read -p "Which mode do you wish? : " mode - modefilter -done -echo $mode > ${BFANODEDIR}/syncmode -if [ "$orgmode" = "fast" -a "$mode" = "full" ] -then - echo "You increased your paranoia level. The proper thing to do now," - echo "would be to delete your version of what you synchronized with" - echo "fast mode, and revalidate everything in the entire blockchain." - echo "This probably takes quite a long time and also requires downloading" - echo "all blocks from the entire blockchain again." - REPLY= - while [ "$REPLY" != "y" -a "$REPLY" != "n" ] - do - read -p "Do you wish to delete all downloaded blocks and resynchronize? [yn]: " - REPLY=${REPLY,,} - done - if [ "$REPLY" = "y" ] - then - if [ -r "${BFANODEDIR}/geth.pid" ] - then - local pid=$( cat ${BFANODEDIR}/geth.pid ) - kill -0 $pid 2>/dev/null && - echo "Killing running geth." && - killed=1 - while ! kill $pid 2>/dev/null - do - sleep 1 - done - fi - rm -fr ${BFANODEDIR}/geth/chainstate ${BFANODEDIR}/geth/lightchainstate - geth --cache 0 --datadir ${BFANODEDIR} init ${BFAHOME}/src/genesis.json - test $killed -eq 1 && - echo && - echo "The startup.sh should restart your geth shortly." - fi -fi diff --git a/bin/transactors.pl b/bin/transactors.pl deleted file mode 100755 index d5018b0a1aa1db91e731d40400da6583f0ebc233..0000000000000000000000000000000000000000 --- a/bin/transactors.pl +++ /dev/null @@ -1,262 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use warnings; -use IO::File; -use Math::BigInt; -use Carp; -$Carp::Verbose = 1; - -die "\$BFAHOME not set. Did you source bfa/bin/env ?\n" - unless exists $ENV{BFAHOME}; -chdir "$ENV{BFAHOME}" or die $!; - -package tools; -my $rpcport; -my $ua = LWP::UserAgent->new; - -sub new -{ - my $class = shift; - return bless {@_}, ref $class || $class; -} - -sub wait -{ - my $i = ++$_[0]->{'wait'}; - printf "%s%c[D", substr('|/-\\', $i%4, 1), 27; - sleep 1; -} - -sub cat($) -{ - my ($filename) = @_; - my $fh = IO::File->new($filename) or return; - return join('', $fh->getlines); -} - -sub hex2string($) -{ - my ($msg)=@_; - my $txt = ''; - while ($msg ne '') - { - my $i=hex( substr($msg,0,2) ); - my $c='.'; - $c=chr($i) if $i >= 32 and $i <= 127; - $txt .= $c; - $msg=substr $msg, 2; - } - return $txt; -} - -sub rpcreq -{ - my ( $opname, @params ) = @_; - if ( not defined $rpcport ) - { - $rpcport = tools::cat "$ENV{BFAHOME}/network5445/node1/rpcport" or die; - } - my $req = HTTP::Request->new( POST => "http://127.0.0.1:$rpcport" ); - $req->content_type('application/json'); - my $extra = scalar @params - ? sprintf(qq(,\"params\":[%s]), join(',', @params)) - : ''; - $req->content( qq({"jsonrpc":"2.0","method":"${opname}"${extra},"id":1})); - my $res = $ua->request($req); - die $res->status_line - unless $res->is_success; - return $res->content; -} - -package balance; -use JSON; - -sub new -{ - my ($class, $acct, $at) = @_; - my $self = bless {}, ref $class || $class; - $self->get( $acct, $at ) if defined $acct; - return $self; -} - -sub acct -{ - my ($self, $acct) = @_; - if ( defined $acct ) - { - $acct = '0x'.$acct if $acct !~ /^0x/; - $self->{'_acct'} = $acct; - } - return unless exists $self->{'_acct'}; - return $self->{'_acct'}; -} - -sub at -{ - my ($self, $at) = @_; - $self->{'_at'} = $at if defined $at; - return sprintf('0x%x', $self->{'_at'}) if exists $self->{'_at'}; - return 'latest'; -} - -sub get -{ - my ($self, $acct, $at) = @_; - $self->acct($acct) if defined $acct; - $self->at($at) if defined $at; - my @params = ( sprintf(qq("%s","%s"),$self->acct,$self->at) ); - my $content = tools::rpcreq( 'eth_getBalance', @params ); - my $json; - eval { $json = decode_json( $content ) }; - my $error = error->new( $content ); - if ( $error ) - { - my $msg = ''; - return 'NOTFOUND' if $error->message =~ /^missing trie node /; - die join(' * ', @params, $content); - return; - } - die if not exists $json->{'result'}; - die if not defined $json->{'result'}; - return Math::BigInt->from_hex( $json->{'result'} ); -} - - -package error; -use JSON; - -sub new -{ - my ($class, $json_in) = @_; - my $json; - eval { $json = decode_json( $json_in ) }; - return unless defined $json; - return unless exists $json->{'error'}; - my $self = bless { - '_code' => undef, - '_message' => undef, - }, ref $class || $class; - $self->code( $json->{'error'}->{'code'} ) if exists $json->{'error'}->{'code'}; - $self->message( $json->{'error'}->{'message'} ) if exists $json->{'error'}->{'message'}; - return $self; -} - -sub code -{ - my ( $self, $val ) = @_; - $self->{'_code'} = $val if scalar @_ > 1; - return $self->{'_code'}; -} - -sub message -{ - my ( $self, $val ) = @_; - $self->{'_message'} = $val if scalar @_ > 1; - return $self->{'_message'}; -} - -package block; -use LWP; -use JSON; - -sub new -{ - my ( $class, $json_raw ) = @_; - return unless defined $json_raw; - return if $json_raw eq ''; - my $self = bless {}, ref $class || $class; - $self->{'json_raw'} = $json_raw; - eval { $self->{'json'} = decode_json( $json_raw ) }; - return if $@; - $self->error( error->new($json_raw) ); - return $self; -} - -sub error -{ - return if not exists $_[0]->{'error'}; - return $_[0]->{'error'}; -} - - -sub json -{ - return unless exists $_[0]->{'json'}; - return $_[0]->{'json'}; -} - -sub result -{ - return unless exists $_[0]->{'json'}->{'result'}; - return $_[0]->{'json'}->{'result'}; -} - -sub number -{ - return if not exists $_[0]->result->{'number'}; - return hex( $_[0]->result->{'number'} ); -} - -sub timestamp -{ - return if not exists $_[0]->result->{'timestamp'}; - return hex( $_[0]->result->{'timestamp'} ); -} - -sub miner -{ - return if not exists $_[0]->result->{'miner'}; - return $_[0]->result->{'miner'}; -} - -sub get($;$) -{ - my ($number) = @_; - $number = sprintf('0x%x', $number) if $number ne 'earliest'; - my $cachefile = "cache/block.$number"; - my $content = tools::rpcreq( 'eth_getBlockByNumber', qq("$number"), "true"); - my $block = block->new( $content ); - return if not defined $block; - return if not exists $block->{'json'}; - die $block->error->message - if $block->error; - return if not $block->result; - return $block; -} - -sub tx { - my ($self) = @_; - return $self->result->{'transactions'}; -} - -package main; - -my $number = shift || 'earliest'; -my $_rcpts; - -sub rcpt -{ - return 0 if exists $_rcpts->{$_[0]}; - $_rcpts->{$_[0]} = 1; - return 1; -} - -while ( 1 ) -{ - my $block = block::get($number); - exit 0 if not defined $block; -use Data::Dumper; print Dumper( $block->result ); -die $block->miner; - rcpt( $block->miner ); - my $txref = $block->tx; - for my $tx (@$txref) - { - my $from = $tx->{'from'}; - my $to = $tx->{'to'}; - my $value = $tx->{'value'}; - next if $value eq '0x0'; - printf "%s\n", $to if rcpt( $to ); - } - $number = $block->number + 1; -} diff --git a/bin/tsa-insert.sh b/bin/tsa-insert.sh deleted file mode 100755 index 1509e6d23d20aa04fae6bb23b086e9b15f6be112..0000000000000000000000000000000000000000 --- a/bin/tsa-insert.sh +++ /dev/null @@ -1,46 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -contract="TimeStampAuthority" -contract=${BFANETWORKDIR}/contracts/${contract} -contract=$( realpath "${contract}" ) -test -r "${contract}" -basecontract=$( basename "${contract}" ) -test -n "${basecontract}" -abi=$( cat ${BFANETWORKDIR}/contracts/${basecontract}/abi ) -test -n "${abi}" -hashes= -while read -p : -do - sum=$( echo -n "$REPLY" | sha256sum | cut -c -64 ) - echo $sum - hashes="$hashes,web3.toDecimal(\"0x$sum\")" -done -hashes="${hashes:1}" -echo $hashes -js=$( mktemp ) -cleanup "$js" -cat > $js <<EOT -var mycontract = eth.contract(${abi}) -var thecontract = mycontract.at("${basecontract}") -console.log( thecontract.put.sendTransaction( [${hashes}], {from: eth.accounts[0], gas: 1000000} ) ) -EOT -out=$( mktemp ) -cleanup "$out" -geth_exec_file "${js}" > ${out} -if [ ` wc -l < ${out} ` = 2 -a ` tail -1 < ${out} ` = "true" ] -then - trans=` head -1 < ${out} ` - echo "Sent checksum(s) in transaction ${trans}." -else - ( - cat ${js} - echo - echo ' ***' - echo - cat ${out} - ) >&2 - exit 1 -fi diff --git a/bin/tsa-verify.sh b/bin/tsa-verify.sh deleted file mode 100755 index c2a055d51e67b879f3d9b5ab781d70683ba0304d..0000000000000000000000000000000000000000 --- a/bin/tsa-verify.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -contract="TimeStampAuthority" -contract=${BFANETWORKDIR}/contracts/${contract} -contract=$( realpath "${contract}" ) -test -r "${contract}" -basecontract=$( basename "${contract}" ) -test -n "${basecontract}" -abi=$( cat ${BFANETWORKDIR}/contracts/${basecontract}/abi ) -test -n "${abi}" -hashes= -sum=$( echo -n "$1" | sha256sum | cut -c -64 ) -echo $sum -hashes="web3.toDecimal(\"0x$sum\")" -echo $hashes -js=$( mktemp ) -cleanup "$js" -cat > $js <<EOT -var mycontract = eth.contract(${abi}) -var thecontract = mycontract.at("${basecontract}") -console.log( thecontract.get.call( [${hashes}], {from: eth.accounts[0], gas: 1000000} ) ) -EOT -out=$( mktemp ) -cleanup "$out" -geth_exec_file "${js}" > ${out} -if [ ` wc -l < ${out} ` = 2 -a ` tail -1 < ${out} ` = "true" ] -then - block=` head -1 < $out ` - if [ "${block}" -gt "0" ] - then - echo "Checksum first seen in block ${block}" - else - echo "The checksum has not been stored in the smart contract yet." - exit 1 - fi -else - ( - cat ${js} - echo - echo ' ***' - echo - cat ${out} - ) >&2 -fi diff --git a/bin/txflood.sh b/bin/txflood.sh deleted file mode 100755 index 1d20bbde2ce66a82153c4194a86f6ca80db75979..0000000000000000000000000000000000000000 --- a/bin/txflood.sh +++ /dev/null @@ -1,31 +0,0 @@ -#!/bin/bash - -if [ -z "${BFAHOME}" ]; then echo "\$BFAHOME not set. Did you source bfa/bin/env ?" >&2; exit 1; fi -source ${BFAHOME}/bin/libbfa.sh || exit 1 - -cd $BFAHOME - -while : -do - while num=` $BFAHOME/bin/numpending.sh `; [ $num -lt 2500 ] - do - contract=$( readlink ${BFANETWORKDIR}/contracts/TimestampDocument ) - abi=$( cat ${BFANETWORKDIR}/contracts/${contract}/abi ) - ( - echo "var mycontract = eth.contract(JSON.parse($abi));" - echo "var thecontract = mycontract.at(\"$contract\");" - n=0 - SECONDS=0 - while [ $n -lt 10000 -a $SECONDS -lt 600 ] - do - n=$(( $n + 1 )) - echo "thecontract.storeDocument.sendTransaction( \"dagenidag.${n}\", {from: eth.accounts[0], gas: 1000000});" - done - ) | - geth_attach - - done - echo `date`: $num pending. - sleep 2 -done - diff --git a/bin/walker.pl b/bin/walker.pl deleted file mode 100755 index 038369fdf55d3385c9e287f385a137f09c4180ed..0000000000000000000000000000000000000000 --- a/bin/walker.pl +++ /dev/null @@ -1,433 +0,0 @@ -#!/usr/bin/perl -w - -use strict; -use warnings; -use IO::File; -use Math::BigInt; -use Carp; -$Carp::Verbose = 1; - -die "\$BFAHOME not set. Did you source bfa/bin/env ?\n" - unless exists $ENV{BFAHOME}; -chdir "$ENV{BFAHOME}" or die $!; - -package tools; -my $rpcport; -my $ua = LWP::UserAgent->new; -our $CSI = "\x1b["; -our $clearEOS = "${CSI}J"; -our $up = "${CSI}A"; -our $red = "${CSI}41m"; -our $normal = "${CSI}m"; - -sub new -{ - my $class = shift; - return bless {@_}, ref $class || $class; -} - -sub wait -{ - my $i = ++$_[0]->{'wait'}; - printf "%s%c[D", substr('|/-\\', $i%4, 1), 27; - sleep 1; -} - -sub cat($) -{ - my ($filename) = @_; - my $fh = IO::File->new($filename) or return; - return join('', $fh->getlines); -} - -sub gmt -{ - my $ts = shift; - return unless defined $ts; - my @t = gmtime($ts); - $t[5]+=1900; - $t[4]++; - return sprintf('%04d%02d%02d-%02d%02d%02d', (@t)[5,4,3,2,1,0]); -} - -sub hex2string($) -{ - my ($msg)=@_; - my $txt = ''; - while ($msg ne '') - { - my $i=hex( substr($msg,0,2) ); - my $c='.'; - $c=chr($i) if $i >= 32 and $i <= 127; - $txt .= $c; - $msg=substr $msg, 2; - } - return $txt; -} - -sub rpcreq -{ - my ( $opname, @params ) = @_; - if ( not defined $rpcport ) - { - $rpcport = tools::cat "$ENV{BFAHOME}/network5445/node1/rpcport" or die; - } - my $req = HTTP::Request->new( POST => "http://127.0.0.1:$rpcport" ); - $req->content_type('application/json'); - my $extra = scalar @params - ? sprintf(qq(,\"params\":[%s]), join(',', @params)) - : ''; - $req->content( qq({"jsonrpc":"2.0","method":"${opname}"${extra},"id":1})); - my $res = $ua->request($req); - die $res->status_line - unless $res->is_success; - return $res->content; -} - -package balance; -use JSON; - -sub new -{ - my ($class, $acct, $at) = @_; - my $self = bless {}, ref $class || $class; - $self->get( $acct, $at ) if defined $acct; - return $self; -} - -sub acct -{ - my ($self, $acct) = @_; - if ( defined $acct ) - { - $acct = '0x'.$acct if $acct !~ /^0x/; - $self->{'_acct'} = $acct; - } - return unless exists $self->{'_acct'}; - return $self->{'_acct'}; -} - -sub at -{ - my ($self, $at) = @_; - $self->{'_at'} = $at if defined $at; - return sprintf('0x%x', $self->{'_at'}) if exists $self->{'_at'}; - return 'latest'; -} - -sub get -{ - my ($self, $acct, $at) = @_; - $self->acct($acct) if defined $acct; - $self->at($at) if defined $at; - my @params = ( sprintf(qq("%s","%s"),$self->acct,$self->at) ); - my $content = tools::rpcreq( 'eth_getBalance', @params ); - my $json; - eval { $json = decode_json( $content ) }; - my $error = error->new( $content ); - if ( $error ) - { - my $msg = ''; - return 'NOTFOUND' if $error->message =~ /^missing trie node /; - die join(' * ', @params, $content); - return; - } - die if not exists $json->{'result'}; - die if not defined $json->{'result'}; - return Math::BigInt->from_hex( $json->{'result'} ); -} - -package error; -use JSON; - -sub new -{ - my ($class, $json_in) = @_; - my $json; - eval { $json = decode_json( $json_in ) }; - return unless defined $json; - return unless exists $json->{'error'}; - my $self = bless { - '_code' => undef, - '_message' => undef, - }, ref $class || $class; - $self->code( $json->{'error'}->{'code'} ) if exists $json->{'error'}->{'code'}; - $self->message( $json->{'error'}->{'message'} ) if exists $json->{'error'}->{'message'}; - return $self; -} - -sub code -{ - my ( $self, $val ) = @_; - $self->{'_code'} = $val if scalar @_ > 1; - return $self->{'_code'}; -} - -sub message -{ - my ( $self, $val ) = @_; - $self->{'_message'} = $val if scalar @_ > 1; - return $self->{'_message'}; -} - -package block; -use LWP; -use JSON; - -sub new -{ - my ( $class, $json_raw ) = @_; - return unless defined $json_raw; - return if $json_raw eq ''; - my $self = bless {}, ref $class || $class; - $self->{'json_raw'} = $json_raw; - eval { $self->{'json'} = decode_json( $json_raw ) }; - return if $@; - $self->error( error->new($json_raw) ); - return $self; -} - -sub error -{ - return if not exists $_[0]->{'error'}; - return $_[0]->{'error'}; -} - - -sub json -{ - return unless exists $_[0]->{'json'}; - return $_[0]->{'json'}; -} - -sub result -{ - return unless exists $_[0]->{'json'}->{'result'}; - return $_[0]->{'json'}->{'result'}; -} - -sub number -{ - return if not exists $_[0]->result->{'number'}; - return hex( $_[0]->result->{'number'} ); -} - -sub td -{ - return if not exists $_[0]->result->{'totalDifficulty'}; - return hex( $_[0]->result->{'totalDifficulty'} ); -} - -sub timestamp -{ - return if not exists $_[0]->result->{'timestamp'}; - return hex( $_[0]->result->{'timestamp'} ); -} - -sub gasLimit -{ - return if not exists $_[0]->result->{'gasLimit'}; - return hex( $_[0]->result->{'gasLimit'} ); -} - -sub miner -{ - return if not exists $_[0]->result->{'miner'}; - return $_[0]->result->{'miner'}; -} - -sub nonce -{ - return if not exists $_[0]->result->{'nonce'}; - return lc $_[0]->result->{'nonce'}; -} - -sub hash -{ - return if not exists $_[0]->result->{'hash'}; - return lc $_[0]->result->{'hash'}; -} - -sub parentHash -{ - return if not exists $_[0]->result->{'parentHash'}; - return lc $_[0]->result->{'parentHash'}; -} - -sub extradata -{ - return if not exists $_[0]->result->{'extraData'}; - my $t = $_[0]->result->{'extraData'}; - return substr($t,2) if substr($t,0,2) eq '0x'; - return lc $t; -} - -sub sealers -{ - my $t = $_[0]->extradata; - return unless defined $t; - $t = substr $t,64; - $t = substr $t,0,-130; - my @a; - while ( length $t >= 40 ) - { - push @a, substr($t, 0, 40); - $t = substr $t, 40; - } - return @a; -} - -sub vanity -{ - my $t = $_[0]->extradata; - return unless defined $t; - return substr($t,0,64); -} - -sub clear -{ - my $t = shift; - return unless defined $t; - return substr($t,2) if substr($t,0,2) eq '0x'; - return $t; -} - -sub signature -{ - my ($self) = @_; - my $t = $self->extradata; - return unless defined $t; - return substr($t, -130); - my $res = $self->result; - die unless defined $res; -use Data::Dumper; -die Dumper($res). - clear($res->{'parentHash'}). - clear($res->{'sha3Uncles'}). - clear($res->{'miner'}). - clear($res->{'stateRoot'}). - clear($res->{'transactionsRoot'}). - clear($res->{'receiptsRoot'}). - clear($res->{'logsBloom'}). - clear($res->{'difficulty'}). - clear($res->{'number'}). - clear($res->{'gasLimit'}). - clear($res->{'gasUsed'}). - clear($res->{'timestamp'}). - substr( clear($res->{'extraData'}), 0, -130 ). ('0' x 130). - clear($res->{'mixHash'}). - clear($self->{'nonce'}); -} - -sub get($;$) -{ - my ($number) = @_; - $number = sprintf('0x%x', $number) if $number ne 'earliest'; - my $cachefile = "cache/block.$number"; - my $block; - if ( -r $cachefile ) - { - $block = block->new( tools::cat $cachefile ); - return $block - if defined $block and not $block->error; - # We delete the cache file if we couldn't use the data in it. - unlink $cachefile; - # and then we continue to fetch it - } - my $content = tools::rpcreq( 'eth_getBlockByNumber', qq("$number"), "false"); - $block = block->new( $content ); - return if not defined $block; - return if not exists $block->{'json'}; - die $block->error->message - if $block->error; - return if not $block->result; - my $fh = IO::File->new( $cachefile, 'w' ) - or die $!; - $fh->print( $block->{'json_raw'} ); - $fh->close; - return $block; -} - -sub delete_cache -{ - my ($self) = @_; - unlink sprintf('cache/block.0x%x', $self->number); -} - -sub print -{ - print scalar($_[0]->sprint),"\n"; -} - -my $nonce_xlate = { - '0x0000000000000000' => 'SEALER_REM', - '0xffffffffffffffff' => 'SEALER_ADD', -}; - -sub sprint -{ - my ( $self ) = @_; - my $txt = ''; - my $lines = 1; - my @sealers = $self->sealers; - if ( @sealers ) - { - $txt = sprintf "\r${tools::clearEOS}"; - $txt = ''; - for my $sealer ( @sealers ) - { - $txt.= sprintf - "Confirming signer at epoch: 0x%s with an ETH balance of %s\n", - $sealer, - balance->new->get($sealer, $self->number); - $lines++; - } - } - $txt .= sprintf - '%s block:%s gaslimit:%s td:%d Vanity: %s', - tools::gmt($self->timestamp), - $self->number, - $self->gasLimit, - $self->td, - tools::hex2string($self->vanity); - if ( $self->miner !~ /^0x0{40}$/o ) - { - # we have auth or drop - my $nonce = $self->nonce; - $nonce = $nonce_xlate->{$nonce} if exists $nonce_xlate->{$nonce}; - $txt .= sprintf " %s %s", $nonce, $self->miner; - } - return wantarray ? ($txt, $lines) : $txt; -} - -package main; - -$| = 1; -mkdir 'cache'; -my $number = shift || tools::cat 'walker.block.last' || 'earliest'; -my $tools = tools->new; -my @blks; -my $parent; - -while ( 1 ) -{ - my $block = block::get($number); - if ( not defined $block ) - { - $tools->wait(); - next; - } - $parent = block::get($block->number-1) if not defined $parent and $block->number > 1; - if ( defined $parent and $parent->hash ne $block->parentHash ) - { - printf "\r${tools::red}%s${tools::normal}\n", scalar($parent->sprint); - ($parent, $block, $number) = (undef, $parent, $number-1); - $block->delete_cache; - next; - } - shift @blks while scalar @blks > 32; - push @blks, $block; - $block->print; - $number = $block->number + 1; - $parent = $block; -} diff --git a/doc/compiling-geth-on-debian.md b/doc/compiling-geth-on-debian.md deleted file mode 100644 index f55b6d07cf076d0c7eee1734f7312b1cc67b740f..0000000000000000000000000000000000000000 --- a/doc/compiling-geth-on-debian.md +++ /dev/null @@ -1,34 +0,0 @@ -# Compiling geth on Debian - -## Prerequisites - -1. `mkdir ~/new ~/bin` -2. `cd ~/new` -3. `sudo apt install build-essential git libjson-perl` -4. `git clone https://github.com/ethereum/go-ethereum` - -## Compiling Go itself (takes less than 5 minutes) - -Go is only needed for compiling geth - afterwards we can delete it - -1. Download __go*.linux-amd64.tar.gz__ from [https://golang.org/dl/] e.g. [https://dl.google.com/go/go1.11.linux-amd64.tar.gz] -2. `tar -xzf go*.tar.gz` -3. `export PATH=${HOME}/new/go/bin:${PATH}:${HOME}/bin` -4. `cd go-ethereum` -5. `make geth` -6. `cp build/bin/geth ~/bin/` -7. `cd ..` -8. `rm -r ~/new/go` - -## Compililng Solc takes a while (like 20-50 times longer than compiling geth) - -If you wish to compile contracts too, compile Solidity as well. - -$ `git clone --recursive https://github.com/ethereum/solidity` -$ `cd solidity` -$ `git submodule update --init --recursive` -$ `./scripts/install_deps.sh` -$ `mkdir build` -$ `cd build` -$ `cmake .. && make` -$ `cp -p solc/solc ~/bin/` diff --git a/doc/installing-geth-on-ubuntu.md b/doc/installing-geth-on-ubuntu.md deleted file mode 100644 index 050ae22d7f7221165fe516e291bcd2e0d6b0b157..0000000000000000000000000000000000000000 --- a/doc/installing-geth-on-ubuntu.md +++ /dev/null @@ -1,5 +0,0 @@ -$ `su` -# `apt install software-properties-common libjson-perl` -# `add-apt-repository -y ppa:ethereum/ethereum` -# `apt update` -# `apt install ethereum` diff --git a/doc/whoiswho.txt b/doc/whoiswho.txt deleted file mode 100644 index 4be4a0d426ef50fc395a05a4e027e87b47ce6650..0000000000000000000000000000000000000000 --- a/doc/whoiswho.txt +++ /dev/null @@ -1,25 +0,0 @@ -NIC1 bfa@bc.duna.com.ar -Sealer 0x2fd693d1204907ae7d97b5d7d2e93ef877ef2c7d -enode://6c81b38551fec2f1142b58ed65137cc1b7dfdc7b35bc556ef26604c41e30fcdeb12212b3c19913584f71dc7bf87d76cd67fa523e96996c0f148390fb76fdc5f7@[200.68.65.135]:5445 -enode://6c81b38551fec2f1142b58ed65137cc1b7dfdc7b35bc556ef26604c41e30fcdeb12212b3c19913584f71dc7bf87d76cd67fa523e96996c0f148390fb76fdc5f7@[2800:40:1:6::135]:5445 - -CABASE1 apugawko@ -Sealer 0xf2d954738d49ff0fca43c7b3915e8499c983c5de -enode://d088f3e97e1b3d41eebe3d9596b61ed05c79a0a3d6496fe63f916a955e30b456dbd96b875ca160adea81c4341bb3049ad4c831f767d8bf948d96a48b51e97c71@[200.9.157.216]:23236 - -NIC2 robert@cloud.duna.com.ar -Sealer 0xbeebad827a9664d6be5be0f9393dd158826833c6 -enode://1a1abca46cf2f7dd1721c48df699c5b1af507c7953b8a52c353c718dbda06df43fc3e5bf43665a07dfb8be0f40f5f94c8b8224b2bd124639c89897d8774479be@[190.210.214.194]:21296 - -NIC3 Mariano Absatz -Sealer 0x95368af92200d72ae698466f44f9f4b34a7abb2f -enode://2076aec363e2429600b1629875841cf00a41c155b6fc8bfe5a525beb85cbff79712a6746b37969de74e4f6afe669e8fe512af50d0c47d40d8902647cb3f22c96@[50.116.48.41]:18844 - -DGSI -Sealer 0xa9cac6c2ef4909a05ef24a12ecadf9e541b5995f -enode://71d9972d30952db3e757954ce4e1c746a9f84b2d217e7378c1b8a1f48fb22b8960eb48e9be10a75df0968535f1916726c28869784d7ca110aa24bacd7a16c4ac@[200.108.145.9]:50310 - -RIU Luciano Minuchin -Sealer 0x737ce178ce5c97248a9a8794a78f30dce1d091ff -enode://015ab9ad905e84f3c943bb2ecded64ded00ac150ae06ff911f3fb9e76674b70fbc26ad6f9938194f7e4c607b4f8067f018d9c917250ad6e0a1e85366fea85fb8@[179.201.44.197]:28045 -enode://015ab9ad905e84f3c943bb2ecded64ded00ac150ae06ff911f3fb9e76674b70fbc26ad6f9938194f7e4c607b4f8067f018d9c917250ad6e0a1e85366fea85fb8@[2800:110:44:6120:b49a:3fff:fe74:5499]:28045 diff --git a/src/Distillery.sol b/src/Distillery.sol deleted file mode 100644 index f37872381de25cacc93dca148483c6a71138234f..0000000000000000000000000000000000000000 --- a/src/Distillery.sol +++ /dev/null @@ -1,142 +0,0 @@ -// vim:filetype=javascript -pragma solidity ^0.4.24; - -contract Distillery { - address owner; - struct Allowances { - address beneficiary; - uint topuplimit; - } - Allowances[] thelist; - // We use distpos to remember where we were stopped processing last time - // we were called. The idea is, that if we have too many accounts to take - // care of, and too little gasleft, then we stop before we run out of - // gas, since that would undo all the transactions we had already handled. - // Also, we don't want to favour anyone in particular in the list, such - // that some would have first priority in getting ether at every invocation - // So we continue checking the list from the same place where we left off - // at the previous invocation of distribute() - uint distpos; - - event distributeStartedBy( address activator ); - event setAllowance( address subject, uint amount ); - event xfrAllowance( address subject, uint amount ); - - constructor() public payable { - owner = msg.sender; - } - modifier onlyOwner { - require( msg.sender == owner ); - _; - } - // Using this function, you can find out how long thelist is. - function numberOfBeneficiaries() public view returns ( uint ) { - return thelist.length; - } - // Using this function, you get the address and topuplimit at a given position in thelist. - function atPosition( uint idx ) public view returns ( address, uint ) { - require( idx <= thelist.length, "There are not that many addresses in the list." ); - return (thelist[idx].beneficiary,thelist[idx].topuplimit); - } - // Returns a position +1 of where an address can be found in thelist. - // Or returns 0 if the address is not found in thelist. - // 0 : not found - // 1 : first position - function _beneficiaryPosition( address beneficiary ) internal view returns ( uint ) { - uint pos = thelist.length; - while ( pos-- > 0 ) - if ( beneficiary == thelist[pos].beneficiary ) - return pos+1; - return 0; - } - // This function returns the "allowance" that a given address is set to. - // Using this function, you don't have to cycle through atPosition() until - // you find the address you want to know about. - function getEtherAllowance( address beneficiary ) public view returns (uint256) { - uint pos = _beneficiaryPosition( beneficiary ); - if ( pos == 0 ) - return 0; - return thelist[pos-1].topuplimit; - } - // This admin (ownerOnly) function allows the creator of the contract to - // add/change/delete "allowances" per address. - function setEtherAllowance( address beneficiary, uint256 topuplimit ) public onlyOwner { - uint pos = _beneficiaryPosition( beneficiary ); - // Not found and trying to delete beneficiary? Just return immediately. - if ( pos == 0 && topuplimit == 0 ) - return; - emit setAllowance( beneficiary, topuplimit ); - // not found - if ( pos == 0 ) - { - if ( topuplimit > 0 ) - // Add the address to thelist because it was not already there - thelist.push( Allowances(beneficiary,topuplimit) ); - return; - } - // Now use a properly zero-indexed pos - pos--; - // - if ( topuplimit > 0 ) { - // Simple update the topuplimit of this address - thelist[pos].topuplimit = topuplimit; - return; - } - // The beneficiary is set to have 0 Ether, so we - // delete the beneficiary from the list - uint i = pos; - while ( i++ < thelist.length ) - thelist[i-1] = thelist[i]; - // Shorten the list - thelist.length--; - // If distpos was past the position that we removed, - // then move that back one. - if ( distpos >= pos ) - distpos--; - } - function selfDestruct() public onlyOwner { - selfdestruct( owner ); - } - function mayDistribute() public view returns ( bool ) - { - return msg.sender == owner; - } - function distribute() external { - require( mayDistribute(), "You are not authorized to activate the distribution functionality." ); - emit distributeStartedBy( msg.sender ); - // Is there anything to do at all - uint listlength = thelist.length; - if ( listlength == 0 ) - return; - // Has the list gotten shorter since we we were last time? - // This shouldn't happen, but it's better to be safe than to be sorry. - if ( distpos >= listlength ) - distpos = 0; - uint wheretostop = distpos; - while ( gasleft() > 54321 ) { - // Did we get to the end of the list, then start over - if ( ++distpos >= listlength ) - distpos = 0; - uint blockchainbalance = thelist[distpos].beneficiary.balance; - uint topuplimit = thelist[distpos].topuplimit; - uint diff = topuplimit - blockchainbalance; - // Don't top up anyone, if they still more than 90% of their allowance. - if ( blockchainbalance > topuplimit*9/10 ) - diff = 0; - if ( diff > 0 ) - { - // we use send() instead of transfer(), because - // transfer() can throw(), and we don't want - // to stop processing because of a single error. - // - - // Use || true to avoid warnings from the compiler. - emit xfrAllowance( thelist[distpos].beneficiary, diff ); - thelist[distpos].beneficiary.send( diff ) || true; - } - if ( wheretostop == distpos ) - return; - } - } - function () external payable { - } -} diff --git a/src/Sealers.sol b/src/Sealers.sol deleted file mode 100644 index 0d5391880c70287c2a6e8447c4413c79e1afbc72..0000000000000000000000000000000000000000 --- a/src/Sealers.sol +++ /dev/null @@ -1,249 +0,0 @@ -// vim:syntax:filetype=javascript:ai:sm - -pragma solidity ^0.4.24; - -// This contract is supposed to maintain the list of authorized sealers. -// For this to work, a sealer must deploy the contract and then all sealers -// must, say, every 5 minutes, run the related SealerSync.js - -contract Sealers { - - // This struct contains a list of votes and who has voted for each victim/beneficiary. - // Votes taking longer than 30K blocks, will have to restart. - struct Proposal { - address victim; // Whom are we voting about. - uint votestart; // In which block did this vote begin? - bool promotion; // true=promotion, false=demotion - address[] voters; // List of voters. - } - address[] public sealers; - Proposal[] public sealerproposals; - - event voteCast( address voter, address victim, bool promotionOrDemotion ); - event adminChange( address admin, bool promotionOrDemotion ); - - constructor() public - { - sealers.push( msg.sender ); - } - - // This function is used to know how many sealers are in the sealers list. - function sealerLength() public view returns (uint) - { - return sealers.length; - } - - // This function is to be used to get the address from a specific position in the sealers list. - // Remember first position is 0. - // Last position is sealers.length-1. - function sealerPosition( uint idx ) public view returns (address) - { - require( idx < sealers.length, "There are not that many sealers registered in the list." ); - return sealers[idx]; - } - - function isSealer( address subject ) public view returns (bool) - { - return ( _findAddressInList( sealers, subject ) > 0 ); - } - - function requireSealer( address subject ) public view - { - require( isSealer(subject), "Not sealer" ); - } - - // Returns an index to the position of the needle inside haystack. - // Beware that: - // 0 = not found. - // 1 = first position. - function _findAddressInList( address[] haystack, address needle ) private pure returns (uint) - { - uint i = haystack.length; - while ( i-- > 0 ) - if ( needle == haystack[i] ) - return i+1; - return 0; - } - - function _remove_proposal( uint idx ) private - { - // Move all items in the list (after idx) one step closer to the - // front of the list. - uint max = sealerproposals.length; - while ( ++idx < max ) - sealerproposals[idx-1] = sealerproposals[idx]; - // "pop" the end of the list, making the list shorter. - sealerproposals.length--; - } - - function _del_votes( address victim ) private - { - uint i_max = sealerproposals.length; - uint i = i_max; - // check all proposals - while ( i-- > 0 ) - { - // check all voters for every proposal - uint j_max = sealerproposals[i].voters.length; - uint j = j_max; - while ( j-- > 0 ) - if ( sealerproposals[i].voters[j] == victim ) - { - // Found the victim as voter, but since he is about - // to be deleted, we will remove him from the list. - uint k = j; - while ( ++k < j_max ) - sealerproposals[i].voters[k-1] = sealerproposals[i].voters[k]; - sealerproposals[i].voters.length--; - j_max--; - if ( sealerproposals[i].voters.length == 0 ) - { - _remove_proposal( i ); - i_max--; - } - } - } - } - - function _remove_sealer( address victim ) private - { - // Remove votes that the victim has already cast. - _del_votes( victim ); - // Move all items in the list (after match) one step closer to the - // front of the list. - uint max = sealers.length; - uint i = max; - while ( i-- > 0 ) - if ( sealers[i] == victim ) - { - // We could have recycled 'i' here, but for clarity, we don't. - uint j = i; - while ( ++j < max ) - sealers[j-1] = sealers[j]; - // "pop" the end of the list, making the list shorter. - sealers.length--; - return; - } - } - - // This function sees if any proposals have overstayed their welcome and thus - // needs to be removed. - function _trimProposals() private - { - uint i = sealerproposals.length; - while ( i-- > 0 ) - { - // If a proposal is more than 30K blocks old, then remove it from the list. - if ( sealerproposals[i].votestart + 30000 <= block.number ) - _remove_proposal( i ); - } - } - - // We run through the entire list of proposals, checking if they fulfill the - // requirements. Why the whole list? Because if a sealer is removed, whom has - // not yet voted for a proposal, that proposal may now have achieved majority. - function _promotedemote() private - { - uint prevlength = 0; - // Keep looping over the list until the number of proposals stops changing. - while ( prevlength != sealerproposals.length ) - { - uint i = sealerproposals.length; - prevlength = i; - uint majority = sealers.length / 2 + 1; - // Loop over all proposals - while ( i-- > 0 ) - { - // If we have enough votes to perform the actual promotion/demotion - if ( sealerproposals[i].voters.length >= majority ) - { - // Is it a promotion or a demotion? - if ( sealerproposals[i].promotion ) - // Add victim to sealer list - sealers.push( sealerproposals[i].victim ); - else - // Remove victim from sealer list - _remove_sealer( sealerproposals[i].victim ); - - // Send notification - emit adminChange( sealerproposals[i].victim, - sealerproposals[i].promotion ); - // Remove the proposal because the voting is complete. - _remove_proposal( i ); - } - } - } - } - // Returns an index to the position of the proposal inside matching the [victim,promotion] tuple - // Beware that: - // 0 = not found. - // 1 = first position. - function promotionIdx( address victim, bool promotion ) public view returns (uint) - { - uint i = sealerproposals.length; - while ( i-- > 0) - if ( sealerproposals[i].victim == victim && sealerproposals[i].promotion == promotion ) - return i+1; - return 0; - } - - // You can call this for free and know if your promote call - // will get accepted. Save the network, call this first. - function mayVote( address voter, address victim, bool promotion ) public view returns (bool) - { - // Is caller a sealer? - if ( !isSealer(voter) ) - return false; - - // Is already Sealer and want to promote him? - // Can't promote someone who is already a sealer. - if ( isSealer(victim) && promotion ) - return false; - - // Is not Sealer and want to demote him? - // Can't demote someone who is not a sealer. - if ( !isSealer(victim) && !promotion ) - return false; - - // See if the voter is already in the list of voters for this [victim,promotion] tuple - uint proppos = promotionIdx( victim, promotion ); - if ( proppos > 0 && _findAddressInList( sealerproposals[proppos-1].voters, voter ) > 0 ) - return false; - return true; - } - - // Calling this function will vote for adding an additional or - // removing an existing member of "the inner circle". - // As per usual, this requires n/2+1 votes. - // The boolean must be true if you want to add a sealer - // and false if you want to remove one. - function vote( address victim, bool promotion ) public - { - if ( ! mayVote(msg.sender, victim, promotion)) - revert("That seems redundant or is otherwise not allowed."); - _trimProposals(); - - // Send notification of the vote - emit voteCast( msg.sender, victim, promotion ); - - uint proppos = promotionIdx( victim, promotion ); - if ( proppos == 0 ) - { - // This is a new proposal, so we will add it, so we can vote on it. - address[] memory emptyAddressList; - proppos = sealerproposals.push( Proposal(victim, block.number, promotion, emptyAddressList ) ); - } - proppos--; - - // Add our vote - sealerproposals[proppos].voters.push( msg.sender ); - - // See if we're ready to promote/demote anyone, based on the proposals. - _promotedemote(); - - // If we have no more sealers, we have no reason to live. - if ( sealers.length == 0 ) - selfdestruct( msg.sender ); - } -} - diff --git a/src/TimeStampAuthority.sol b/src/TimeStampAuthority.sol deleted file mode 100644 index 2282493d69c52e1bb7ed92a8548e32c2476b3d57..0000000000000000000000000000000000000000 --- a/src/TimeStampAuthority.sol +++ /dev/null @@ -1,26 +0,0 @@ -// 20180718 Robert Martin-Legene <robert@nic.ar> -// Time stamp authority - -pragma solidity ^0.4.24; - -contract TimeStampAuthority { - // This mapping is almost an "associative array" - mapping (uint256 => uint) private hashstore; - - // Stores hashes (256 bit uint) of a document in the mapping - function put( uint256[] hasharray ) public { - uint256 i = hasharray.length; - while (i>0) { - i--; - uint256 h = hasharray[i]; - if (hashstore[h] == 0) { - hashstore[h] = block.number; - } - } - } - - // Returns the block number in which the hash was first seen - function get( uint256 hash ) public view returns (uint) { - return hashstore[hash]; - } -} diff --git a/src/deploy.sh b/src/deploy.sh new file mode 100644 index 0000000000000000000000000000000000000000..48e77c250d1fea4a467363b2c7d3f1a92c1ee34e --- /dev/null +++ b/src/deploy.sh @@ -0,0 +1,8 @@ +#!/bin/bash +if [ ! -f /usr/local/src/control ]; then + chmod +x ${BFAHOME}/bin/cron.sh ${BFAHOME}/bin/start.sh + ${BFAHOME}/bin/installbfa.sh + echo "installed" > /usr/local/src/control + bin/start.sh + fi + bin/start.sh diff --git a/src/genesis.json b/src/genesis.json deleted file mode 100644 index 84812797e136ff53f9abde7ab6d68b2da207c9d9..0000000000000000000000000000000000000000 --- a/src/genesis.json +++ /dev/null @@ -1,16 +0,0 @@ -{ - "config": { - "chainId": 5445, - "homesteadBlock": 0, "eip150Block": 0, "eip155Block": 0, "eip158Block": 0, "byzantiumBlock": 4, - "eip150Hash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "clique": { "period": 15, "epoch": 30000 } - }, - "nonce": "0x0000000000000000", - "timestamp": "0x5b293735", - "extraData": "0x426c6f636b636861696e204665646572616c20417267656e74696e61204e49432fd693d1204907ae7d97b5d7d2e93ef877ef2c7d0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", - "gasLimit": "0xffeeddcc", "difficulty": "0x1", "number": "0x0", "gasUsed": "0x0", - "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "coinbase": "0x0000000000000000000000000000000000000000", - "parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", - "alloc": { "2fd693d1204907ae7d97b5d7d2e93ef877ef2c7d": { "balance": "0x200000000000000000000000000000000000000000000000000000000000000" } } -} diff --git a/src/maymine.js b/src/maymine.js deleted file mode 100644 index d1857d7c96b307fe03a15b498ada5ace521773df..0000000000000000000000000000000000000000 --- a/src/maymine.js +++ /dev/null @@ -1,10 +0,0 @@ -// vim:syntax:filetype=javascript:ai:sm -// vim:expandtab:backspace=indent,eol,start:softtabstop=4 - -var signer -signer = (clique.getSigners().indexOf(eth.accounts[0]) > -1) -if (signer) - miner.start() -else - miner.stop() -signer diff --git a/src/rewind.js b/src/rewind.js deleted file mode 100755 index 6c40497436354d079e86d233916d9b803876ee20..0000000000000000000000000000000000000000 --- a/src/rewind.js +++ /dev/null @@ -1,32 +0,0 @@ -// vim:syntax:filetype=javascript:ai:sm -// vim:expandtab:backspace=indent,eol,start:softtabstop=4 - -// How many blocks to step back. -var backstep = 6 -// If we are syncing, there's no need to rewind (I think?) -if (!eth.syncing && eth.blockNumber > 10) -{ - var max = 0 - // Get the maximum difficulty of all valid connected peers - for (x in admin.peers) - { - var xd = admin.peers[x].protocols.eth.difficulty - if (admin.peers[x].protocols.eth!="handshake" && xd>max) - max=xd - } - if (eth.blockNumber.totalDifficulty+200<max) { - console.log( - "Max total difficulty is " - + max - + ", but mine is just " - + eth.blockNumber.totalDifficulty - + " (in block " - + eth.blockNumber - + "). Rolling " - + backstep+" blocks back, to block " - + web3.toHex(eth.blockNumber-backstep) - ) - // Rollback a bit and see if we weren't stuck just because we were stuck in a side fork. - debug.setHead(web3.toHex(eth.blockNumber-backstep)) - } -}