description=fmt.Sprintf(`Vota automáticamente en todas las propuestas activas, en el sentido que corresponda, con ciertas restricciones.
- No deja votar si el voto puede reducir la cantidad de selladores a menos de %v.
- No permite eliminar a los selladores establecidos en el bloque génesis.
- Requiere que la propuesta tenga al menos %v votos.
- No permite votar para eliminarse a uno mismo de la lista de selladores.`,minSigners,threshold)
flags.IntVar(&threshold,"threshold",voteThreshold,"Cantidad mínima de votos en una propuesta para habilitar el voto automático.")
setFlags()
parseFlags()
util.PanicIf(threshold<voteThreshold,"No se puede especificar una cantidad de votos inferior a %v.",voteThreshold)
url=updateURL(url)
node,err:=bfa.Dial(url)
util.Check(err)
defernode.Close()
util.PanicIf(!node.IsSealer(bfa.Self),"Solo los selladores pueden votar")
votes:=node.GetVotes(latest)
genesisSigners:=node.GetSignersAtBlock(0)
self,err:=node.Coinbase()
util.Check(err)
for_,tally:=rangevotes.Tally{
iftally.False>=threshold{// We are trying to remove a sealer
removedSealers+=1
}
}
util.PanicIf(len(votes.Signers)-removedSealers<minSigners,"No se puede emitir un voto automático que reduzca la cantidad de selladores por debajo de %v.",minSigners)
log.Printf("No se puede quitar en forma automática a un sellador del bloque génesis: %v.\n",proposal)
continue
caseproposal==self:
log.Println("No se puede votar para eliminarse uno mismo de la lista de selladores.")
continue
}
node.Propose(proposal,!isSealer)
ifjson{
voted[proposal]=!isSealer
}else{
fmt.Printf("Voto por %v: %v\n",proposal,!isSealer)
}
}
ifjson{
util.PrintJson(voted)
}
}
funcpropose(){
var(
autobool
authorizebool
proposals[]string
voted=make(map[string]bool)
)
description="Vota por una propuesta."
otherArgs="[propuesta...]"
setFlags()
flags.BoolVar(&auto,"auto",false,"Vota en todas las propuestas activas, en el sentido que corresponda.")
flags.BoolVar(&authorize,"authorize",true,"Sentido del voto (true: a favor, false: en contra).")
parseFlags()
url=updateURL(url)
node,err:=bfa.Dial(url)
util.Check(err)
defernode.Close()
genesisSigners:=node.GetSignersAtBlock(0)
util.PanicIf(!node.IsSealer(bfa.Self),"Solo los selladores pueden votar")
votes:=node.GetVotes(latest)
ifauto{
for_,proposal:=rangevotes.Proposals{
util.PanicIf(util.Contains(genesisSigners,proposal)&&node.IsSealer(proposal),"No se puede quitar en forma automática a un sellador del bloque génesis.")
proposals=append(proposals,proposal)
ifflags.NArg()==0{
panic("No se especificaron candidatos por los cuales votar")
}
fori:=0;i<flags.NArg();i++{
address:=flags.Arg(i)
if!util.IsAddress(address){
panic(fmt.Sprintf("'%v' no es una dirección válida",address))