Kuinka lukea Ethereumin sopimusvarastointi

Kaikki puhuvat siitä, että sopimusten tiedot ovat julkisia, mutta kaikki eivät osaa lukea niitä.

Kaikilla ethereum VM: lle käyttöönotetuilla sopimuksilla on oma varastointi, missä varastot ovat. Tässä on esimerkki kuinka lukea tämä tallennustila web3.js-kirjastossa eth.getStorageAt () -menetelmällä.

Tarkastelemamme sopimusesimerkki:

Tämä sopimus otetaan käyttöön ropsten-testiverkossa: osoitteessa 0xf1f5896ace3a78c347eb7eab503450bc93bd0c3b

Kaikki tallennustilan parametrit indeksoidaan alusta alkaen. Yksi hakemisto vie 256 tavua, ja se sopii 64 symbolille. Tässä esimerkissä meillä on 10 parametria ja voimme toistaa niitä:

anna sopimusAddress = '0xf1f5896ace3a78c347eb7eab503450bc93bd0c3b'
varten (indeksi = 0; indeksi <10; indeksi ++) {
 console.log (`[$ {index}]` +
   web3.eth.getStorageAt (sopimusosoite, hakemisto))
}
tulos:
[0] 0x0000000000000000000000000000000000000000000000000000000000000000000f
[1] 0x00000000000000000000000055bbdd9a000000000000000000000000000000429f
[2] 0x00000000000000000000000000000000007465737431000000000000000000000000
[3] 0x74657374313233360000000000000000000000000000000000000000000000000000
[4] 0x6c65747320737472696e6720736f6d657468696e67000000000000000000002a
[5] 0x00000000000000000000000000000000000000000000000000000000000000000000
[6] 0x00000000000000000000000000000000000000000000000000000000000000000000
[7] 0x000000000000000000000000000000000000000000000000000000000000000002
[8] 0x000000000000000000000000000000000000000000000000000000000000000000002
[9] 0x00000000000000000000000000000000000000000000000000000000000000000000

Katsotaanpa syvemmälle jokaista parametria

Hakemisto 0 - myymälä1

anna sopimusAddress = '0xf1f5896ace3a78c347eb7eab503450bc93bd0c3b'
olkoon indeksi = 0
console.log (web3.eth.getStorageAt (sopimusosoite, hakemisto))
console.log ('DEC:' + web3.toDecimal (web3.eth.getStorageAt (sopimusosoite, hakemisto))))
tulos:
0x000000000000000000000000000000000000000000000000000000000000000f
Joulukuu 15

constuint

Vakioita ei säilytetä varastossa. Saatavana vain koodina.

Hakemisto 1 - sijoituksetLimit, sijoitusajatDeadlineTimeStamp

olkoon indeksi = 1
console.log (web3.eth.getStorageAt (sopimusosoite, hakemisto))
tulos:
 0x00000000000000000000000059b92d9a0000000000000000000000000000429f
DEC: 1505308058 ja 17055

Hakemistossa 1 yhdistetään 2 ominaisuutta tallennustilan käytön optimoimiseksi.

hakemisto 2 - merkkijono1

indeksi = 2
console.log (web3.eth.getStorageAt (sopimusosoite, hakemisto))
console.log ('ASCII:' +
 web3.toAscii (web3.eth.getStorageAt (sopimusosoite, hakemisto)))
tulos:
0x0000000000000000000000000000000074657374310000000000000000000000
ASCII: testi1

hakemisto 3 - merkkijono2

indeksi = 3
console.log (web3.eth.getStorageAt (sopimusosoite, hakemisto))
console.log ('ASCII:' +
 web3.toAscii (web3.eth.getStorageAt (sopimusosoite, hakemisto)))
tulos:
0x7465737431323336000000000000000000000000000000000000000000000000
ASCII: testi1236

hakemisto 4 - merkkijono3

indeksi = 4
console.log (web3.eth.getStorageAt (sopimusosoite, hakemisto))
console.log ('ASCII:' +
 web3.toAscii (web3.eth.getStorageAt (sopimusosoite, hakemisto)))
tulos:
0x6c65747320737472696e6720736f6d657468696e67000000000000000000002a
ASCII: antaa nauhoittaa jotain * (42)

Loppusymboli 2a (joulukuu 42) on tallennetun merkkijonon pituus. (lisätietoja http://solidity.readthedocs.io/fi/latest/miscellaneous.html#layout-of-state-variables-in-storage)

hakemisto 5 - uintit1

indeksi = 5
console.log (web3.eth.getStorageAt (sopimusosoite, hakemisto))
tulos:
0x0000000000000000000000000000000000000000000000000000000000000000
ONGELMA!!!!

Kartoituksilla on erilainen indeksointi, ja ne tulisi lukea toisin. Kartoitusarvon lukemiseksi sinun on tiedettävä avainarvo. Muutoin lukemakartoitusarvo on mahdoton.

hakemisto = '000000000000000000000000000000000000000000000000000000000000000005'
avain = '00000000000000000000000xbccc714d56bc0da0fd33d96d2a87b680dd6d0df6'
anna newKey = web3.sha3 (avain + hakemisto, {"koodaus": "heksa"})
console.log (web3.eth.getStorageAt (sopimusosoite, newKey))
console.log ('DEC:' + web3.toDecimal (web3.eth.getStorageAt (sopimusosoite, newKey))))
tulos:
0x0000000000000000000000000000000000000000000000000000000000000058
JOUS: 88

index6 - rakenteet1

hakemisto = "00000000000000000000000000000000000000000000000000000000000000000006"
avain = "00000000000000000000000xbccc714d56bc0da0fd33d96d2a87b680dd6d0df6"
anna newKey = web3.sha3 (avain + hakemisto, {"koodaus": "heksa"})
console.log (web3.eth.getStorageAt (sopimusosoite, newKey))
console.log ('ASCII:' +
 web3.toAscii (web3.eth.getStorageAt (sopimusosoite, newKey)))
tulos:
0x6465766963654272616e64000000000000000000000000000000000000000016
ASCII: laitemerkki

Toisen rakenteen arvon lukemiseen sinun on lisättävä newKey-arvoa yhdellä

toiminnon lisäysHexByOne (heksa) {
 olkoon x = uusi BigNumber (heksa)
 laske summa = x.add (1)
 anna tulos = '0x' + sum.toString (16)
 palauttaa tuloksen
}
hakemisto = "00000000000000000000000000000000000000000000000000000000000000000006"
avain = "00000000000000000000000xbccc714d56bc0da0fd33d96d2a87b680dd6d0df6"
anna newKey = lisätäHexByOne (
  web3.sha3 (avain + hakemisto, {"koodaus": "heksa"}))
console.log (web3.eth.getStorageAt (contractAddress, newkey))
console.log ('ASCII:' +
 web3.toAscii (web3.eth.getStorageAt (sopimusosoite, newKey)))
tulos:
0x6465766963655965617200000000000000000000000000000000000000000014
ASCII: laitevuosi

Jos haluat kolmannen rakennearvon, lisää newKey uudelleen.

hakemisto 7 - uintarray

hakemisto = "7"
console.log (web3.eth.getStorageAt (sopimusosoite, hakemisto))
tulos:
  0x0000000000000000000000000000000000000000000000000000000000000002

Tässä taulukossa on 2 tuotetta

hakemisto = "00000000000000000000000000000000000000000000000000000000000000000007"
anna newKey = web3.sha3 (hakemisto, {"koodaus": "hex"})
console.log (web3.eth.getStorageAt (sopimusosoite, newKey))
console.log ('DEC:' +
  web3.toDecimal (web3.eth.getStorageAt (sopimusosoite, newKey)))
tulos:
0x0000000000000000000000000000000000000000000000000000000000001f40
DEC: 8000
newKey = lisätäHexByOne (web3.sha3 (hakemisto, {"koodaus": "hex"}))
console.log (web3.eth.getStorageAt (sopimusosoite, newKey))
console.log ('DEC:' +
  web3.toDecimal (web3.eth.getStorageAt (sopimusosoite, newKey)))
tulos:
0x0000000000000000000000000000000000000000000000000000000000002328
DEC: 9000

hakemisto 8— laiteDataArray

hakemisto = "00000000000000000000000000000000000000000000000000000000000000000008"
anna newKey = web3.sha3 (hakemisto, {"koodaus": "hex"})
console.log (web3.eth.getStorageAt (sopimusosoite, newKey))
console.log ('ASCII:' +
 web3.toAscii (web3.eth.getStorageAt (sopimusosoite, newKey)))
tulos:
0x6465766963654272616e64000000000000000000000000000000000000000016
ASCII: laitemerkki
hakemisto = "00000000000000000000000000000000000000000000000000000000000000000008"
anna newKey = lisätäHexByOne (web3.sha3 (hakemisto, {"koodaus": "hex"}))
console.log (web3.eth.getStorageAt (sopimusosoite, newKey))
console.log ('ASCII:' +
web3.toAscii (web3.eth.getStorageAt (sopimusosoite, newKey)))
tulos:
0x6465766963655965617200000000000000000000000000000000000000000014
ASCII: laitevuosi

Lisää 2 tuloksella:

0x776561724c6576656c0000000000000000000000000000000000000000000012

ASCII: wearLevel

Korotus 3: lla syötät taulukon toiseen kohtaan:

0x6465766963654272616e64320000000000000000000000000000000000000018

ASCII: laitemerkki2

Lähteet:
https://github.com/ethereum/solidity/issues/1550
https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_getstorageat
https://ethereum.stackexchange.com/questions/13910/how-to-read-a-private-variable-from-a-contract
https://github.com/ethereum/web3.js/issues/445

Tutustu testialueemme - Aigang!

Lisätietoja Aigangista - http://bit.ly/AigangWebsite
Aigang Whitepaper - http://bit.ly/2hwAtkt
Aigang on Telegram - http://bit.ly/AigangTelegram
Hanki Aigangin uusimmat päivitykset - http://bit.ly/AigangUpdates