Category Archives: Usefull Things

KAVA Autocompounder for Staking Crypto Rewards with Javascript NodeJS

kava.io bietet DeFI auf der BEP2 Chain an. KAVA Tokens können gestaked werden, aktuell gibt es um die 20% APR. Mit Wallets wie z.B. dem Trustwallet oder Ledger kann man KAVA staken. Möchte man jedoch vom Zinsenzinseffekt profitieren, so muss man derzeit manuell seine Staking-Rewards einsammeln und manuell wieder erneut delegieren.

Aber es handelt sich ja um eine Kryptowährung, welche sich bekanntlich programmieren lassen. Daher habe ich schnell mal das SDK gezogen, etwas gepatcht und folgenden Autocompounder gebaut:

autocompounder.js:
const Env = require("./env").env;
const kavaUtils = require("./src/utils").utils;

'use strict';

const KavaClient = require('./src/client').KavaClient;
const tx = require('./src/tx').tx;
const msg = require('./src/msg').msg;
const utils = require('./src/utils').utils;
const crypto = require('./src/crypto').crypto;

module.exports = {
  KavaClient,
  tx,
  msg,
  utils,
  crypto,
};



const KAVA_CONVERSION_FACTOR = 10 ** 6;
const COMPOUND_LIMIT = 0.2 ; // the amount of pending rewards at which we start autocompounding


var main = async () => {


    kavaClient = new KavaClient(Env.KavaEndpoints.Mainnet);
    kavaClient.setWallet(Env.KavaAccount.Mainnet.Mnemonic);
    kavaClient.setBroadcastMode("async");
    await kavaClient.initChain();


    unused_balance = 0;

    console.log("Account:", Env.KavaAccount.Mainnet.Address);
    let balances = await kavaClient.getBalances(Env.KavaAccount.Mainnet.Address);

    let kavaBalance = balances.find((item) => item.denom.toUpperCase() === "UKAVA");
    if(kavaBalance) {
        console.log("\tBalance (kava):", kavaBalance.amount / KAVA_CONVERSION_FACTOR);
        unused_balance = kavaBalance.amount / KAVA_CONVERSION_FACTOR ;
    }

    let kavaDelegations = await kavaClient.getDelegations(Env.KavaAccount.Mainnet.Address);
    let staked = 0 ; 
    let validators = [];
    let bal_before = 0; 
    for (let element of kavaDelegations) {
      let balance = element.balance; 
      validators.push(element.validator_address);
        staked = staked + (balance.amount / KAVA_CONVERSION_FACTOR);
        if (bal_before < staked ) {
          bal_before = staked; 
          next_val = element.validator_address; 
        }
        
    }
    console.log("\tStaked (kava):" , staked) ;
    console.log("\tnext validator: ", next_val); 

  
    if (unused_balance > COMPOUND_LIMIT) { 
      let new_stake_balance = unused_balance - 0.01 ; 
      console.log("new staking: ", new_stake_balance);
      denom_val = new_stake_balance.toFixed(5) * KAVA_CONVERSION_FACTOR;
        
        let txMsgs = [] ; 
                txMsgs.push ( {
        type: 'cosmos-sdk/MsgDelegate',
        value: {
            delegator_address: Env.KavaAccount.Mainnet.Address,
            validator_address: next_val,
            amount: {denom:'ukava', amount: denom_val.toString() }
        },
    });

	let txid = await kavaClient.sendTx(txMsgs, fee={amount: [{ denom: 'ukava', amount: "0" }], gas: String(300000)}, null);	
	console.log("stake kava, created TX ", txid) ;

    }



    let kavaRewards = await kavaClient.getDistributionRewards(Env.KavaAccount.Mainnet.Address);

    let Rewards = kavaRewards.total.find((item) => item.denom.toUpperCase() === "UKAVA");
    if(Rewards) {
        console.log("\tStaking Rewards (kava):", Rewards.amount / KAVA_CONVERSION_FACTOR);
    }
    if (Rewards.amount / KAVA_CONVERSION_FACTOR > COMPOUND_LIMIT) { 
        console.log("time to get rewards!");

        let txMsgs = [] ; 
        for (let val of validators) { 
                txMsgs.push ( {
        type: 'cosmos-sdk/MsgWithdrawDelegationReward',
        value: {
            delegator_address: Env.KavaAccount.Mainnet.Address,
            validator_address: val,
        },
    });
        }

	let txid = await kavaClient.sendTx(txMsgs, fee={amount: [{ denom: 'ukava', amount: "0" }], gas: String(300000)}, null);
	console.log("fetched rewards, created TX ", txid) ; 
        
    }

}

main();

env.js:
const KavaAccount = {
    Local: {
        Address: "",
        Mnemonic: ""   
    },
    Testnet: {
        Address: "",
        Mnemonic: "",  
    },
    Mainnet: {
        Address: "kava1757uf8nmejhlqnmk99n4d9y78taud4neneutus",
        Mnemonic: "send some kava to my address to show some love",  
    }
}

const KavaEndpoints = {
    Local: "http://localhost:1317",
    Testnet: "https://kava-testnet-8000.kava.io",
    Mainnet: "https://api.kava.io",
}

const KavaDeputy = {
    Testnet: "kava1tfvn5t8qwngqd2q427za2mel48pcus3z9u73fl",
    Mainnet: "kava1r4v2zdhdalfj2ydazallqvrus9fkphmglhn6u6",
}

const BinanceAccount = {
    Testnet: {
        Address: "",
        Mnemonic: "",
    },
    Mainnet: {
        Address: "",
        Mnemonic: ""
    }
}

const BinanceEndpoints = {
    Testnet: "https://testnet-dex.binance.org",
    Mainnet: "https://dex.binance.org/",
}

const BinanceDeputy = {
    Testnet: "tbnb1et8vmd0dgvswjnyaf73ez8ye0jehc8a7t7fljv",
    Mainnet: "bnb1jh7uv2rm6339yue8k4mj9406k3509kr4wt5nxn"
}

module.exports.env = {
    KavaAccount,
    KavaEndpoints,
    KavaDeputy,
    BinanceAccount,
    BinanceEndpoints,
    BinanceDeputy
}

Nextcloud 20 mit dezentraler, redundanter, Sia Storage

Google Drive, Amazon S3, Dropbox, Icloud – viele kennen diese Cloudservices und nutzen sie. Meistens geht alles gut, aber folgendes sollte einem doch zu denken geben:

“Dropbox ist dazu übergegangen, die Konten von Nutzern zu sperren, die gegen das Urheberrecht verstoßen bzw. deren Konten mehrfach Gegenstand von Anschuldigungen wegen Urheberrechtsverstößen waren.”

D.h. unter gewissen Umständen kommt man nicht mehr an seine Daten. Man ist den Anbietern sozusagen ausgeliefert. Abhilfe schaffen hier blockchainbasierte Services, welche Daten verteilt redundant und verschlüsselt auf vielen verschiedenen Rechnern im Netz speichern. Unter https://sia.tech bekommt man ein hübsches GUI für das Sia storage Netzwerk. Die Idee ist einfach: Das Netzwerk wird über eine Blockchain durch Mining abgesichert und Verträge werden darüber geschlossen. User, die Speicherplatz zur Verfügung stellen erhalten eine Vergütung, andere User können den Speicher mieten. Durch sia ist sichergestellt dass die Daten mehrfach im Netzwerk gespeichert werden und dass diese verschlüsselt abgelegt sind. Nur der Nutzer mit den entsprechenden wallet erhält Zugriff auf seine Dateien.

Das Userinterface Sia UI ist für Endanwender gemacht. Es läuft unter Windows, macOS und Linux. Es gibt auch die Möglichkeit, Sia über NDB zu mounten, was ich jedoch nicht zuverlässig betreiben konnte. (sia-nbdserver) oder mittels FUSE zu mounten, allerdings bisher nur read-only. Eine weitere Möglichkeit bietet die Sia API. Einige kennen vielleicht schon Nextcloud, den Owncloud Nachfolger und haben diesen schon genutzt. Bei diesem kann man auch externe Speicher einbinden, wie z.B. Google Drive oder Dropbox, man hat dann aber eben das Problem nicht Herr seiner Daten zu sein. Vor ein paar Jahren gab es schon mal ein externes Storage Modul für Nextcloud zur Einbindung von Sia Storage, allerdings hat man es nun 3 Jahre lang nicht weiterentwickelt. Mit der aktuellen Nextcloud 20 lief es nicht.

Aus diesem Grund habe ich mir den Code einmal angeschaut und für Nextcloud 20 flottgemacht. Ein paar Features, die ich im Gitlab zu dem Projekt gefunden habe, konnte ich direkt mit umsetzen. Die aktuelle Version gibt es hier: https://gitlab.com/f.wiessner/Sia-Nextcloud

Wie wirds gemacht?

Hier noch kurz ein kleines “Howto”, wie man das ganze in Betrieb nimmt. Vorraussetzung sind ein installiertes Nextcloud 20, ein installiertes sia (man kann hier einfach das neue siastream nutzen, welches gleich Contracts etc erstellt und nutzerfreundlicher ist) und den Code von meinem Repository.

Siastream gibt es unter https://siastream.tech/, aktuell in Version 1.0.4. Sobald man es heruntergeladen, entpackt und gestartet hat, braucht man sich um nichts weiter kümmern. Siastream installiert den Sia-Daemon gleich mit und startet auch den Sync der Sia-Chain automatisch. Unter http://localhost:3000 bzw. wenn man siastream mit –host 0.0.0.0 startet unter der IP des Servers Port 3000 kommt man auf das Administrationsinterface.

Unter Deposit kann man dann Siacoins hinterlegen die man benötigt um Contracts zu schliessen. Aktuell kostet 1 TB ca. 5 US $ pro Monat. Sia Coins (Kürzel SC) gibt es z.B. bei Binance (https://www.binance.com/en/register?ref=KM4WQJ9K) – mit meinem Link bekommst Du 5% Rabatt auf Transaktionsgebühren jeglicher Art! Nachdem man eine Menge an SC aufgeladen hat, kann es dann auch schon losgehen:

Den Code von meinem Repository hier herunterladen: https://gitlab.com/f.wiessner/Sia-Nextcloud z.B. mit

 git clone https://gitlab.com/f.wiessner/Sia-Nextcloud.git

Den Code kopiert man in die Nextcloud Installation in den Ordner nextcloud/apps/files_external_sia

mkdir nextcloud/apps/files_external_sia ; cp -dpr Sia-Nextcloud/* nextcloud/apps/files_external_sia

Unter Umständen muss in nextcloud/apps/files_external_sia/sia-php/Requests noch https://github.com/WordPress/Requests/ nachgeladen werden:

cd apps/files_external_sia/sia-php/ ; git clone https://github.com/WordPress/Requests.git

Nextcloud konfigurieren

Nun kann man unter Settings im External Storage Menü Sia aktivieren und ein paar Parameter übergeben:

Der erste Parameter 127.0.0.1:9980 ist die Adresse des sia-Daemons siad. In dem Bild ist der default hinterlegt. Der zweite Parameter ist ein Verzeichnis auf dem Server, für welches der Webserver User (www-data) und der siad User Berechtigungen haben und dient als Cache Verzeichnis. Der dritte Parameter ist der API-Key. Diesen findet man nach der Installation von Siastream oder siad im Verzeichnis ~/.sia/apipassword. Nun kann man noch einen Prefix festlegen, wo die Daten im Sia-Storage abgelegt werden sollen, und ob Nextcloud für jeden Benutzer ein eigenes Unterverzeichnis bereitstellen soll, oder ob alle Daten für jeden sichtbar sind. Ist also “true” eingestellt, können die Benutzer die Dateien anderer Nutzer im Sia Storage nicht sehen. Wenn man zwei external Storages konfiguriert kann man aber einen so konfigurieren dass er als “shared” Storage für alle Nutzer funktioniert, der andere aber nur als Userverzeichnis. Es gibt keine Limits wieviele external Storages man anlegt.

Bei Fragen einfach kommentieren, Trinkgeld darf an:

SC: 1d9855ca88a07af2811fe6f277b062a6732cda68911ea34e43e8408bf4be376026a5b8c48218 

XMR: 8C6KSu12hpZhBYGL7xC6QRF6u4z4obVzb1ZVgPKG7942dSGy3DG8ExMGNNcCw3wmJKGfmaSG2evhg7uiz545CWSuEazNqQ5

ETH: 0x08c5e7901BD68bD2058d4F09aB0a8e5a479622b6

#nextcloud #sia #siacoin #siastorage #siastream #cloud #cloudspace #dropbox #googledrive #decentralicedstorage

Paymill ist insolvent – und nun?

wer derzeit seine Zahlungsabwicklung mit Paymill durchführt, muss sich wohl nach Alternativen umsehen, da Paymill Insolvenz angemeldet hat.

http://t3n.de/news/paymill-insolvent-pleite-701620/

Eine Möglichkeit wäre z.B. unseren in PHP entwickelten EBICS Client einzusetzen, um SEPA Lastschriften und SEPA Überweisungen an die eigene Hausbank über das EBICS Protkoll zu übertragen.

 

Weitere Informationen diesbezüglich gibt es unter http://www.smart-ebics.de – Wir helfen natürlich gern bei der Integration der Software in Ihre Geschäftsprozesse.

EBICS PHP Client – jetzt unter http://www.smart-ebics.de anfordern!

Aufgrund des Umstands, dass sich über die startnext Crowdfunding Plattform doch nicht die Summe angesammelt hat um den EBICS Client unter GPL zu stellen, habe ich nun eine kleine Website unter http://www.smart-ebics.de erstellt auf der man den EBICS PHP Client bestellen kann.

Neben einigen Beispielen wie die Klasse benutzt wird,  gibt es auch ein Orderformular. Es gibt zwei Versionen:

  1. limited Version, als ION Cube Binary, max. 1 Bank und 1 User
  2. unlimited Version, sourcecode

Nach der Bestellung und Eingang des Lizenzvertrags erhaltet Ihr nach Zahlungseingang umgehend die Software.

Windows 8.1 als Linux KVM Guest mit VGA Passthrough (DirectX11) unter Ubuntu

Wer unter Linux spielen will, hat meist das Problem dass Windows Spiele nur bedingt mit Wine lauffähig sind und selten gibt es für neue Spieletitel eine Linux-Version. Aus diesem Grund hier ein Howto, wie Ihr mit halbwegs aktueller Hardware und KVM Virtualisierung eine DirectX11 taugliche Grafikkarte an den KVM Gast weitergeben könnt. Wichtig ist dass das Board eine IOMMU hat, sonst klappt das Ganze nicht. Continue reading Windows 8.1 als Linux KVM Guest mit VGA Passthrough (DirectX11) unter Ubuntu

spontanes mysteriöses gelegentliches ssh_exchange_identification: Connection closed by remote host

Da es doch immer mal wieder auftaucht, falls Du ssh in scripts nutzt und aufrufst, und manchmal unerklärlicher weise die ssh Verbindung wegen

ssh_exchange_identification: Connection closed by remote host

fehlschlägt, liegt es wahrscheinlich an zu niedrig konfigurierten MaxStartups und/oder MaxSessions. Daher in der sshd_config (debian: /etc/ssh/sshd_config) folgendes eintragen bzw erhöhen (folgende Werte funktionieren gut bei einem 16 Node Cluster:

MaxStartups 100
MaxSessions 50

Dann den sshd mit service ssh restart bzw /etc/init.d/ssh restart neu starten. Nun sollte das Problem nicht mehr auftreten.

 

Owncloud auf einem smart-kvm.com KVM Server

Immer wieder liest oder hört man von diversen Medien, dass man doch seine Daten in die Cloud verlagern soll oder kann, um diese global verfügbar zu halten. Prinzipiell ist dies ja eine gute Idee, denkt man diesen Gedanken jedoch zuende so muss man schon feststellen dass man hierbei viel falsch machen kann. Bevor man seine Daten jedoch in die Hände eines Cloudanbieters gibt, sollte man sich zuerst überlegen, wie man diese Daten entsprechend schützen kann. Größere Cloudanbieter wie Amazon EC oder Google Drive bieten einen relativ leichten Zugang zu Cloudspeicher und Cloudservices, speichern die Daten jedoch nicht in Deutschland sondern im Ausland. Was letztlich mit den Daten passiert kann man als User nicht feststellen.

Eine bessere Lösung ist es z.B., Owncloud auf einem eigenen Server zu betreiben, den man sich z.B. bei einem Cloud Server Anbieter oder VServer Anbieter zulegen kann. Auch hier muss man sich darüber im Klaren sein, dass der Hosting Anbieter prinzipiell Zugriff auf die Daten hat, und dass diese eigentlich bei den meisten Standardinstallationen ungeschützt auf dem Server des Anbieters gespeichert werden. Wer sich jedoch absolut sicher sein möchte, dass seine Daten geschützt sind muss daher etwas mehr Aufwand betreiben. Ich habe daher hier mal einen kleinen Leitfaden erstellt, mit dem man sich eine verschlüsselte Owncloud Installation auf seinem Server bei smart-kvm.com einrichten kann. Dieser Leitfaden gilt natürlich analog für jeden beliebigen Server Anbieter, sofern man die Möglichkeit hat das System selbst einzurichten.

Zuerst bei www.smart-kvm.com den passenden Server konfigurieren – die Hardware kann später immer noch angepasst werden und es können jederzeit weitere Ressourcen hinzugebucht werden. Die Server werden bei smart-kvm.com in Echtzeit bereitgestellt, normalerweise ist der Server wenige Sekunden nach Benutzerregistrierung verfügbar. Wir gehen hier nun im Webinterface in das entsprechende Bootmenü des smart-kvm.com cloud servers, übernehmen die Option um von CD zu booten und wählen unser bevorzugtes Betriebssystem aus. Ich habe hier nun Debian Wheezy verwendet, möglich wäre auch CentOS, Redhat EL, SuSE Linux oder Ubuntu. Eine Lister der Unterstützen Distributionen gibt es hier: http://software.opensuse.org/download/package?project=isv:ownCloud:community&package=owncloud

Bei der Installation des Betriebssystems ist unbedingt darauf zu achten, dass die komplette Installation verschlüsselt ist und der Server vor dem Boot bereits ein Passwort zur Entschlüsselung verlangt. Nur so ist sichergestellt, dass auch der Hosting-Anbieter keinen Zugriff auf die Daten erhält. Wer unbedingt will, kann auch die Owncloud auf einem Windows Server installieren – hierbei ist dann darauf zu achten dass zumindest der Datenbereich der Owncloud Installation verschlüsselt gespeichert wird. Es gibt ausserdem noch Owncloud Apps, die ebenfalls die Daten verschlüsseln können. Hier kann man dann aber dennoch sehen, welche User angelegt wurden etc. Es empfiehlt sich daher, den kompletten Server zu verschlüsseln.

Anschliessend kann man seine Owncloud Installation ganz normal administrieren, die Daten sollten nun vor Zugriffen von Dritten geschützt sein.

EBICS Client ( ebics_client.class.php)

[update 27.01.2016]

Nun also doch kommerzielle Version – Infos etc. findet Ihr hier: PHP EBICS Client

[/update]

endlich hab ich es fertiggebracht.. nach 11 langen Tagen coding, debugging und studieren der überaus umfangreichen und noch dazu auch fehlerhaften EBICS Dokumentation konnte ich nun endlich einen EBICS Client in php fertigstellen, der zumindest mit meiner Sparkasse einwandfrei funktioniert 😉 Im Moment kann der Client die folgenden Auftragsarten: INI, HIA, HPB, HKD, HTD, CDD (Sepa Lastschrift), CCT (Sepa Überweisung), CDB (Sepa B2B Lastschrift), IZL, IZV, STA, PTK. Eine Klasse zum Erzeugen der SEPA PAIN Nachrichten habe ich auch schon gebaut.

Aktuell bin ich noch am überlegen, ob ich den Client unter der GPL veröffentlichen soll oder nicht… Da es kommerzielle Anbieter gibt, die relativ simple EBICS Tools (z.b. nur für Upload, nur für Signatur) für enormes Geld anbieten (EBICS Tool für Upload und Signatur für 7.000 €!!!) muss ich da jetzt erst mal ein paar Nächte drüber schlafen…