From 662c51605fc59a7998aa29b80d9399d6e3af6e68 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 10 Sep 2021 15:12:43 +0200 Subject: [PATCH 01/99] feat: retrieve from any cid (not just root cid) --- go.mod | 16 ++-- go.sum | 36 +++++---- itests/deals_anycid_test.go | 143 ++++++++++++++++++++++++++++++++++++ itests/kit/deals.go | 11 ++- itests/kit/files.go | 25 +++++-- markets/dagstore/wrapper.go | 24 ++++++ 6 files changed, 222 insertions(+), 33 deletions(-) create mode 100644 itests/deals_anycid_test.go diff --git a/go.mod b/go.mod index 37e6bb9165c..daeb3847d2a 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.3 + github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 @@ -36,11 +36,11 @@ require ( github.com/filecoin-project/go-data-transfer v1.11.4 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.3 - github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-padreader v0.0.1 - github.com/filecoin-project/go-paramfetch v0.0.2 - github.com/filecoin-project/go-state-types v0.1.1 + github.com/filecoin-project/go-fil-markets v1.12.1-0.20210916145046-d81117f778de + github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec + github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 + github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498 + github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b @@ -98,7 +98,7 @@ require ( github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 - github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 + github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26 github.com/ipld/go-codec-dagpb v1.3.0 github.com/ipld/go-ipld-prime v0.12.3 github.com/ipld/go-ipld-selector-text-lite v0.0.0 @@ -139,7 +139,7 @@ require ( github.com/streadway/quantile v0.0.0-20150917103942-b0c588724d25 github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 - github.com/urfave/cli/v2 v2.2.0 + github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 diff --git a/go.sum b/go.sum index 6019140fce8..0eb3c7d054d 100644 --- a/go.sum +++ b/go.sum @@ -302,8 +302,8 @@ github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.3 h1:yeFl6+2BRY1gOVp/hrZuFa24s7LY0Qqkqx/Gh8lidZs= -github.com/filecoin-project/dagstore v0.4.3/go.mod h1:dm/91AO5UaDd3bABFjg/5fmRH99vvpS7g1mykqvz6KQ= +github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5 h1:wtKBSxmV5ohSeZHS86TrLtw6m1dO88QaNo6az/QRrYU= +github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5/go.mod h1:dsWYxyEYa5aB62UXJcQhwlIaBOS+kkrKQgYGxwAnmkE= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -327,6 +327,7 @@ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= +github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= @@ -338,8 +339,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.12.1-0.20210916145046-d81117f778de h1:QTcLAfS3DAWtWvwCG49wjN8jX0sJArnwOyyKQwbvBmU= +github.com/filecoin-project/go-fil-markets v1.12.1-0.20210916145046-d81117f778de/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -347,24 +348,22 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= -github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= +github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= +github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= -github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= -github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498 h1:G10ezOvpH1CLXQ19EA9VWNwyL0mg536ujSayjV0yg0k= +github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e h1:XAgb6HmgXaGRklNjhZoNMSIYriKLqjWXIqYMotg6iSs= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= -github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -742,6 +741,7 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= +github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= @@ -861,12 +861,13 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= +github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7 h1:6Z0beJSZNsRY+7udoqUl4gQ/tqtrPuRvDySrlsvbqZA= -github.com/ipld/go-car/v2 v2.0.3-0.20210811121346-c514a30114d7/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= +github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26 h1:IBXjeOANJGYZVJ9jsvf0Tu+ANQ9FLstscJgzfJgwA8c= +github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26/go.mod h1:bBmZNBj4jfOHrd4Cu/koFhqwsCnZ5RrGXU1wwWqDr20= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -878,6 +879,7 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= @@ -1482,8 +1484,9 @@ github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPw github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.0 h1:tstDwfIjiHbnIjeM5Lp+pMrSeN+LCMsEwOrkPmWm03A= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= +github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1794,8 +1797,9 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go new file mode 100644 index 00000000000..5060847b9bf --- /dev/null +++ b/itests/deals_anycid_test.go @@ -0,0 +1,143 @@ +package itests + +import ( + "context" + "fmt" + "os" + "testing" + "time" + + "github.com/filecoin-project/lotus/api" + + ipld "github.com/ipfs/go-ipld-format" + + "github.com/filecoin-project/go-fil-markets/shared" + + "github.com/ipld/go-car" + + "github.com/stretchr/testify/require" + + "github.com/filecoin-project/lotus/node/modules/dtypes" + + "github.com/filecoin-project/go-fil-markets/storagemarket" + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/modules" + + "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/chain/actors/policy" + "github.com/filecoin-project/lotus/itests/kit" + logging "github.com/ipfs/go-log/v2" +) + +func TestDealRetrieveByAnyCid(t *testing.T) { + if testing.Short() { + t.Skip("skipping test in short mode") + } + + ctx := context.Background() + oldDelay := policy.GetPreCommitChallengeDelay() + policy.SetPreCommitChallengeDelay(5) + t.Cleanup(func() { + policy.SetPreCommitChallengeDelay(oldDelay) + }) + + // Allow 8MB sectors + kit.EnableLargeSectors(t) + policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg8MiBV1) + kit.QuietMiningLogs() + //logging.SetLogLevel("dagstore.invidx", "debug") + logging.SetLogLevel("markets-rtvl", "debug") + logging.SetLogLevel("markets-rtvl-reval", "debug") + + // For these tests where the block time is artificially short, just use + // a deal start epoch that is guaranteed to be far enough in the future + // so that the deal starts sealing in time + startEpoch := abi.ChainEpoch(2 << 12) + + // Override the dependency injection for the blockstore accessor, so that + // we can get a reference to the blockstore containing our deal later in + // the test + var bsa storagemarket.BlockstoreAccessor + bsaFn := func(importmgr dtypes.ClientImportMgr) storagemarket.BlockstoreAccessor { + bsa = modules.StorageBlockstoreAccessor(importmgr) + return bsa + } + bsaOpt := kit.ConstructorOpts(node.Override(new(storagemarket.BlockstoreAccessor), bsaFn)) + + // Allow 512MB sectors + eightMBSectorsOpt := kit.SectorSize(8 << 20) + + // Create a client, and a miner with its own full node + _, client, miner, ens := kit.EnsembleTwoOne(t, kit.MockProofs(), bsaOpt, eightMBSectorsOpt) + ens.InterconnectAll().BeginMining(250 * time.Millisecond) + + dh := kit.NewDealHarness(t, client, miner, miner) + + //res, path := client.CreateImportFile(ctx, 5, 140*1024*1024) + dagOpts := kit.GeneratedDAGOpts{ + ChunkSize: 1024, + Maxlinks: 2, + } + carv1FilePath, _ := kit.CreateRandomCARv1(t, 5, 8*1024, dagOpts) + res, err := client.ClientImport(ctx, api.FileRef{Path: carv1FilePath, IsCAR: true}) + require.NoError(t, err) + + // Get the blockstore for the file + bs, err := bsa.Get(res.Root) + require.NoError(t, err) + + // Get all CIDs from the file + sc := car.NewSelectiveCar(ctx, bs, []car.Dag{{Root: res.Root, Selector: shared.AllSelector()}}) + prepared, err := sc.Prepare() + require.NoError(t, err) + cids := prepared.Cids() + // fmt.Println(cids) + for i, c := range cids { + blk, err := bs.Get(c) + require.NoError(t, err) + + nd, err := ipld.Decode(blk) + require.NoError(t, err) + + fmt.Println(i, c, len(nd.Links())) + + if i > 100 { + break + } + } + + // Create a storage deal + dp := dh.DefaultStartDealParams() + dp.Data.Root = res.Root + dp.DealStartEpoch = startEpoch + dp.EpochPrice = abi.NewTokenAmount(62500000) // minimum asking price + dealCid := dh.StartDeal(ctx, dp) + + // Wait for the deal to be sealed + dh.WaitDealSealed(ctx, dealCid, false, false, nil) + + ask, err := miner.MarketGetRetrievalAsk(ctx) + require.NoError(t, err) + ask.PricePerByte = abi.NewTokenAmount(0) + ask.UnsealPrice = abi.NewTokenAmount(0) + err = miner.MarketSetRetrievalAsk(ctx, ask) + require.NoError(t, err) + + // Fetch the deal data + info, err := client.ClientGetDealInfo(ctx, *dealCid) + require.NoError(t, err) + + //targetCid := res.Root + targetCid := cids[1] + offer, err := client.ClientMinerQueryOffer(ctx, miner.ActorAddr, targetCid, &info.PieceCID) + require.NoError(t, err) + require.Empty(t, offer.Err) + + outPath := dh.PerformRetrievalForOffer(ctx, false, offer) + stat, err := os.Stat(outPath) + require.NoError(t, err) + fmt.Println(stat) + + // TODO: compare stored vs retrieved blocks + //kit.AssertFilesEqual(t, path, outPath) +} diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 4a9af69e627..3a7d941ff61 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -303,15 +303,19 @@ func (dh *DealHarness) StartSealingWaiting(ctx context.Context) { } } -func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool) (path string) { +func (dh *DealHarness) PerformRetrieval(ctx context.Context, dealCid *cid.Cid, root cid.Cid, carExport bool) (path string) { // perform retrieval. - info, err := dh.client.ClientGetDealInfo(ctx, *deal) + info, err := dh.client.ClientGetDealInfo(ctx, *dealCid) require.NoError(dh.t, err) offers, err := dh.client.ClientFindData(ctx, root, &info.PieceCID) require.NoError(dh.t, err) require.NotEmpty(dh.t, offers, "no offers") + return dh.PerformRetrievalForOffer(ctx, carExport, offers[0]) +} + +func (dh *DealHarness) PerformRetrievalForOffer(ctx context.Context, carExport bool, offer api.QueryOffer) string { carFile, err := ioutil.TempFile(dh.t.TempDir(), "ret-car") require.NoError(dh.t, err) @@ -325,7 +329,8 @@ func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root IsCAR: carExport, } - updates, err := dh.client.ClientRetrieveWithEvents(ctx, offers[0].Order(caddr), ref) + order := offer.Order(caddr) + updates, err := dh.client.ClientRetrieveWithEvents(ctx, order, ref) require.NoError(dh.t, err) for update := range updates { diff --git a/itests/kit/files.go b/itests/kit/files.go index 9babac94144..d69c6d7767e 100644 --- a/itests/kit/files.go +++ b/itests/kit/files.go @@ -29,7 +29,7 @@ import ( "github.com/stretchr/testify/require" ) -const unixfsChunkSize uint64 = 1 << 10 +const unixfsChunkSize int64 = 1 << 10 var defaultHashFunction = uint64(mh.BLAKE2B_MIN + 31) @@ -54,7 +54,7 @@ func CreateRandomFile(t *testing.T, rseed, size int) (path string) { // CreateRandomFile creates a normal file with the provided seed and the // provided size and then transforms it to a CARv1 file and returns it. -func CreateRandomCARv1(t *testing.T, rseed, size int) (carV1FilePath string, origFilePath string) { +func CreateRandomCARv1(t *testing.T, rseed, size int, opts ...GeneratedDAGOpts) (carV1FilePath string, origFilePath string) { ctx := context.Background() if size == 0 { size = 1600 @@ -75,7 +75,7 @@ func CreateRandomCARv1(t *testing.T, rseed, size int) (carV1FilePath string, ori bs := bstore.NewBlockstore(dssync.MutexWrap(ds.NewMapDatastore())) dagSvc := merkledag.NewDAGService(blockservice.New(bs, offline.Exchange(bs))) - root := writeUnixfsDAG(ctx, t, file, dagSvc) + root := writeUnixfsDAG(ctx, t, file, dagSvc, opts...) // create a CARv1 file from the DAG tmp, err := os.CreateTemp(t.TempDir(), "randcarv1") @@ -92,7 +92,20 @@ func CreateRandomCARv1(t *testing.T, rseed, size int) (carV1FilePath string, ori return tmp.Name(), file.Name() } -func writeUnixfsDAG(ctx context.Context, t *testing.T, rd io.Reader, dag ipldformat.DAGService) cid.Cid { +type GeneratedDAGOpts struct { + ChunkSize int64 + Maxlinks int +} + +func writeUnixfsDAG(ctx context.Context, t *testing.T, rd io.Reader, dag ipldformat.DAGService, opts ...GeneratedDAGOpts) cid.Cid { + dagOpts := GeneratedDAGOpts{ + ChunkSize: unixfsChunkSize, + Maxlinks: 1024, + } + if len(opts) > 0 { + dagOpts = opts[0] + } + rpf := files.NewReaderFile(rd) // generate the dag and get the root @@ -103,7 +116,7 @@ func writeUnixfsDAG(ctx context.Context, t *testing.T, rd io.Reader, dag ipldfor bufferedDS := ipldformat.NewBufferedDAG(ctx, dag) params := ihelper.DagBuilderParams{ - Maxlinks: 1024, + Maxlinks: dagOpts.Maxlinks, RawLeaves: true, CidBuilder: cidutil.InlineBuilder{ Builder: prefix, @@ -112,7 +125,7 @@ func writeUnixfsDAG(ctx context.Context, t *testing.T, rd io.Reader, dag ipldfor Dagserv: bufferedDS, } - db, err := params.New(chunk.NewSizeSplitter(rpf, int64(unixfsChunkSize))) + db, err := params.New(chunk.NewSizeSplitter(rpf, dagOpts.ChunkSize)) require.NoError(t, err) nd, err := balanced.Layout(db) diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go index 3d92886598e..6a32c011aae 100644 --- a/markets/dagstore/wrapper.go +++ b/markets/dagstore/wrapper.go @@ -3,6 +3,7 @@ package dagstore import ( "context" "errors" + "fmt" "math" "os" "path/filepath" @@ -398,6 +399,29 @@ func (w *Wrapper) markRegistrationComplete() error { return file.Close() } +// Get all the pieces that contain a block +func (w *Wrapper) GetPiecesContainingBlock(blockCID cid.Cid) ([]cid.Cid, error) { + // Pieces are stored as "shards" in the DAG store + shardKeys, err := w.dagst.GetShardKeysForCid(blockCID) + if err != nil { + return nil, xerrors.Errorf("getting pieces containing block %s: %w", blockCID, err) + } + + // Convert from shard key to cid + pieceCids := make([]cid.Cid, 0, len(shardKeys)) + for _, k := range shardKeys { + c, err := cid.Parse(k.String()) + if err != nil { + prefix := fmt.Sprintf("getting pieces containing block %s:", blockCID) + return nil, xerrors.Errorf(prefix+" converting shard key %s to piece cid: %w", k, err) + } + + pieceCids = append(pieceCids, c) + } + + return pieceCids, nil +} + func (w *Wrapper) Close() error { // Cancel the context w.cancel() From 053317e33471362f988930044e16c510b9e873cf Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Fri, 17 Sep 2021 11:27:53 +0400 Subject: [PATCH 02/99] test for retrieval by any cid --- itests/deals_anycid_test.go | 37 +++++++++++++++++++++++-------------- itests/kit/deals.go | 13 ++++--------- 2 files changed, 27 insertions(+), 23 deletions(-) diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index 5060847b9bf..29c802b4be5 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -1,6 +1,7 @@ package itests import ( + "bufio" "context" "fmt" "os" @@ -76,9 +77,9 @@ func TestDealRetrieveByAnyCid(t *testing.T) { //res, path := client.CreateImportFile(ctx, 5, 140*1024*1024) dagOpts := kit.GeneratedDAGOpts{ ChunkSize: 1024, - Maxlinks: 2, + Maxlinks: 10, } - carv1FilePath, _ := kit.CreateRandomCARv1(t, 5, 8*1024, dagOpts) + carv1FilePath, _ := kit.CreateRandomCARv1(t, 5, 100*1024, dagOpts) res, err := client.ClientImport(ctx, api.FileRef{Path: carv1FilePath, IsCAR: true}) require.NoError(t, err) @@ -91,7 +92,6 @@ func TestDealRetrieveByAnyCid(t *testing.T) { prepared, err := sc.Prepare() require.NoError(t, err) cids := prepared.Cids() - // fmt.Println(cids) for i, c := range cids { blk, err := bs.Get(c) require.NoError(t, err) @@ -127,17 +127,26 @@ func TestDealRetrieveByAnyCid(t *testing.T) { info, err := client.ClientGetDealInfo(ctx, *dealCid) require.NoError(t, err) - //targetCid := res.Root - targetCid := cids[1] - offer, err := client.ClientMinerQueryOffer(ctx, miner.ActorAddr, targetCid, &info.PieceCID) - require.NoError(t, err) - require.Empty(t, offer.Err) + cidIndices := []int{1, 11, 27, 32, 47} - outPath := dh.PerformRetrievalForOffer(ctx, false, offer) - stat, err := os.Stat(outPath) - require.NoError(t, err) - fmt.Println(stat) + for _, val := range cidIndices { + fmt.Println("performing retrieval for cid at index", val) + targetCid := cids[val] + offer, err := client.ClientMinerQueryOffer(ctx, miner.ActorAddr, targetCid, &info.PieceCID) + require.NoError(t, err) + require.Empty(t, offer.Err) + + outPath := dh.PerformRetrievalForOffer(ctx, true, offer) + _, err = os.Stat(outPath) + require.NoError(t, err) + + f, err := os.Open(outPath) + require.NoError(t, err) + defer f.Close() + + ch, _, _ := car.ReadHeader(bufio.NewReader(f)) + require.EqualValues(t, ch.Roots[0], targetCid) + } - // TODO: compare stored vs retrieved blocks - //kit.AssertFilesEqual(t, path, outPath) + fmt.Println("finised test") } diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 3a7d941ff61..64842eb7fad 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -316,16 +316,16 @@ func (dh *DealHarness) PerformRetrieval(ctx context.Context, dealCid *cid.Cid, r } func (dh *DealHarness) PerformRetrievalForOffer(ctx context.Context, carExport bool, offer api.QueryOffer) string { - carFile, err := ioutil.TempFile(dh.t.TempDir(), "ret-car") + outputF, err := ioutil.TempFile(dh.t.TempDir(), "ret-car") require.NoError(dh.t, err) - defer carFile.Close() //nolint:errcheck + defer outputF.Close() //nolint:errcheck caddr, err := dh.client.WalletDefaultAddress(ctx) require.NoError(dh.t, err) ref := &api.FileRef{ - Path: carFile.Name(), + Path: outputF.Name(), IsCAR: carExport, } @@ -337,12 +337,7 @@ func (dh *DealHarness) PerformRetrievalForOffer(ctx context.Context, carExport b require.Emptyf(dh.t, update.Err, "retrieval failed: %s", update.Err) } - ret := carFile.Name() - if carExport { - actualFile := dh.ExtractFileFromCAR(ctx, carFile) - ret = actualFile.Name() - _ = actualFile.Close() //nolint:errcheck - } + ret := outputF.Name() return ret } From 4d87f16e958293cbcb2bd335a0ad8fe0efd1b538 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Fri, 17 Sep 2021 12:52:31 +0400 Subject: [PATCH 03/99] better comparision in test --- itests/deals_anycid_test.go | 46 ++++++++++++++++++++++++++++++------- 1 file changed, 38 insertions(+), 8 deletions(-) diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index 29c802b4be5..88ef0d6fdad 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -4,10 +4,13 @@ import ( "bufio" "context" "fmt" + "io/ioutil" "os" "testing" "time" + "github.com/ipld/go-car/v2/blockstore" + "github.com/filecoin-project/lotus/api" ipld "github.com/ipfs/go-ipld-format" @@ -128,25 +131,52 @@ func TestDealRetrieveByAnyCid(t *testing.T) { require.NoError(t, err) cidIndices := []int{1, 11, 27, 32, 47} - for _, val := range cidIndices { fmt.Println("performing retrieval for cid at index", val) + targetCid := cids[val] offer, err := client.ClientMinerQueryOffer(ctx, miner.ActorAddr, targetCid, &info.PieceCID) require.NoError(t, err) require.Empty(t, offer.Err) - outPath := dh.PerformRetrievalForOffer(ctx, true, offer) - _, err = os.Stat(outPath) + // retrieve in a CAR file and ensure roots match + outputCar := dh.PerformRetrievalForOffer(ctx, true, offer) + _, err = os.Stat(outputCar) require.NoError(t, err) - - f, err := os.Open(outPath) + f, err := os.Open(outputCar) require.NoError(t, err) - defer f.Close() - ch, _, _ := car.ReadHeader(bufio.NewReader(f)) require.EqualValues(t, ch.Roots[0], targetCid) + require.NoError(t, f.Close()) + + // create CAR from original file starting at targetCid and ensure it matches the retrieved CAR file. + tmp, err := os.CreateTemp(t.TempDir(), "randcarv1") + require.NoError(t, err) + rd, err := blockstore.OpenReadOnly(carv1FilePath, blockstore.UseWholeCIDs(true)) + require.NoError(t, err) + err = car.NewSelectiveCar( + ctx, + rd, + []car.Dag{{ + Root: targetCid, + Selector: shared.AllSelector(), + }}, + ).Write(tmp) + require.NoError(t, tmp.Close()) + require.NoError(t, rd.Close()) + + originalF, err := os.Open(tmp.Name()) + require.NoError(t, err) + obz, err := ioutil.ReadAll(originalF) + require.NoError(t, err) + + rf, err := os.Open(outputCar) + require.NoError(t, err) + bz, err := ioutil.ReadAll(rf) + require.NoError(t, err) + require.EqualValues(t, obz, bz) + fmt.Println("car files match") } - fmt.Println("finised test") + fmt.Println("finished test") } From e309293a4759449e0cc88ae260003283b0056f69 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Sep 2021 15:32:29 +0200 Subject: [PATCH 04/99] fix: lint fixes --- itests/deals_anycid_test.go | 61 ++++++++++++------------------------- 1 file changed, 19 insertions(+), 42 deletions(-) diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index 88ef0d6fdad..ad97a634a4b 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -3,34 +3,25 @@ package itests import ( "bufio" "context" - "fmt" - "io/ioutil" "os" "testing" "time" - "github.com/ipld/go-car/v2/blockstore" - - "github.com/filecoin-project/lotus/api" - + "github.com/filecoin-project/go-state-types/abi" ipld "github.com/ipfs/go-ipld-format" - - "github.com/filecoin-project/go-fil-markets/shared" - "github.com/ipld/go-car" - + "github.com/ipld/go-car/v2/blockstore" "github.com/stretchr/testify/require" - "github.com/filecoin-project/lotus/node/modules/dtypes" - + "github.com/filecoin-project/go-fil-markets/shared" "github.com/filecoin-project/go-fil-markets/storagemarket" - "github.com/filecoin-project/lotus/node" - "github.com/filecoin-project/lotus/node/modules" - "github.com/filecoin-project/go-state-types/abi" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/itests/kit" - logging "github.com/ipfs/go-log/v2" + "github.com/filecoin-project/lotus/node" + "github.com/filecoin-project/lotus/node/modules" + "github.com/filecoin-project/lotus/node/modules/dtypes" ) func TestDealRetrieveByAnyCid(t *testing.T) { @@ -46,12 +37,8 @@ func TestDealRetrieveByAnyCid(t *testing.T) { }) // Allow 8MB sectors - kit.EnableLargeSectors(t) policy.SetSupportedProofTypes(abi.RegisteredSealProof_StackedDrg8MiBV1) kit.QuietMiningLogs() - //logging.SetLogLevel("dagstore.invidx", "debug") - logging.SetLogLevel("markets-rtvl", "debug") - logging.SetLogLevel("markets-rtvl-reval", "debug") // For these tests where the block time is artificially short, just use // a deal start epoch that is guaranteed to be far enough in the future @@ -68,7 +55,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { } bsaOpt := kit.ConstructorOpts(node.Override(new(storagemarket.BlockstoreAccessor), bsaFn)) - // Allow 512MB sectors + // Allow 8MB sectors eightMBSectorsOpt := kit.SectorSize(8 << 20) // Create a client, and a miner with its own full node @@ -77,10 +64,14 @@ func TestDealRetrieveByAnyCid(t *testing.T) { dh := kit.NewDealHarness(t, client, miner, miner) - //res, path := client.CreateImportFile(ctx, 5, 140*1024*1024) + // Generate a DAG with multiple levels, so that we can test the case where + // the client requests a CID for a block which is not the root block but + // does have a subtree below it in the DAG dagOpts := kit.GeneratedDAGOpts{ + // Max size of a block ChunkSize: 1024, - Maxlinks: 10, + // Max links from a block to other blocks + Maxlinks: 10, } carv1FilePath, _ := kit.CreateRandomCARv1(t, 5, 100*1024, dagOpts) res, err := client.ClientImport(ctx, api.FileRef{Path: carv1FilePath, IsCAR: true}) @@ -102,11 +93,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { nd, err := ipld.Decode(blk) require.NoError(t, err) - fmt.Println(i, c, len(nd.Links())) - - if i > 100 { - break - } + t.Log(i, c, len(nd.Links())) } // Create a storage deal @@ -130,9 +117,10 @@ func TestDealRetrieveByAnyCid(t *testing.T) { info, err := client.ClientGetDealInfo(ctx, *dealCid) require.NoError(t, err) + // Make retrievals against CIDs at different levels in the DAG cidIndices := []int{1, 11, 27, 32, 47} for _, val := range cidIndices { - fmt.Println("performing retrieval for cid at index", val) + t.Logf("performing retrieval for cid at index %d", val) targetCid := cids[val] offer, err := client.ClientMinerQueryOffer(ctx, miner.ActorAddr, targetCid, &info.PieceCID) @@ -165,18 +153,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { require.NoError(t, tmp.Close()) require.NoError(t, rd.Close()) - originalF, err := os.Open(tmp.Name()) - require.NoError(t, err) - obz, err := ioutil.ReadAll(originalF) - require.NoError(t, err) - - rf, err := os.Open(outputCar) - require.NoError(t, err) - bz, err := ioutil.ReadAll(rf) - require.NoError(t, err) - require.EqualValues(t, obz, bz) - fmt.Println("car files match") + kit.AssertFilesEqual(t, tmp.Name(), outputCar) + t.Log("car files match") } - - fmt.Println("finished test") } From 3c37078a856b6de01de74f428ada31b5bcac67a9 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Fri, 17 Sep 2021 15:35:37 +0200 Subject: [PATCH 05/99] fix: dagstore wrapper test --- markets/dagstore/wrapper_test.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go index 9d3e6939e99..578dc0b74a2 100644 --- a/markets/dagstore/wrapper_test.go +++ b/markets/dagstore/wrapper_test.go @@ -132,6 +132,10 @@ type mockDagStore struct { close chan struct{} } +func (m *mockDagStore) GetShardKeysForCid(c cid.Cid) ([]shard.Key, error) { + panic("implement me") +} + func (m *mockDagStore) DestroyShard(ctx context.Context, key shard.Key, out chan dagstore.ShardResult, _ dagstore.DestroyOpts) error { panic("implement me") } From 189f5f8aaec28c5e6d275ac8ba709e454b9cc986 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Mon, 20 Sep 2021 10:04:21 +0400 Subject: [PATCH 06/99] fix deals test --- itests/deals_anycid_test.go | 1 + itests/kit/deals.go | 14 +++++++++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index ad97a634a4b..6b314908bd1 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -150,6 +150,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { Selector: shared.AllSelector(), }}, ).Write(tmp) + require.NoError(t, err) require.NoError(t, tmp.Close()) require.NoError(t, rd.Close()) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index 64842eb7fad..c96d18acfb5 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -377,6 +377,7 @@ type RunConcurrentDealsOpts struct { } func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { + ctx := context.Background() errgrp, _ := errgroup.WithContext(context.Background()) for i := 0; i < opts.N; i++ { i := i @@ -402,7 +403,18 @@ func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { dh.t.Logf("retrieving deal %d/%d", i, opts.N) outPath := dh.PerformRetrieval(context.Background(), deal, res.Root, opts.CarExport) - AssertFilesEqual(dh.t, inPath, outPath) + + if opts.CarExport { + f, err := os.Open(outPath) + require.NoError(dh.t, err) + actualFile := dh.ExtractFileFromCAR(ctx, f) + require.NoError(dh.t, f.Close()) + + AssertFilesEqual(dh.t, inPath, actualFile.Name()) + } else { + AssertFilesEqual(dh.t, inPath, outPath) + } + return nil }) } From 025d8ebc59f406c7d3e9879ecea6037c915daa0a Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 20 Sep 2021 12:08:43 +0200 Subject: [PATCH 07/99] feat: include TestDealRetrieveByAnyCid in CI --- .circleci/config.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/.circleci/config.yml b/.circleci/config.yml index 30f2d5c01fd..721a620fe3b 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -785,6 +785,11 @@ workflows: suite: itest-deals_512mb target: "./itests/deals_512mb_test.go" + - test: + name: test-itest-deals_anycid + suite: itest-deals_anycid + target: "./itests/deals_anycid_test.go" + - test: name: test-itest-deals_concurrent suite: itest-deals_concurrent From 588d6ec828cbee7382fc711d5bc69ef08cffd6d6 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 20 Sep 2021 13:26:55 +0200 Subject: [PATCH 08/99] fix: docs-gen --- documentation/en/cli-lotus-miner.md | 153 +++++++++----------- documentation/en/cli-lotus-worker.md | 6 +- documentation/en/cli-lotus.md | 203 ++++++++++++--------------- 3 files changed, 153 insertions(+), 209 deletions(-) diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index a88a1af4226..d5b94fb8965 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -78,7 +78,6 @@ OPTIONS: --gas-premium value set gas premium for initialization messages in AttoFIL (default: "0") --from value select which address to send actor creation message from --help, -h show help (default: false) - --version, -v print the version (default: false) ``` @@ -160,8 +159,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -203,11 +201,11 @@ USAGE: DESCRIPTION: The backup command writes a copy of node metadata under the specified path - -Online backups: -For security reasons, the daemon must be have LOTUS_BACKUP_BASE_PATH env var set -to a path where backup files are supposed to be saved, and the path specified in -this command must be within this base path + + Online backups: + For security reasons, the daemon must be have LOTUS_BACKUP_BASE_PATH env var set + to a path where backup files are supposed to be saved, and the path specified in + this command must be within this base path OPTIONS: --offline create backup without the node running (default: false) @@ -249,8 +247,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -339,8 +336,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -433,7 +429,6 @@ OPTIONS: --hide-sectors-info hide sectors info (default: false) --blocks value Log of produced newest blocks and rewards(Miner Fee excluded) (default: 0) --help, -h show help (default: false) - --version, -v print the version (default: false) ``` @@ -464,8 +459,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -512,8 +506,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -540,23 +533,22 @@ USAGE: DESCRIPTION: Set the log level for logging systems: - - The system flag can be specified multiple times. - - eg) log set-level --system chain --system chainxchg debug - - Available Levels: - debug - info - warn - error - - Environment Variables: - GOLOG_LOG_LEVEL - Default log level for all log systems - GOLOG_LOG_FMT - Change output log format (json, nocolor) - GOLOG_FILE - Write logs to file - GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr - + + The system flag can be specified multiple times. + + eg) log set-level --system chain --system chainxchg debug + + Available Levels: + debug + info + warn + error + + Environment Variables: + GOLOG_LOG_LEVEL - Default log level for all log systems + GOLOG_LOG_FMT - Change output log format (json, nocolor) + GOLOG_FILE - Write logs to file + GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr OPTIONS: --system value limit to log system @@ -634,8 +626,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -683,8 +674,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -856,8 +846,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -876,8 +865,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -980,8 +968,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1051,8 +1038,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1149,8 +1135,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1278,8 +1263,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1298,8 +1282,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1357,8 +1340,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1433,8 +1415,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1518,8 +1499,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1687,7 +1667,6 @@ COMMANDS: OPTIONS: --really-do-it pass this flag if you know what you are doing (default: false) --help, -h show help (default: false) - --version, -v print the version (default: false) ``` @@ -1798,8 +1777,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1848,8 +1826,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1931,9 +1908,9 @@ USAGE: DESCRIPTION: Sectors can be stored across many filesystem paths. These -commands provide ways to manage the storage the miner will used to store sectors -long term for proving (references as 'store') as well as how sectors will be -stored while moving through the sealing pipeline (references as 'seal'). + commands provide ways to manage the storage the miner will used to store sectors + long term for proving (references as 'store') as well as how sectors will be + stored while moving through the sealing pipeline (references as 'seal'). COMMANDS: attach attach local storage path @@ -1943,8 +1920,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1958,24 +1934,23 @@ USAGE: DESCRIPTION: Storage can be attached to the miner using this command. The storage volume -list is stored local to the miner in $LOTUS_MINER_PATH/storage.json. We do not -recommend manually modifying this value without further understanding of the -storage system. - -Each storage volume contains a configuration file which describes the -capabilities of the volume. When the '--init' flag is provided, this file will -be created using the additional flags. - -Weight -A high weight value means data will be more likely to be stored in this path - -Seal -Data for the sealing process will be stored here - -Store -Finalized sectors that will be moved here for long term storage and be proven -over time + list is stored local to the miner in $LOTUS_MINER_PATH/storage.json. We do not + recommend manually modifying this value without further understanding of the + storage system. + + Each storage volume contains a configuration file which describes the + capabilities of the volume. When the '--init' flag is provided, this file will + be created using the additional flags. + Weight + A high weight value means data will be more likely to be stored in this path + + Seal + Data for the sealing process will be stored here + + Store + Finalized sectors that will be moved here for long term storage and be proven + over time OPTIONS: --init initialize the path first (default: false) @@ -2000,9 +1975,8 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --color use color in display output (default: depends on output being a TTY) - --help, -h show help (default: false) - --version, -v print the version (default: false) + --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) ``` @@ -2063,8 +2037,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` diff --git a/documentation/en/cli-lotus-worker.md b/documentation/en/cli-lotus-worker.md index da6cefd18ab..3914a9cc0e4 100644 --- a/documentation/en/cli-lotus-worker.md +++ b/documentation/en/cli-lotus-worker.md @@ -75,8 +75,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -139,8 +138,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index b0c5739188a..28f14c85a53 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -71,7 +71,6 @@ OPTIONS: --restore value restore from backup file --restore-config value config file to use when restoring from backup --help, -h show help (default: false) - --version, -v print the version (default: false) ``` @@ -98,11 +97,11 @@ USAGE: DESCRIPTION: The backup command writes a copy of node metadata under the specified path - -Online backups: -For security reasons, the daemon must be have LOTUS_BACKUP_BASE_PATH env var set -to a path where backup files are supposed to be saved, and the path specified in -this command must be within this base path + + Online backups: + For security reasons, the daemon must be have LOTUS_BACKUP_BASE_PATH env var set + to a path where backup files are supposed to be saved, and the path specified in + this command must be within this base path OPTIONS: --offline create backup without the node running (default: false) @@ -124,8 +123,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -218,8 +216,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -372,8 +369,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -445,8 +441,7 @@ COMMANDS: cancel-transfer Force cancel a data transfer OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -607,13 +602,13 @@ CATEGORY: DESCRIPTION: Make a deal with a miner. -dataCid comes from running 'lotus client import'. -miner is the address of the miner you wish to make a deal with. -price is measured in FIL/Epoch. Miners usually don't accept a bid -lower than their advertised ask (which is in FIL/GiB/Epoch). You can check a miners listed price -with 'lotus client query-ask '. -duration is how long the miner should store the data for, in blocks. -The minimum value is 518400 (6 months). + dataCid comes from running 'lotus client import'. + miner is the address of the miner you wish to make a deal with. + price is measured in FIL/Epoch. Miners usually don't accept a bid + lower than their advertised ask (which is in FIL/GiB/Epoch). You can check a miners listed price + with 'lotus client query-ask '. + duration is how long the miner should store the data for, in blocks. + The minimum value is 518400 (6 months). OPTIONS: --manual-piece-cid value manually specify piece commitment for data (dataCid must be to a car file) @@ -873,7 +868,6 @@ COMMANDS: OPTIONS: --confidence value number of block confirmations to wait for (default: 5) --help, -h show help (default: false) - --version, -v print the version (default: false) ``` @@ -1125,8 +1119,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1215,8 +1208,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1265,8 +1257,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1417,8 +1408,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1470,8 +1460,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1621,7 +1610,6 @@ COMMANDS: OPTIONS: --tipset value specify tipset to call method on (pass comma separated array of cids) --help, -h show help (default: false) - --version, -v print the version (default: false) ``` @@ -1906,8 +1894,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -1992,8 +1979,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2064,10 +2050,9 @@ USAGE: DESCRIPTION: Collect object size and ipld link count for an object. - - When a base is provided it will be walked first, and all links visisted - will be ignored when the passed in object is walked. - + + When a base is provided it will be walked first, and all links visisted + will be ignored when the passed in object is walked. OPTIONS: --base value ignore links found in this obj @@ -2117,34 +2102,33 @@ USAGE: DESCRIPTION: Get ipld node under a specified path: - - lotus chain get /ipfs/[cid]/some/path - - Path prefixes: - - /ipfs/[cid], /ipld/[cid] - traverse IPLD path - - /pstate - traverse from head.ParentStateRoot - - Note: - You can use special path elements to traverse through some data structures: - - /ipfs/[cid]/@H:elem - get 'elem' from hamt - - /ipfs/[cid]/@Hi:123 - get varint elem 123 from hamt - - /ipfs/[cid]/@Hu:123 - get uvarint elem 123 from hamt - - /ipfs/[cid]/@Ha:t01 - get element under Addr(t01).Bytes - - /ipfs/[cid]/@A:10 - get 10th amt element - - .../@Ha:t01/@state - get pretty map-based actor state - - List of --as-type types: - - raw - - block - - message - - smessage, signedmessage - - actor - - amt - - hamt-epoch - - hamt-address - - cronevent - - account-state - + + lotus chain get /ipfs/[cid]/some/path + + Path prefixes: + - /ipfs/[cid], /ipld/[cid] - traverse IPLD path + - /pstate - traverse from head.ParentStateRoot + + Note: + You can use special path elements to traverse through some data structures: + - /ipfs/[cid]/@H:elem - get 'elem' from hamt + - /ipfs/[cid]/@Hi:123 - get varint elem 123 from hamt + - /ipfs/[cid]/@Hu:123 - get uvarint elem 123 from hamt + - /ipfs/[cid]/@Ha:t01 - get element under Addr(t01).Bytes + - /ipfs/[cid]/@A:10 - get 10th amt element + - .../@Ha:t01/@state - get pretty map-based actor state + + List of --as-type types: + - raw + - block + - message + - smessage, signedmessage + - actor + - amt + - hamt-epoch + - hamt-address + - cronevent + - account-state OPTIONS: --as-type value specify type to interpret output as @@ -2164,18 +2148,17 @@ USAGE: DESCRIPTION: Bisect the chain state tree: - - lotus chain bisect [min height] [max height] '1/2/3/state/path' 'shell command' 'args' - - Returns the first tipset in which condition is true - v - [start] FFFFFFFTTT [end] - - Example: find height at which deal ID 100 000 appeared - - lotus chain bisect 1 32000 '@Ha:t03/1' jq -e '.[2] > 100000' - - For special path elements see 'chain get' help - + + lotus chain bisect [min height] [max height] '1/2/3/state/path' 'shell command' 'args' + + Returns the first tipset in which condition is true + v + [start] FFFFFFFTTT [end] + + Example: find height at which deal ID 100 000 appeared + - lotus chain bisect 1 32000 '@Ha:t03/1' jq -e '.[2] > 100000' + + For special path elements see 'chain get' help OPTIONS: --help, -h show help (default: false) @@ -2255,8 +2238,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2288,8 +2270,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2326,7 +2307,6 @@ OPTIONS: --max-fee value Spend up to X FIL per DisputeWindowedPoSt message --from value optionally specify the account to send messages from --help, -h show help (default: false) - --version, -v print the version (default: false) ``` @@ -2372,8 +2352,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2400,23 +2379,22 @@ USAGE: DESCRIPTION: Set the log level for logging systems: - - The system flag can be specified multiple times. - - eg) log set-level --system chain --system chainxchg debug - - Available Levels: - debug - info - warn - error - - Environment Variables: - GOLOG_LOG_LEVEL - Default log level for all log systems - GOLOG_LOG_FMT - Change output log format (json, nocolor) - GOLOG_FILE - Write logs to file - GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr - + + The system flag can be specified multiple times. + + eg) log set-level --system chain --system chainxchg debug + + Available Levels: + debug + info + warn + error + + Environment Variables: + GOLOG_LOG_LEVEL - Default log level for all log systems + GOLOG_LOG_FMT - Change output log format (json, nocolor) + GOLOG_FILE - Write logs to file + GOLOG_OUTPUT - Specify whether to output to file, stderr, stdout or a combination, i.e. file+stderr OPTIONS: --system value limit to log system @@ -2492,8 +2470,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2621,8 +2598,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2641,8 +2617,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2700,8 +2675,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` @@ -2775,8 +2749,7 @@ COMMANDS: help, h Shows a list of commands or help for one command OPTIONS: - --help, -h show help (default: false) - --version, -v print the version (default: false) + --help, -h show help (default: false) ``` From a633f93707e36688be21e1e36a07409ad7db253e Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Fri, 12 Nov 2021 12:28:43 +0100 Subject: [PATCH 09/99] upgrade go modules --- go.mod | 10 +++++----- go.sum | 22 ++++++++++------------ 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index daeb3847d2a..6d2c76d5421 100644 --- a/go.mod +++ b/go.mod @@ -36,11 +36,11 @@ require ( github.com/filecoin-project/go-data-transfer v1.11.4 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.12.1-0.20210916145046-d81117f778de - github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec - github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 - github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498 - github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e + github.com/filecoin-project/go-fil-markets v1.13.3 + github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-padreader v0.0.1 + github.com/filecoin-project/go-paramfetch v0.0.2 + github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b diff --git a/go.sum b/go.sum index 0eb3c7d054d..d12c2ae1da7 100644 --- a/go.sum +++ b/go.sum @@ -327,7 +327,6 @@ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.10.0/go.mod h1:uQtqy6vUAY5v70ZHdkF5mJ8CjVtjj/JA3aOoaqzWTVw= github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= @@ -339,8 +338,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.12.1-0.20210916145046-d81117f778de h1:QTcLAfS3DAWtWvwCG49wjN8jX0sJArnwOyyKQwbvBmU= -github.com/filecoin-project/go-fil-markets v1.12.1-0.20210916145046-d81117f778de/go.mod h1:XuuZFaFujI47nrgfQJiq7jWB+6rRya6nm7Sj6uXQ80U= +github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= +github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -348,22 +347,24 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec h1:rGI5I7fdU4viManxmDdbk5deZO7afe6L1Wc04dAmlOM= -github.com/filecoin-project/go-jsonrpc v0.1.4-0.20210217175800-45ea43ac2bec/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= +github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= -github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1 h1:0BogtftbcgyBx4lP2JWM00ZK7/pXmgnrDqKp9aLTgVs= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= -github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498 h1:G10ezOvpH1CLXQ19EA9VWNwyL0mg536ujSayjV0yg0k= -github.com/filecoin-project/go-paramfetch v0.0.2-0.20210614165157-25a6c7769498/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= +github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= +github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= +github.com/filecoin-project/go-paramfetch v0.0.2 h1:a6W3Ij6CKhwHYYlx+5mqvBIyw4CabZH2ojdEaoAZ6/g= +github.com/filecoin-project/go-paramfetch v0.0.2/go.mod h1:1FH85P8U+DUEmWk1Jkw3Bw7FrwTVUNHk/95PSPG+dts= github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200904021452-1883f36ca2f4/go.mod h1:IQ0MBPnonv35CJHtWSN3YY1Hz2gkPru1Q9qoaYLxx9I= github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e h1:XAgb6HmgXaGRklNjhZoNMSIYriKLqjWXIqYMotg6iSs= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= +github.com/filecoin-project/go-state-types v0.1.1 h1:LR260vya4p++atgf256W6yV3Lxl5mKrBFcEZePWQrdg= +github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-statemachine v0.0.0-20200925024713-05bd7c71fbfe/go.mod h1:FGwQgZAt2Gh5mjlwJUlVB62JeYdo+if0xWxSEfBD9ig= github.com/filecoin-project/go-statemachine v1.0.1 h1:LQ60+JDVjMdLxXmVFM2jjontzOYnfVE7u02CXV3WKSw= github.com/filecoin-project/go-statemachine v1.0.1/go.mod h1:jZdXXiHa61n4NmgWFG4w8tnqgvZVHYbJ3yW7+y8bF54= @@ -741,7 +742,6 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= -github.com/ipfs/go-graphsync v0.9.0/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= @@ -861,7 +861,6 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.1-0.20210601190600-f512dac51e8e/go.mod h1:wUxBdwOLA9/0HZBi3fnTBzla0MuwlqgJLyrhOg1XaKI= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= @@ -879,7 +878,6 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= From 627d4fbf745736b6b1b0e3daf4896f2cd44a7156 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 10 Nov 2021 17:28:23 +0100 Subject: [PATCH 10/99] wip: storage miner index provider --- go.mod | 19 ++-- go.sum | 79 +++++++++++--- itests/deals_concurrent_test.go | 17 ++- itests/kit/deals.go | 9 ++ markets/dagstore/wrapper.go | 7 +- node/builder_miner.go | 2 + node/config/def.go | 9 ++ node/config/types.go | 29 +++-- node/modules/storageminer.go | 3 + node/modules/storageminer_idxprov.go | 158 +++++++++++++++++++++++++++ 10 files changed, 292 insertions(+), 40 deletions(-) create mode 100644 node/modules/storageminer_idxprov.go diff --git a/go.mod b/go.mod index 6d2c76d5421..a6009b334d9 100644 --- a/go.mod +++ b/go.mod @@ -26,14 +26,14 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5 + github.com/filecoin-project/dagstore v0.5.0 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 - github.com/filecoin-project/go-commp-utils v0.1.2 + github.com/filecoin-project/go-commp-utils v0.1.3 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.4 + github.com/filecoin-project/go-data-transfer v1.11.6-0.20211116162442-2d8068920bda github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.13.3 @@ -44,6 +44,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b + github.com/filecoin-project/index-provider v0.0.0-20211116104945-9f8f1785e3c2 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 github.com/filecoin-project/specs-actors/v3 v3.1.1 @@ -66,7 +67,7 @@ require ( github.com/icza/backscanner v0.0.0-20210726202459-ac2ffc679f94 github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab github.com/ipfs/bbloom v0.0.4 - github.com/ipfs/go-bitswap v0.3.4 + github.com/ipfs/go-bitswap v0.4.0 github.com/ipfs/go-block-format v0.0.3 github.com/ipfs/go-blockservice v0.1.7 github.com/ipfs/go-cid v0.1.0 @@ -97,10 +98,10 @@ require ( github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 - github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 - github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26 + github.com/ipld/go-car v0.3.2 + github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.12.3 + github.com/ipld/go-ipld-prime v0.14.0 github.com/ipld/go-ipld-selector-text-lite v0.0.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 @@ -114,7 +115,7 @@ require ( github.com/libp2p/go-libp2p-noise v0.2.2 github.com/libp2p/go-libp2p-peerstore v0.3.0 github.com/libp2p/go-libp2p-pubsub v0.5.6 - github.com/libp2p/go-libp2p-quic-transport v0.11.2 + github.com/libp2p/go-libp2p-quic-transport v0.12.0 github.com/libp2p/go-libp2p-record v0.1.3 github.com/libp2p/go-libp2p-routing-helpers v0.2.3 github.com/libp2p/go-libp2p-swarm v0.5.3 @@ -128,7 +129,7 @@ require ( github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.16 + github.com/multiformats/go-multihash v0.1.0 github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 diff --git a/go.sum b/go.sum index d12c2ae1da7..84a34761e9d 100644 --- a/go.sum +++ b/go.sum @@ -89,6 +89,7 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 h1:T3+cD5fYvuH36h7EZq+TDpm+d8a6FSD4pQsbmuGGQ8o= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -302,8 +303,8 @@ github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5 h1:wtKBSxmV5ohSeZHS86TrLtw6m1dO88QaNo6az/QRrYU= -github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5/go.mod h1:dsWYxyEYa5aB62UXJcQhwlIaBOS+kkrKQgYGxwAnmkE= +github.com/filecoin-project/dagstore v0.5.0 h1:akiheGtSCU7aGon6T74bwNbDhYW0XZCTsnORKNmzSgU= +github.com/filecoin-project/dagstore v0.5.0/go.mod h1:Id2VG7uZxnF6NWR3JX1evNA83JonnU0U7Fc2r14Vltc= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -321,14 +322,17 @@ github.com/filecoin-project/go-cbor-util v0.0.0-20191219014500-08c40a1e63a2/go.m github.com/filecoin-project/go-cbor-util v0.0.1 h1:E1LYZYTtjfAQwCReho0VXvbu8t3CYAVPiMx8EiV/VAs= github.com/filecoin-project/go-cbor-util v0.0.1/go.mod h1:pqTiPHobNkOVM5thSRsHYjyQfq7O5QSCMhvuu9JoDlg= github.com/filecoin-project/go-commp-utils v0.1.1-0.20210427191551-70bf140d31c7/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= -github.com/filecoin-project/go-commp-utils v0.1.2 h1:SKLRuGdx/6WlolaWKaUzzUYWGGePuARyO4guxOPxvt4= -github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZieD3SGWTqIFLf1mPOes9l5U= +github.com/filecoin-project/go-commp-utils v0.1.3 h1:rTxbkNXZU7FLgdkBk8RsQIEOuPONHykEoX3xGk41Fkw= +github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9ANQrY3fDFoXdqyX04J+dWpK30= github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= +github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= +github.com/filecoin-project/go-data-transfer v1.11.6-0.20211116162442-2d8068920bda h1:JeKScBtyL1KzBPNatXCiFoY3RPMj7IOSCgFfdNdA6y4= +github.com/filecoin-project/go-data-transfer v1.11.6-0.20211116162442-2d8068920bda/go.mod h1:BaTx3YYc+qxNgCmLVKPwLCqNoLvX7naE0oLt5oD4QGc= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -347,8 +351,14 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-indexer-core v0.2.2/go.mod h1:wV+NmrF8fHG6Xii3ecoZf2JW3laGTe5xtsWz609jo+Y= +github.com/filecoin-project/go-indexer-core v0.2.3 h1:kaUL2r8CuihK53lhmtCScffb7Bzs+N1yRGpwvxzCN+U= +github.com/filecoin-project/go-indexer-core v0.2.3/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-legs v0.0.0-20211013165050-9ab325b6d2eb/go.mod h1:lKwBnslfNGG7JnsP9uQZl3yK7f74fit1MyHcwuuOP3k= +github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9 h1:NWe71o5Kgi/0/eMlPJKF//nnIPwOR73AXRk6R/+LLA4= +github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9/go.mod h1:g32LVimhcYPte22LK8XslKqLBem54QxuMQmkrzbAyEI= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -373,6 +383,8 @@ github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/ github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/index-provider v0.0.0-20211116104945-9f8f1785e3c2 h1:1nxYiIU+IT4joHR8a6+R7iyzNbLKBJP+yOio1pU5wRc= +github.com/filecoin-project/index-provider v0.0.0-20211116104945-9f8f1785e3c2/go.mod h1:TRec/t1PaPURTDD1uTT2UZceNF+HOViCpDvleqDr9ks= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -395,6 +407,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/storetheindex v0.0.0-20211019180831-2704585e5f99 h1:qdlA/LrP6UeYFkyXdZzzQaaUNvKXjRIP5j86peIzgvI= +github.com/filecoin-project/storetheindex v0.0.0-20211019180831-2704585e5f99/go.mod h1:IwKNyPe59SXmss9mKhx2GzkJXTBSmSjl1FiQTwFdsus= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -407,11 +421,15 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= +github.com/gammazero/radixtree v0.2.5 h1:muPQ4eEgCkUymFWPiVQRuXOQv4IhWg8YXH2r71MoqPM= +github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -673,8 +691,9 @@ github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3 github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= -github.com/ipfs/go-bitswap v0.3.4 h1:AhJhRrG8xkxh6x87b4wWs+4U4y3DVB3doI8yFNqgQME= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.4.0 h1:bLiqrpef1na4wdqGLqHKv954s1zz6KFghfmQWCPjBik= +github.com/ipfs/go-bitswap v0.4.0/go.mod h1:J2sAsp9UKxLgHDektSy3y3Q9OfQjM9sjhKBR1dlwrMg= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= github.com/ipfs/go-block-format v0.0.2/go.mod h1:AWR46JfpcObNfg3ok2JHDUfdiHRgWhJgCQF+KIgOPJY= github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/dDTpMc= @@ -683,6 +702,7 @@ github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbR github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= @@ -742,6 +762,8 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= +github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.9.3/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= @@ -753,6 +775,7 @@ github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86 github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -831,6 +854,7 @@ github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= @@ -843,6 +867,7 @@ github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.4.0/go.mod h1:KL9F49hXJMoXCad8e5anivjN+kWdr+CyGcyh4K6doLc= github.com/ipfs/go-peertaskqueue v0.6.0 h1:BT1/PuNViVomiz1PnnP5+WmKsTNHrxIDvkZrkj4JhOg= github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= @@ -861,12 +886,14 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= +github.com/ipld/go-car v0.3.2 h1:V9wt/80FNfbMRWSD98W5br6fyjUAyVgI2lDOTZX16Lg= +github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26 h1:IBXjeOANJGYZVJ9jsvf0Tu+ANQ9FLstscJgzfJgwA8c= -github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26/go.mod h1:bBmZNBj4jfOHrd4Cu/koFhqwsCnZ5RrGXU1wwWqDr20= +github.com/ipld/go-car/v2 v2.0.3-0.20210920144420-f35d88ce16ca/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= +github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= +github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -878,15 +905,18 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.0 h1:2FnBqUjmmgxgZD6/zB3eygWlmIsHNGrZ57L99x3xD6Q= +github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -972,8 +1002,9 @@ github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1017,6 +1048,7 @@ github.com/libp2p/go-libp2p v0.9.2/go.mod h1:cunHNLDVus66Ct9iXXcjKRLdmHdFdHVe1TA github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= +github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= github.com/libp2p/go-libp2p v0.15.0 h1:jbMbdmtizfpvl1+oQuGJzfGhttAtuxUCavF3enwFncg= github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= @@ -1159,13 +1191,15 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= +github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= -github.com/libp2p/go-libp2p-quic-transport v0.11.2 h1:p1YQDZRHH4Cv2LPtHubqlQ9ggz4CKng/REZuXZbZMhM= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.12.0 h1:7IjDH4XNkmJbOMD+mxRloTe4LzMTq+vqvm2nYNL1N7M= +github.com/libp2p/go-libp2p-quic-transport v0.12.0/go.mod h1:EKHqxZbWE/FhDJZ6ebyZ/4v3X9zyuuuKIN0XR9vANT0= github.com/libp2p/go-libp2p-record v0.0.1/go.mod h1:grzqg263Rug/sRex85QrDOLntdFAymLDLm7lxMgU79Q= github.com/libp2p/go-libp2p-record v0.1.0/go.mod h1:ujNc8iuE5dlKWVy6wuL6dd58t0n7xI4hAIl8pE6wu5Q= github.com/libp2p/go-libp2p-record v0.1.1/go.mod h1:VRgKajOyMVgP/F0L5g3kH7SVskp17vFi2xheb5uMJtg= @@ -1290,6 +1324,7 @@ github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2 github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= +github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= github.com/libp2p/go-tcp-transport v0.2.8 h1:aLjX+Nkz+kIz3uA56WtlGKRSAnKDvnqKmv1qF4EyyE4= @@ -1326,8 +1361,9 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0 h1:5vFnKtZ6nHDFsc/F3uuiF4T3y/AXaQdxjUqiVw26GZE= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1350,12 +1386,12 @@ github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZb github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1493,8 +1529,9 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1590,6 +1627,7 @@ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1671,6 +1709,9 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -1866,6 +1907,7 @@ github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/ github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -2025,6 +2067,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -2486,6 +2529,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index c0458e8d1dd..6507a5f27e4 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -7,13 +7,15 @@ import ( "testing" "time" - "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/stretchr/testify/require" datatransfer "github.com/filecoin-project/go-data-transfer" + "github.com/filecoin-project/go-fil-markets/shared_testutil" "github.com/filecoin-project/go-state-types/abi" + provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/lotus/api" + "github.com/filecoin-project/lotus/chain/actors/policy" "github.com/filecoin-project/lotus/itests/kit" "github.com/filecoin-project/lotus/node" "github.com/filecoin-project/lotus/node/modules" @@ -46,15 +48,18 @@ func TestDealWithMarketAndMinerNode(t *testing.T) { runTest := func(t *testing.T, n int, fastRetrieval bool, carExport bool) { api.RunningNodeType = api.NodeMiner // TODO(anteva): fix me - client, main, market, _ := kit.EnsembleWithMinerAndMarketNodes(t, kit.ThroughRPC()) + idxProv := shared_testutil.NewMockIndexProvider() + idxProvOpt := kit.ConstructorOpts(node.Override(new(provider.Interface), idxProv)) + client, main, market, _ := kit.EnsembleWithMinerAndMarketNodes(t, kit.ThroughRPC(), idxProvOpt) dh := kit.NewDealHarness(t, client, main, market) dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{ - N: n, - FastRetrieval: fastRetrieval, - CarExport: carExport, - StartEpoch: startEpoch, + N: n, + FastRetrieval: fastRetrieval, + CarExport: carExport, + StartEpoch: startEpoch, + IndexerProvider: idxProv, }) } diff --git a/itests/kit/deals.go b/itests/kit/deals.go index c96d18acfb5..09527525f11 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -10,6 +10,7 @@ import ( "testing" "time" + "github.com/filecoin-project/go-fil-markets/shared_testutil" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/lotus/api" @@ -374,6 +375,7 @@ type RunConcurrentDealsOpts struct { CarExport bool StartEpoch abi.ChainEpoch UseCARFileForStorageDeal bool + IndexerProvider *shared_testutil.MockIndexProvider } func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { @@ -400,6 +402,13 @@ func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { UseCARFileForStorageDeal: opts.UseCARFileForStorageDeal, }) + // Check that the storage provider announced the deal to indexers + if opts.IndexerProvider != nil { + notifs := opts.IndexerProvider.GetNotifs() + _, ok := notifs[string(deal.Bytes())] + require.True(dh.t, ok) + } + dh.t.Logf("retrieving deal %d/%d", i, opts.N) outPath := dh.PerformRetrieval(context.Background(), deal, res.Root, opts.CarExport) diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go index 6a32c011aae..2fcb54382bb 100644 --- a/markets/dagstore/wrapper.go +++ b/markets/dagstore/wrapper.go @@ -15,6 +15,7 @@ import ( levelds "github.com/ipfs/go-ds-leveldb" measure "github.com/ipfs/go-ds-measure" logging "github.com/ipfs/go-log/v2" + carindex "github.com/ipld/go-car/v2/index" ldbopts "github.com/syndtr/goleveldb/leveldb/opt" "golang.org/x/xerrors" @@ -402,7 +403,7 @@ func (w *Wrapper) markRegistrationComplete() error { // Get all the pieces that contain a block func (w *Wrapper) GetPiecesContainingBlock(blockCID cid.Cid) ([]cid.Cid, error) { // Pieces are stored as "shards" in the DAG store - shardKeys, err := w.dagst.GetShardKeysForCid(blockCID) + shardKeys, err := w.dagst.ShardsContainingMultihash(blockCID.Hash()) if err != nil { return nil, xerrors.Errorf("getting pieces containing block %s: %w", blockCID, err) } @@ -422,6 +423,10 @@ func (w *Wrapper) GetPiecesContainingBlock(blockCID cid.Cid) ([]cid.Cid, error) return pieceCids, nil } +func (w *Wrapper) GetIterableIndexForPiece(pieceCid cid.Cid) (carindex.IterableIndex, error) { + return w.dagst.GetIterableIndex(shard.KeyFromCID(pieceCid)) +} + func (w *Wrapper) Close() error { // Cancel the context w.cancel() diff --git a/node/builder_miner.go b/node/builder_miner.go index 3447eb3e6dc..aeb12eb9a13 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -12,6 +12,7 @@ import ( "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/go-fil-markets/storagemarket/impl/storedask" "github.com/filecoin-project/go-state-types/abi" + provider "github.com/filecoin-project/index-provider" storage2 "github.com/filecoin-project/specs-storage/storage" "github.com/filecoin-project/lotus/api" @@ -163,6 +164,7 @@ func ConfigStorageMiner(c interface{}) Option { Override(HandleRetrievalKey, modules.HandleRetrieval), // Markets (storage) + Override(new(provider.Interface), modules.IndexerProvider(cfg.IndexerProvider)), Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDAGServiceDataTransfer), Override(new(*storedask.StoredAsk), modules.NewStorageAsk), Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, nil)), diff --git a/node/config/def.go b/node/config/def.go index 735107e2940..6c518d20930 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -176,6 +176,15 @@ func DefaultStorageMiner() *StorageMiner { }, }, + IndexerProvider: IndexerProviderConfig{ + ListenAddresses: []string{ + "/ip4/0.0.0.0/tcp/0", + "/ip6/::/tcp/0", + }, + + MaxSimultaneousTransfers: DefaultSimultaneousTransfers, + }, + Subsystems: MinerSubsystemConfig{ EnableMining: true, EnableSealing: true, diff --git a/node/config/types.go b/node/config/types.go index 1be40029e17..44c40e30654 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -3,6 +3,8 @@ package config import ( "github.com/ipfs/go-cid" + "github.com/filecoin-project/index-provider/config" + "github.com/filecoin-project/lotus/chain/types" sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage" ) @@ -43,13 +45,14 @@ type Backup struct { type StorageMiner struct { Common - Subsystems MinerSubsystemConfig - Dealmaking DealmakingConfig - Sealing SealingConfig - Storage sectorstorage.SealerConfig - Fees MinerFeeConfig - Addresses MinerAddressConfig - DAGStore DAGStoreConfig + Subsystems MinerSubsystemConfig + Dealmaking DealmakingConfig + IndexerProvider IndexerProviderConfig + Sealing SealingConfig + Storage sectorstorage.SealerConfig + Fees MinerFeeConfig + Addresses MinerAddressConfig + DAGStore DAGStoreConfig } type DAGStoreConfig struct { @@ -146,6 +149,18 @@ type DealmakingConfig struct { RetrievalPricing *RetrievalPricing } +type IndexerProviderConfig struct { + config.Ingest + + // Binding address for the libp2p host - 0 means random port. + // Format: multiaddress; see https://multiformats.io/multiaddr/ + ListenAddresses []string + + // The maximum number of simultaneous data transfers between the indexers + // and the indexer provider + MaxSimultaneousTransfers uint64 +} + type RetrievalPricing struct { Strategy string // possible values: "default", "external" diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 1a2dfc19f94..3389c2beeda 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -34,6 +34,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-statestore" "github.com/filecoin-project/go-storedcounter" + provider "github.com/filecoin-project/index-provider" "github.com/ipfs/go-cid" "github.com/ipfs/go-datastore" "github.com/ipfs/go-datastore/namespace" @@ -581,6 +582,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, h host.Host, ds dtypes.MetadataDS, r repo.LockedRepo, pieceStore dtypes.ProviderPieceStore, + indexer provider.Interface, dataTransfer dtypes.ProviderDataTransfer, spn storagemarket.StorageProviderNode, df dtypes.StorageDealFilter, @@ -609,6 +611,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, namespace.Wrap(ds, datastore.NewKey("/deals/provider")), store, dsw, + indexer, pieceStore, dataTransfer, spn, diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go new file mode 100644 index 00000000000..7022823a8d9 --- /dev/null +++ b/node/modules/storageminer_idxprov.go @@ -0,0 +1,158 @@ +package modules + +import ( + "context" + "fmt" + "os" + "path/filepath" + + "golang.org/x/xerrors" + + "github.com/ipfs/go-datastore" + "github.com/ipfs/go-graphsync" + graphsyncimpl "github.com/ipfs/go-graphsync/impl" + gsnet "github.com/ipfs/go-graphsync/network" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" + "github.com/libp2p/go-libp2p" + ci "github.com/libp2p/go-libp2p-core/crypto" + "github.com/libp2p/go-libp2p-core/peer" + "github.com/libp2p/go-libp2p-core/peerstore" + "go.uber.org/fx" + + datatransfer "github.com/filecoin-project/go-data-transfer" + dtimpl "github.com/filecoin-project/go-data-transfer/impl" + dtnet "github.com/filecoin-project/go-data-transfer/network" + dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" + provider "github.com/filecoin-project/index-provider" + "github.com/filecoin-project/index-provider/engine" + p2pserver "github.com/filecoin-project/index-provider/server/provider/libp2p" + "github.com/ipfs/go-datastore/namespace" + "github.com/libp2p/go-libp2p-core/host" + + "github.com/filecoin-project/lotus/build" + marketevents "github.com/filecoin-project/lotus/markets/loggers" + "github.com/filecoin-project/lotus/node/config" + "github.com/filecoin-project/lotus/node/modules/dtypes" + "github.com/filecoin-project/lotus/node/modules/helpers" + "github.com/filecoin-project/lotus/node/repo" +) + +type IdxProv struct { + fx.In + + helpers.MetricsCtx + fx.Lifecycle + Repo repo.LockedRepo + Datastore dtypes.MetadataDS + PeerID peer.ID + peerstore.Peerstore +} + +func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv) (provider.Interface, error) { + return func(args IdxProv) (provider.Interface, error) { + ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/indexer-provider")) + + pkey := args.Peerstore.PrivKey(args.PeerID) + if pkey == nil { + return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) + } + + h, err := createIndexerProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses) + if err != nil { + return nil, xerrors.Errorf("creating indexer provider host: %w", err) + } + + dt, err := newIndexerProviderDataTransfer(cfg, args.MetricsCtx, args.Lifecycle, args.Repo, h, ipds) + if err != nil { + return nil, err + } + + e, err := engine.New(cfg.Ingest, pkey, dt, h, ipds, nil) + if err != nil { + return nil, xerrors.Errorf("creating indexer provider engine: %w", err) + } + + args.Lifecycle.Append(fx.Hook{ + OnStart: func(ctx context.Context) error { + // Start the engine + err := e.Start(ctx) + if err != nil { + return xerrors.Errorf("starting indexer provider engine: %s", err) + } + + // Add a handler to libp2p that listens for incoming index requests + p2pserver.New(ctx, h, e) + + return nil + }, + OnStop: func(ctx context.Context) error { + return e.Shutdown(ctx) + }, + }) + + return e, nil + } +} + +func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string) (host.Host, error) { + ctx := helpers.LifecycleCtx(mctx, lc) + + opts := []libp2p.Option{ + libp2p.Identity(pkey), + libp2p.Peerstore(pstore), + libp2p.ListenAddrStrings(listenAddrs...), + libp2p.Ping(true), + libp2p.UserAgent("lotus-indexer-provider-" + build.UserVersion()), + } + + h, err := libp2p.New(ctx, opts...) + if err != nil { + return nil, err + } + + lc.Append(fx.Hook{ + OnStop: func(ctx context.Context) error { + return h.Close() + }, + }) + + return h, nil +} + +func newIndexerProviderDataTransfer(cfg config.IndexerProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, h host.Host, ds datastore.Batching) (datatransfer.Manager, error) { + net := dtnet.NewFromLibp2pHost(h) + + // Set up graphsync + gs := newIndexerProviderGraphsync(cfg, mctx, lc, h) + + // Set up data transfer + dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/transfers")) + transport := dtgstransport.NewTransport(h.ID(), gs, net) + dtPath := filepath.Join(r.Path(), "indexer-provider", "data-transfer") + err := os.MkdirAll(dtPath, 0755) //nolint: gosec + if err != nil && !os.IsExist(err) { + return nil, xerrors.Errorf("creating indexer provider data transfer dir %s: %w", dtPath, err) + } + + dt, err := dtimpl.NewDataTransfer(dtDs, dtPath, net, transport) + if err != nil { + return nil, xerrors.Errorf("creating indexer provider data transfer module: %w", err) + } + + dt.OnReady(marketevents.ReadyLogger("indexer-provider data transfer")) + lc.Append(fx.Hook{ + OnStart: dt.Start, + OnStop: dt.Stop, + }) + return dt, nil +} + +func newIndexerProviderGraphsync(cfg config.IndexerProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host) graphsync.GraphExchange { + graphsyncNetwork := gsnet.NewFromLibp2pHost(h) + return graphsyncimpl.New(helpers.LifecycleCtx(mctx, lc), + graphsyncNetwork, + cidlink.DefaultLinkSystem(), + graphsyncimpl.MaxInProgressIncomingRequests(cfg.MaxSimultaneousTransfers), + graphsyncimpl.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), + graphsyncimpl.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) +} From bfee6699d21d10a9fbfe880d12f70ede3de3a5bf Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 17 Nov 2021 11:42:14 +0400 Subject: [PATCH 11/99] update go mod and inject store the hash index in dagstore --- go.mod | 15 +++---- go.sum | 81 ++++++++++++++++++++++++++----------- itests/deals_anycid_test.go | 2 +- itests/kit/files.go | 2 +- markets/dagstore/wrapper.go | 20 ++++++++- node/impl/client/client.go | 4 +- 6 files changed, 88 insertions(+), 36 deletions(-) diff --git a/go.mod b/go.mod index 6d2c76d5421..8d71c36378d 100644 --- a/go.mod +++ b/go.mod @@ -26,17 +26,18 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5 + github.com/filecoin-project/dagstore v0.5.0 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 github.com/filecoin-project/go-cbor-util v0.0.1 github.com/filecoin-project/go-commp-utils v0.1.2 github.com/filecoin-project/go-crypto v0.0.1 - github.com/filecoin-project/go-data-transfer v1.11.4 + github.com/filecoin-project/go-data-transfer v1.11.6 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.13.3 + github.com/filecoin-project/go-fil-markets v1.13.3-0.20211117072527-8713155662ff + github.com/filecoin-project/go-indexer-core v0.2.4 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 @@ -97,10 +98,10 @@ require ( github.com/ipfs/go-path v0.0.7 github.com/ipfs/go-unixfs v0.2.6 github.com/ipfs/interface-go-ipfs-core v0.4.0 - github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 - github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26 + github.com/ipld/go-car v0.3.2 + github.com/ipld/go-car/v2 v2.1.0 github.com/ipld/go-codec-dagpb v1.3.0 - github.com/ipld/go-ipld-prime v0.12.3 + github.com/ipld/go-ipld-prime v0.14.0 github.com/ipld/go-ipld-selector-text-lite v0.0.0 github.com/kelseyhightower/envconfig v1.4.0 github.com/libp2p/go-buffer-pool v0.0.2 @@ -128,7 +129,7 @@ require ( github.com/multiformats/go-multiaddr v0.4.1 github.com/multiformats/go-multiaddr-dns v0.3.1 github.com/multiformats/go-multibase v0.0.3 - github.com/multiformats/go-multihash v0.0.16 + github.com/multiformats/go-multihash v0.1.0 github.com/multiformats/go-varint v0.0.6 github.com/open-rpc/meta-schema v0.0.0-20201029221707-1b72ef2ea333 github.com/opentracing/opentracing-go v1.2.0 diff --git a/go.sum b/go.sum index d12c2ae1da7..f6da54a9c4b 100644 --- a/go.sum +++ b/go.sum @@ -89,6 +89,7 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 h1:T3+cD5fYvuH36h7EZq+TDpm+d8a6FSD4pQsbmuGGQ8o= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -301,9 +302,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.2/go.mod h1:WY5OoLfnwISCk6eASSF927KKPqLPIlTwmG1qHpA08KY= -github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5 h1:wtKBSxmV5ohSeZHS86TrLtw6m1dO88QaNo6az/QRrYU= -github.com/filecoin-project/dagstore v0.4.4-0.20210915102524-cd372c4b14d5/go.mod h1:dsWYxyEYa5aB62UXJcQhwlIaBOS+kkrKQgYGxwAnmkE= +github.com/filecoin-project/dagstore v0.5.0 h1:akiheGtSCU7aGon6T74bwNbDhYW0XZCTsnORKNmzSgU= +github.com/filecoin-project/dagstore v0.5.0/go.mod h1:Id2VG7uZxnF6NWR3JX1evNA83JonnU0U7Fc2r14Vltc= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -326,9 +326,12 @@ github.com/filecoin-project/go-commp-utils v0.1.2/go.mod h1:6s95K91mCyHY51RPWECZ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= github.com/filecoin-project/go-data-transfer v1.0.1/go.mod h1:UxvfUAY9v3ub0a21BSK9u3pB2aq30Y0KMsG+w9/ysyo= -github.com/filecoin-project/go-data-transfer v1.11.4 h1:jKvlx0/C8HSyLRn/G1P9TjtfBtFU9jbCvCVFmWbyYVQ= +github.com/filecoin-project/go-data-transfer v1.10.1/go.mod h1:CSDMCrPK2lVGodNB1wPEogjFvM9nVGyiL1GNbBRTSdw= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= +github.com/filecoin-project/go-data-transfer v1.11.6 h1:DWAAxdfyR09b+aYeY1PFUzAL/mOPW0Rb+LORRdh2n4w= +github.com/filecoin-project/go-data-transfer v1.11.6/go.mod h1:IDeRWWO0RU+wG7I2o4ELcGDm9zcO+cMXRo8ElGlYLvw= github.com/filecoin-project/go-ds-versioning v0.1.0 h1:y/X6UksYTsK8TLCI7rttCKEvl8btmWxyFMEeeWGUxIQ= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -338,8 +341,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.0.5-0.20201113164554-c5eba40d5335/go.mod h1:AJySOJC00JRWEZzRG2KsfUnqEf5ITXxeX09BE9N4f9c= -github.com/filecoin-project/go-fil-markets v1.13.3 h1:iMCpG7I4fb+YLcgDnMaqZiZiyFZWNvrwHqiFPHB0/tQ= -github.com/filecoin-project/go-fil-markets v1.13.3/go.mod h1:38zuj8AgDvOfdakFLpC/syYIYgXTzkq7xqBJ6T1AuG4= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211117072527-8713155662ff h1:R+3i3v9We8eEqdBJ4RVOPdZt5R6b+E/joJ/xVP2sA4s= +github.com/filecoin-project/go-fil-markets v1.13.3-0.20211117072527-8713155662ff/go.mod h1:neN4U0gdo7g716+t3njUBI9+ft9HBe0veJYG0XdlwXo= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -347,8 +350,15 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-indexer-core v0.2.2/go.mod h1:wV+NmrF8fHG6Xii3ecoZf2JW3laGTe5xtsWz609jo+Y= +github.com/filecoin-project/go-indexer-core v0.2.3/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= +github.com/filecoin-project/go-indexer-core v0.2.4 h1:90vvxoBeNZN+h4W+vZ+VsoxKaDBr/bfZJJNByapGeM0= +github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-legs v0.0.0-20211013165050-9ab325b6d2eb/go.mod h1:lKwBnslfNGG7JnsP9uQZl3yK7f74fit1MyHcwuuOP3k= +github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9 h1:NWe71o5Kgi/0/eMlPJKF//nnIPwOR73AXRk6R/+LLA4= +github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9/go.mod h1:g32LVimhcYPte22LK8XslKqLBem54QxuMQmkrzbAyEI= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -373,6 +383,8 @@ github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/ github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= +github.com/filecoin-project/index-provider v0.0.0-20211116211010-ae6b83454d89 h1:QwKK+eB+7jKbdtQxkBcoiWF2z3LusoPIj2N5UcZsV0w= +github.com/filecoin-project/index-provider v0.0.0-20211116211010-ae6b83454d89/go.mod h1:wu0yi7NbT3VzYr3s0n2zheg3mpdSP09A0hBFIQfUs44= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -395,6 +407,8 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= +github.com/filecoin-project/storetheindex v0.0.0-20211019180831-2704585e5f99 h1:qdlA/LrP6UeYFkyXdZzzQaaUNvKXjRIP5j86peIzgvI= +github.com/filecoin-project/storetheindex v0.0.0-20211019180831-2704585e5f99/go.mod h1:IwKNyPe59SXmss9mKhx2GzkJXTBSmSjl1FiQTwFdsus= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -407,11 +421,16 @@ github.com/francoispqt/gojay v1.2.13/go.mod h1:ehT5mTG4ua4581f1++1WLG0vPdaA9HaiD github.com/franela/goblin v0.0.0-20200105215937-c9ffbefa60db/go.mod h1:7dvUGVsVBjqR7JHJk0brhHOZYGmfBYOrK0ZhYMEtBr4= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= -github.com/frankban/quicktest v1.11.3 h1:8sXhOn0uLys67V8EsXLc6eszDs8VXWxL3iRvebPhedY= github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM0I9ntUbOk+k= +github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= +github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= +github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= +github.com/gammazero/radixtree v0.2.5 h1:muPQ4eEgCkUymFWPiVQRuXOQv4IhWg8YXH2r71MoqPM= +github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -683,7 +702,7 @@ github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbR github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4-0.20200624145336-a978cec6e834/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= -github.com/ipfs/go-blockservice v0.1.5/go.mod h1:yLk8lBJCBRWRqerqCSVi3cE/Dncdt3vGC/PJMVKhLTY= +github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.7 h1:yVe9te0M7ow8i+PPkx03YFSpxqzXx594d6h+34D6qMg= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -742,6 +761,8 @@ github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28 github.com/ipfs/go-graphsync v0.1.0/go.mod h1:jMXfqIEDFukLPZHqDPp8tJMbHO9Rmeb9CEGevngQbmE= github.com/ipfs/go-graphsync v0.4.2/go.mod h1:/VmbZTUdUMTbNkgzAiCEucIIAU3BkLE2cZrDCVUhyi0= github.com/ipfs/go-graphsync v0.4.3/go.mod h1:mPOwDYv128gf8gxPFgXnz4fNrSYPsWyqisJ7ych+XDY= +github.com/ipfs/go-graphsync v0.9.1/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= +github.com/ipfs/go-graphsync v0.9.3/go.mod h1:J62ahWT9JbPsFL2UWsUM5rOu0lZJ0LOIH1chHdxGGcw= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.10.4 h1:1WZhyOPxgxLvHTIC2GoLltaBrjZ+JuXC2oKAEiX8f3Y= github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= @@ -753,6 +774,7 @@ github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86 github.com/ipfs/go-ipfs-blockstore v1.0.0/go.mod h1:knLVdhVU9L7CC4T+T4nvGdeUIPAXlnd9zmXfp+9MIjU= github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= github.com/ipfs/go-ipfs-blockstore v1.0.4 h1:DZdeya9Vu4ttvlGheQPGrj6kWehXnYZRFCp9EsZQ1hI= github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blocksutil v0.0.1 h1:Eh/H4pc1hsvhzsQoMEP3Bke/aW5P5rVM1IWFJMcGIPQ= @@ -831,6 +853,7 @@ github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.4.1 h1:CEEQZnwRkszN06oezuasHwDD823Xcr4p4zluUN9vXqs= github.com/ipfs/go-merkledag v0.4.1/go.mod h1:56biPaS6e+IS0eXkEt6A8tG+BUQaEIFqDqJuFfQDBoE= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= @@ -861,12 +884,11 @@ github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmI github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= github.com/ipld/go-car v0.1.1-0.20200923150018-8cdef32e2da4/go.mod h1:xrMEcuSq+D1vEwl+YAXsg/JfA98XGpXDwnkIL4Aimqw= github.com/ipld/go-car v0.1.1-0.20201119040415-11b6074b6d4d/go.mod h1:2Gys8L8MJ6zkh1gktTSXreY63t4UbyvNp5JaudTyxHQ= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823 h1:8JMSJ0k71fU9lIUrpVwEdoX4KoxiTEX8cZG97v/hTDw= -github.com/ipld/go-car v0.3.2-0.20211001225732-32d0d9933823/go.mod h1:jSlTph+i/q1jLFoiKKeN69KGG0fXpwrcD0izu5C1Tpo= -github.com/ipld/go-car/v2 v2.0.0-beta1.0.20210721090610-5a9d1b217d25/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.2/go.mod h1:I2ACeeg6XNBe5pdh5TaR7Ambhfa7If9KXxmXgZsYENU= -github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26 h1:IBXjeOANJGYZVJ9jsvf0Tu+ANQ9FLstscJgzfJgwA8c= -github.com/ipld/go-car/v2 v2.0.3-0.20210910134712-2d2568297f26/go.mod h1:bBmZNBj4jfOHrd4Cu/koFhqwsCnZ5RrGXU1wwWqDr20= +github.com/ipld/go-car v0.3.2 h1:V9wt/80FNfbMRWSD98W5br6fyjUAyVgI2lDOTZX16Lg= +github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= +github.com/ipld/go-car/v2 v2.0.3-0.20210920144420-f35d88ce16ca/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= +github.com/ipld/go-car/v2 v2.1.0 h1:t8R/WXUSkfu1K1gpPk76mytCxsEdMjGcMIgpOq3/Cnw= +github.com/ipld/go-car/v2 v2.1.0/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= github.com/ipld/go-codec-dagpb v1.3.0 h1:czTcaoAuNNyIYWs6Qe01DJ+sEX7B+1Z0LcXjSatMGe8= github.com/ipld/go-codec-dagpb v1.3.0/go.mod h1:ga4JTU3abYApDC3pZ00BC2RSvC3qfBb9MSJkMLSwnhA= @@ -878,15 +900,18 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.3-0.20210930132912-0b3aef3ca569/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.3 h1:furVobw7UBLQZwlEwfE26tYORy3PAK8VYSgZOSr3JMQ= +github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.14.0 h1:2FnBqUjmmgxgZD6/zB3eygWlmIsHNGrZ57L99x3xD6Q= +github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= github.com/ipld/go-ipld-prime-proto v0.0.0-20200428191222-c1ffdadc01e1/go.mod h1:OAV6xBmuTLsPZ+epzKkPB1e25FHk/vCtyatkdHcArLs= github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1:3pHYooM9Ea65jewRwrb2u5uHZCNkNTe9ABsVB+SrkH0= github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c h1:izfvqCuEqk2V7BRkh7GCm7lyKC2ItyAbzUu4WgNmggc= +github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -972,8 +997,9 @@ github.com/koron/go-ssdp v0.0.2/go.mod h1:XoLfkAiA2KeZsYh4DbHxD7h3nR2AZNqVQOa+LJ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= -github.com/kr/pretty v0.2.1 h1:Fmg33tUaq4/8ym9TJN1x7sLJnHVwhP33CNkpYV/7rwI= github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0= +github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/pty v1.1.3/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= @@ -1159,6 +1185,7 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2-0.20200527132641-c0712c6e92cf/go.mod h1:TxPOBuo1FPdsTjFnv+FGZbNbWYsp74Culx+4ViQpato= +github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.5.6 h1:YkO3gG9J1mQBEMRrM5obiG3JD0L8RcrzIpoeLeiYqH8= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= @@ -1326,8 +1353,9 @@ github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0U github.com/lucas-clemente/quic-go v0.11.2/go.mod h1:PpMmPfPKO9nKJ/psF49ESTAGQSdfXxlg1otPbEB2nOw= github.com/lucas-clemente/quic-go v0.16.0/go.mod h1:I0+fcNTdb9eS1ZcjQZbDVPGchJ86chcIxPALn9lEJqE= github.com/lucas-clemente/quic-go v0.19.3/go.mod h1:ADXpNbTQjq1hIzCpB+y/k5iz4n4z4IwqoLb94Kh5Hu8= -github.com/lucas-clemente/quic-go v0.21.2 h1:8LqqL7nBQFDUINadW0fHV/xSaCQJgmJC0Gv+qUnjd78= github.com/lucas-clemente/quic-go v0.21.2/go.mod h1:vF5M1XqhBAHgbjKcJOXY3JZz3GP0T3FQhz/uyOUS38Q= +github.com/lucas-clemente/quic-go v0.23.0 h1:5vFnKtZ6nHDFsc/F3uuiF4T3y/AXaQdxjUqiVw26GZE= +github.com/lucas-clemente/quic-go v0.23.0/go.mod h1:paZuzjXCE5mj6sikVLMvqXk8lJV2AsqtJ6bDhjEfxx0= github.com/lucasb-eyer/go-colorful v1.0.3 h1:QIbQXiugsb+q10B+MI+7DI1oQLdmnep86tWFlaaUAac= github.com/lucasb-eyer/go-colorful v1.0.3/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/lufia/iostat v1.1.0/go.mod h1:rEPNA0xXgjHQjuI5Cy05sLlS2oRcSlWHRLrvh/AQ+Pg= @@ -1350,12 +1378,12 @@ github.com/marten-seemann/qtls v0.9.1/go.mod h1:T1MmAdDPyISzxlK6kjRr0pcZFBVd1OZb github.com/marten-seemann/qtls v0.10.0/go.mod h1:UvMd1oaYDACI99/oZUYLzMCkBXQVT0aGm99sJhbT8hs= github.com/marten-seemann/qtls-go1-15 v0.1.1/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-15 v0.1.4/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= -github.com/marten-seemann/qtls-go1-15 v0.1.5 h1:Ci4EIUN6Rlb+D6GmLdej/bCQ4nPYNtVXQB+xjiXE1nk= github.com/marten-seemann/qtls-go1-15 v0.1.5/go.mod h1:GyFwywLKkRt+6mfU99csTEY1joMZz5vmB1WNZH3P81I= github.com/marten-seemann/qtls-go1-16 v0.1.4 h1:xbHbOGGhrenVtII6Co8akhLEdrawwB2iHl5yhJRpnco= github.com/marten-seemann/qtls-go1-16 v0.1.4/go.mod h1:gNpI2Ol+lRS3WwSOtIUUtRwZEQMXjYK+dQSBFbethAk= -github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1 h1:/rpmWuGvceLwwWuaKPdjpR4JJEUH0tq64/I3hvzaNLM= github.com/marten-seemann/qtls-go1-17 v0.1.0-rc.1/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= +github.com/marten-seemann/qtls-go1-17 v0.1.0 h1:P9ggrs5xtwiqXv/FHNwntmuLMNq3KaSIG93AtAZ48xk= +github.com/marten-seemann/qtls-go1-17 v0.1.0/go.mod h1:fz4HIxByo+LlWcreM4CZOYNuz3taBQ8rN2X6FqvaWo8= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd h1:br0buuQ854V8u83wA0rVZ8ttrq5CpaPZdvrK0LP2lOk= github.com/marten-seemann/tcp v0.0.0-20210406111302-dfbc87cc63fd/go.mod h1:QuCEs1Nt24+FYQEqAAncTDPJIuGs+LxK1MCiFL25pMU= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= @@ -1480,8 +1508,6 @@ github.com/multiformats/go-multibase v0.0.2/go.mod h1:bja2MqRZ3ggyXtZSEDKpl0uO/g github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77RblWplfIqk= github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= -github.com/multiformats/go-multicodec v0.2.1-0.20210713081508-b421db6850ae/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.2.1-0.20210714093213-b2b5bd6fe68b/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= @@ -1493,8 +1519,9 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= -github.com/multiformats/go-multihash v0.0.16 h1:D2qsyy1WVculJbGv69pWmQ36ehxFoA5NiIUr1OEs6qI= github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= +github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= +github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= @@ -1590,6 +1617,7 @@ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9 h1:1/WtZae0yGtPq+TI6+ github.com/petar/GoLLRB v0.0.0-20210522233825-ae3b015fd3e9/go.mod h1:x3N5drFsm2uilKKuuYo6LdyD8vZAW55sH/9w+pbo1sw= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= @@ -1671,6 +1699,9 @@ github.com/rivo/uniseg v0.1.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= +github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8= +github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE= github.com/rs/cors v1.7.0 h1:+88SsELBHx5r+hZ8TCkggzSstaWNbDvThkVK8H6f9ik= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= @@ -1866,6 +1897,7 @@ github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/ github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -2025,6 +2057,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -2486,6 +2519,8 @@ honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9 honnef.co/go/tools v0.1.3/go.mod h1:NgwopIslSNH47DimFoV78dnkksY2EFtX0ajyb3K/las= howett.net/plist v0.0.0-20181124034731-591f970eefbb h1:jhnBjNi9UFpfpl8YZhA9CrOqpnJdvzuiHsl/dnxl11M= howett.net/plist v0.0.0-20181124034731-591f970eefbb/go.mod h1:vMygbs4qMhSZSc4lCUl2OEE+rDiIIJAIdR4m7MiMcm0= +lukechampine.com/blake3 v1.1.6 h1:H3cROdztr7RCfoaTpGZFQsrqvweFLrqS73j7L7cmR5c= +lukechampine.com/blake3 v1.1.6/go.mod h1:tkKEOtDkNtklkXtLNEOGNq5tcV90tJiA1vAA12R78LA= modernc.org/cc v1.0.0 h1:nPibNuDEx6tvYrUAtvDTTw98rx5juGsa5zuDnKwEEQQ= modernc.org/cc v1.0.0/go.mod h1:1Sk4//wdnYJiUIxnW8ddKpaOJCF37yAdqYnkxUpaYxw= modernc.org/fileutil v1.0.0/go.mod h1:JHsWpkrk/CnVV1H/eGlFf85BEpfkrp56ro8nojIq9Q8= diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index 6b314908bd1..b7799f2980c 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -133,7 +133,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { require.NoError(t, err) f, err := os.Open(outputCar) require.NoError(t, err) - ch, _, _ := car.ReadHeader(bufio.NewReader(f)) + ch, _ := car.ReadHeader(bufio.NewReader(f)) require.EqualValues(t, ch.Roots[0], targetCid) require.NoError(t, f.Close()) diff --git a/itests/kit/files.go b/itests/kit/files.go index d69c6d7767e..26dba1b4ba7 100644 --- a/itests/kit/files.go +++ b/itests/kit/files.go @@ -83,7 +83,7 @@ func CreateRandomCARv1(t *testing.T, rseed, size int, opts ...GeneratedDAGOpts) require.NoError(t, car.WriteCar(ctx, dagSvc, []cid.Cid{root}, tmp)) _, err = tmp.Seek(0, io.SeekStart) require.NoError(t, err) - hd, _, err := car.ReadHeader(bufio.NewReader(tmp)) + hd, err := car.ReadHeader(bufio.NewReader(tmp)) require.NoError(t, err) require.EqualValues(t, 1, hd.Version) require.Len(t, hd.Roots, 1) diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go index 6a32c011aae..b6c8801de6e 100644 --- a/markets/dagstore/wrapper.go +++ b/markets/dagstore/wrapper.go @@ -10,6 +10,10 @@ import ( "sync" "time" + carindex "github.com/ipld/go-car/v2/index" + + "github.com/filecoin-project/go-indexer-core/store/storethehash" + "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" levelds "github.com/ipfs/go-ds-leveldb" @@ -80,8 +84,14 @@ func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI) (*dagstore.DAGSto irepo, err := index.NewFSRepo(indexDir) if err != nil { - return nil, nil, xerrors.Errorf("failed to initialise dagstore index repo") + return nil, nil, xerrors.Errorf("failed to initialise dagstore index repo: %w", err) + } + + store, err := storethehash.New(indexDir) + if err != nil { + return nil, nil, xerrors.Errorf("failed to initialise store the index: %w", err) } + topIndex := index.NewInverted(store) dcfg := dagstore.Config{ TransientsDir: transientsDir, @@ -90,6 +100,7 @@ func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI) (*dagstore.DAGSto MountRegistry: registry, FailureCh: failureCh, TraceCh: traceCh, + TopLevelIndex: topIndex, // not limiting fetches globally, as the Lotus mount does // conditional throttling. MaxConcurrentIndex: cfg.MaxConcurrentIndex, @@ -270,6 +281,11 @@ func (w *Wrapper) RegisterShard(ctx context.Context, pieceCid cid.Cid, carPath s return nil } +func (w *Wrapper) GetIterableIndexForPiece(pieceCid cid.Cid) (carindex.IterableIndex, error) { + key := shard.KeyFromCID(pieceCid) + return w.dagst.GetIterableIndex(key) +} + func (w *Wrapper) MigrateDeals(ctx context.Context, deals []storagemarket.MinerDeal) (bool, error) { log := log.Named("migrator") @@ -402,7 +418,7 @@ func (w *Wrapper) markRegistrationComplete() error { // Get all the pieces that contain a block func (w *Wrapper) GetPiecesContainingBlock(blockCID cid.Cid) ([]cid.Cid, error) { // Pieces are stored as "shards" in the DAG store - shardKeys, err := w.dagst.GetShardKeysForCid(blockCID) + shardKeys, err := w.dagst.ShardsContainingMultihash(blockCID.Hash()) if err != nil { return nil, xerrors.Errorf("getting pieces containing block %s: %w", blockCID, err) } diff --git a/node/impl/client/client.go b/node/impl/client/client.go index 199a2122dd9..cb0f8aa5093 100644 --- a/node/impl/client/client.go +++ b/node/impl/client/client.go @@ -516,7 +516,7 @@ func (a *API) ClientImport(ctx context.Context, ref api.FileRef) (res *api.Impor } defer f.Close() //nolint:errcheck - hd, _, err := car.ReadHeader(bufio.NewReader(f)) + hd, err := car.ReadHeader(bufio.NewReader(f)) if err != nil { return nil, xerrors.Errorf("failed to read CAR header: %w", err) } @@ -1196,7 +1196,7 @@ func (a *API) ClientCalcCommP(ctx context.Context, inpath string) (*api.CommPRet } // check that the data is a car file; if it's not, retrieval won't work - _, _, err = car.ReadHeader(bufio.NewReader(rdr)) + _, err = car.ReadHeader(bufio.NewReader(rdr)) if err != nil { return nil, xerrors.Errorf("not a car file: %w", err) } From f8c675bc5e0bbada3ab0f342443a00a8162906ce Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 17 Nov 2021 14:48:28 +0400 Subject: [PATCH 12/99] green tests --- go.mod | 2 +- go.sum | 8 +++----- markets/dagstore/wrapper.go | 20 ++++++-------------- 3 files changed, 10 insertions(+), 20 deletions(-) diff --git a/go.mod b/go.mod index 8d71c36378d..06a6799b6e2 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,6 @@ require ( github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.13.3-0.20211117072527-8713155662ff - github.com/filecoin-project/go-indexer-core v0.2.4 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 @@ -45,6 +44,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b + github.com/filecoin-project/index-provider v0.0.0-20211117103856-70cd9b7ab68b github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index f6da54a9c4b..4831d889bfd 100644 --- a/go.sum +++ b/go.sum @@ -351,9 +351,8 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGy github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.2/go.mod h1:wV+NmrF8fHG6Xii3ecoZf2JW3laGTe5xtsWz609jo+Y= +github.com/filecoin-project/go-indexer-core v0.2.3 h1:kaUL2r8CuihK53lhmtCScffb7Bzs+N1yRGpwvxzCN+U= github.com/filecoin-project/go-indexer-core v0.2.3/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= -github.com/filecoin-project/go-indexer-core v0.2.4 h1:90vvxoBeNZN+h4W+vZ+VsoxKaDBr/bfZJJNByapGeM0= -github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.0.0-20211013165050-9ab325b6d2eb/go.mod h1:lKwBnslfNGG7JnsP9uQZl3yK7f74fit1MyHcwuuOP3k= @@ -383,8 +382,9 @@ github.com/filecoin-project/go-statestore v0.1.1 h1:ufMFq00VqnT2CAuDpcGnwLnCX1I/ github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZOinUJB4WARkRfNl10O7kTnI= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= -github.com/filecoin-project/index-provider v0.0.0-20211116211010-ae6b83454d89 h1:QwKK+eB+7jKbdtQxkBcoiWF2z3LusoPIj2N5UcZsV0w= github.com/filecoin-project/index-provider v0.0.0-20211116211010-ae6b83454d89/go.mod h1:wu0yi7NbT3VzYr3s0n2zheg3mpdSP09A0hBFIQfUs44= +github.com/filecoin-project/index-provider v0.0.0-20211117103856-70cd9b7ab68b h1:qVQpqoguf9+vPONSMQZ3xYVzxzwAITyBHjM238zAr6c= +github.com/filecoin-project/index-provider v0.0.0-20211117103856-70cd9b7ab68b/go.mod h1:wu0yi7NbT3VzYr3s0n2zheg3mpdSP09A0hBFIQfUs44= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -427,7 +427,6 @@ github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= -github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= github.com/gammazero/radixtree v0.2.5 h1:muPQ4eEgCkUymFWPiVQRuXOQv4IhWg8YXH2r71MoqPM= github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= @@ -910,7 +909,6 @@ github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1 github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c h1:izfvqCuEqk2V7BRkh7GCm7lyKC2ItyAbzUu4WgNmggc= github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go index 7ef7dd3c8b6..98c63361f45 100644 --- a/markets/dagstore/wrapper.go +++ b/markets/dagstore/wrapper.go @@ -12,14 +12,11 @@ import ( carindex "github.com/ipld/go-car/v2/index" - "github.com/filecoin-project/go-indexer-core/store/storethehash" - "github.com/ipfs/go-cid" ds "github.com/ipfs/go-datastore" levelds "github.com/ipfs/go-ds-leveldb" measure "github.com/ipfs/go-ds-measure" logging "github.com/ipfs/go-log/v2" - carindex "github.com/ipld/go-car/v2/index" ldbopts "github.com/syndtr/goleveldb/leveldb/opt" "golang.org/x/xerrors" @@ -88,11 +85,11 @@ func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI) (*dagstore.DAGSto return nil, nil, xerrors.Errorf("failed to initialise dagstore index repo: %w", err) } - store, err := storethehash.New(indexDir) - if err != nil { - return nil, nil, xerrors.Errorf("failed to initialise store the index: %w", err) - } - topIndex := index.NewInverted(store) + //store, err := storethehash.New(indexDir) + //if err != nil { + //return nil, nil, xerrors.Errorf("failed to initialise store the index: %w", err) + //} + //topIndex := index.NewInverted(store) dcfg := dagstore.Config{ TransientsDir: transientsDir, @@ -101,7 +98,7 @@ func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI) (*dagstore.DAGSto MountRegistry: registry, FailureCh: failureCh, TraceCh: traceCh, - TopLevelIndex: topIndex, + //TopLevelIndex: topIndex, // not limiting fetches globally, as the Lotus mount does // conditional throttling. MaxConcurrentIndex: cfg.MaxConcurrentIndex, @@ -282,11 +279,6 @@ func (w *Wrapper) RegisterShard(ctx context.Context, pieceCid cid.Cid, carPath s return nil } -func (w *Wrapper) GetIterableIndexForPiece(pieceCid cid.Cid) (carindex.IterableIndex, error) { - key := shard.KeyFromCID(pieceCid) - return w.dagst.GetIterableIndex(key) -} - func (w *Wrapper) MigrateDeals(ctx context.Context, deals []storagemarket.MinerDeal) (bool, error) { log := log.Named("migrator") From d196c236b80f536645b4c91a4c0cd92e206a4c04 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 17 Nov 2021 14:55:09 +0400 Subject: [PATCH 13/99] fix lint --- markets/dagstore/wrapper_test.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go index 578dc0b74a2..4cf53737377 100644 --- a/markets/dagstore/wrapper_test.go +++ b/markets/dagstore/wrapper_test.go @@ -8,6 +8,10 @@ import ( "testing" "time" + mh "github.com/multiformats/go-multihash" + + carindex "github.com/ipld/go-car/v2/index" + "golang.org/x/xerrors" "github.com/filecoin-project/lotus/node/config" @@ -132,6 +136,14 @@ type mockDagStore struct { close chan struct{} } +func (m *mockDagStore) GetIterableIndex(key shard.Key) (carindex.IterableIndex, error) { + return nil, nil +} + +func (m *mockDagStore) ShardsContainingMultihash(h mh.Multihash) ([]shard.Key, error) { + return nil, nil +} + func (m *mockDagStore) GetShardKeysForCid(c cid.Cid) ([]shard.Key, error) { panic("implement me") } From 8d3017febb8c5077a817eccfc8acd56cc1b7f297 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 17 Nov 2021 15:02:11 +0400 Subject: [PATCH 14/99] make gen should work --- node/config/doc_gen.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 296501edcfb..394f8ab09db 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -339,6 +339,22 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f Comment: ``, }, }, + "IndexerProviderConfig": []DocField{ + { + Name: "ListenAddresses", + Type: "[]string", + + Comment: `Binding address for the libp2p host - 0 means random port. +Format: multiaddress; see https://multiformats.io/multiaddr/`, + }, + { + Name: "MaxSimultaneousTransfers", + Type: "uint64", + + Comment: `The maximum number of simultaneous data transfers between the indexers +and the indexer provider`, + }, + }, "Libp2p": []DocField{ { Name: "ListenAddresses", @@ -814,6 +830,12 @@ Default is 20 (about once a week).`, Comment: ``, }, + { + Name: "IndexerProvider", + Type: "IndexerProviderConfig", + + Comment: ``, + }, { Name: "Sealing", Type: "SealingConfig", From 501308239fc92a5d3c048537d84c7fec1baf761f Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 17 Nov 2021 12:14:10 +0100 Subject: [PATCH 15/99] feat: CLI command to announce deal to indexers --- api/api_storage.go | 4 ++ api/proxy_gen.go | 13 ++++ build/openrpc/full.json.gz | Bin 25453 -> 25453 bytes build/openrpc/miner.json.gz | Bin 10467 -> 10575 bytes build/openrpc/worker.json.gz | Bin 2713 -> 2713 bytes cmd/lotus-miner/index_provider.go | 58 ++++++++++++++++++ cmd/lotus-miner/main.go | 1 + documentation/en/api-v0-methods-miner.md | 23 +++++++ documentation/en/cli-lotus-miner.md | 32 ++++++++++ .../en/default-lotus-miner-config.toml | 28 +++++++++ node/impl/storminer.go | 4 ++ 11 files changed, 163 insertions(+) create mode 100644 cmd/lotus-miner/index_provider.go diff --git a/api/api_storage.go b/api/api_storage.go index 8cca2aa5be5..fc2f58a2634 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -210,6 +210,10 @@ type StorageMiner interface { // DagstoreGC runs garbage collection on the DAG store. DagstoreGC(ctx context.Context) ([]DagstoreShardResult, error) //perm:admin + // IndexerAnnounceDeal informs indexer nodes that a new deal was received, + // so they can download its index + IndexerAnnounceDeal(ctx context.Context, proposalCid cid.Cid) error + // RuntimeSubsystems returns the subsystems that are enabled // in this instance. RuntimeSubsystems(ctx context.Context) (MinerSubsystems, error) //perm:read diff --git a/api/proxy_gen.go b/api/proxy_gen.go index b36f19a7e1e..0ce7ee8dd88 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -657,6 +657,8 @@ type StorageMinerStruct struct { DealsSetPieceCidBlocklist func(p0 context.Context, p1 []cid.Cid) error `perm:"admin"` + IndexerAnnounceDeal func(p0 context.Context, p1 cid.Cid) error `` + MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` MarketDataTransferUpdates func(p0 context.Context) (<-chan DataTransferChannel, error) `perm:"write"` @@ -3879,6 +3881,17 @@ func (s *StorageMinerStub) DealsSetPieceCidBlocklist(p0 context.Context, p1 []ci return ErrNotSupported } +func (s *StorageMinerStruct) IndexerAnnounceDeal(p0 context.Context, p1 cid.Cid) error { + if s.Internal.IndexerAnnounceDeal == nil { + return ErrNotSupported + } + return s.Internal.IndexerAnnounceDeal(p0, p1) +} + +func (s *StorageMinerStub) IndexerAnnounceDeal(p0 context.Context, p1 cid.Cid) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) MarketCancelDataTransfer(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error { if s.Internal.MarketCancelDataTransfer == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1578d746536613ea03a22c6165e5561d65e3df7a..68f5e80cc46d1aa9137e152e97f358580a4ad40f 100644 GIT binary patch literal 25453 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 z y<-d)STFDNQWSi26+l@}+ z1Y4N0A;JZJy z4*V9fIaBbg8t2jf7V_IjDlW(f8aH4oF0Nr{A-{vZ-H`!pd}Tgy9EcjYq2IwmeixP9 z>CM}^Ac`D+q62+Nhs1`)IdR>~3k!h|TpXg8TXw7H5Xr_RQy>^|=hC5{e@2YDQI%UI zKm~%KpBOylnme@6FG76b>L&1gE)+PLW~zT;vV!&x{FWA53#os_+*cw1JsG|Ln`gdh`hDZ9Cz4P{(Mj?}ocTbFf80p`r8V3U;z~c&#OW6aqa3EaV z$77{@*>5&SVU>o>z2-265J$e?ny;p-;Yf4f@3M7Me^I^}5U2sbP8jJf0DuKOUN2!~Ftoo9hZ0n^u?@3J zYYxns>90C=*0FQnVrToTICfsLAvcVenxr^Cv-mJX*IX6>_5Dh5FKNyw_QjlTC4EzW z#M~06kf~I~G5m{5HSbCTfAmP)K>Oy)5#s``LGnP@v-GotQw1;hGk90yiKI4halhBG zbivIN@#h!UAVEB89n}TrS6^lH*Kgrp+PO~+y-C9G%gmVK70a}M=Xsr3=4!eifkDp^ z_fPjMuHe?;`F>@*25H+f8nq6LteJTFgOQeN(ekd^hq6IZXP0iQB{t zc`v&AC(zNjQZi+ODUw~awc}2StqE>}ls6z{q+CWummw~;z967ZKyK_+2$@l+q@FLJ-AoLxjN46S)4m-m7Flw4*g2N`styBcq192h1Jv= z5intBn?W!mb~@ct$HJYk-(84>d!Od1Qy(>os8Pf_LJ{qfgXo!vxXyw(Azp9IoP^`` zmd#23KLj+?i|3txGu2%H429bK_Ao;o`Rd5GZ;`K4a*TYvjrFhJQNOLN^sDyJf1(et za4x_?gFvDA=6V+IwMy-n*H++A8NOAp-Yx%bcFUjjN)9#OfLiY*nF(PTOdN3TF4^su zH1OITe;HPm?D|VO^oV$nNR44;6+|M4?louD(Li6gLTXHZ^beItf>M-?Zkb0WNRbCX z1P$Q{Nw7I{BvKq{_fAGcfxb{gJ|L~`PT+2EkKvDbJ7>L#?^EyWxa81eynXbeYDyy~3hYvs3N8R;#nDZC|5vVpf0sXY;Yuw8N!lvr}vMYc%{r z$;m)HClLZzL%}1$jp=vP+$Pj}&RDJ8??SszOU~`g=EU@M4s*KVC9p^QZ~2M8lOgrX zblJjq-tv;A@rve+7R+f$iVa~_10CH4tyULM^x}elS1*KDNRgY7)%B|++-7#AwRC1$ z{g-gdt51|3l&eg>sqxdw1l69Wj?PMsVGlHz|`k6W@sRG-JGpSx6gO<2w>w)lOgUaNb$iBCN3?U$QSu+hQOnA&4RnM1XRx(_dK6}9!Hh)%0RR68 L-M9-cS$Y5f@zzlj delta 2706 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", + Usage: "Announce a deal to indexers so they can download its index", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "color", + Usage: "use color in display output", + DefaultText: "depends on output being a TTY", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.IsSet("color") { + color.NoColor = !cctx.Bool("color") + } + + if cctx.NArg() != 1 { + return fmt.Errorf("must provide the deal proposal CID") + } + + proposalCidStr := cctx.Args().First() + proposalCid, err := cid.Parse(proposalCidStr) + if err != nil { + return fmt.Errorf("invalid deal proposal CID: %w", proposalCid) + } + + marketsApi, closer, err := lcli.GetMarketsAPI(cctx) + if err != nil { + return err + } + defer closer() + + ctx := lcli.ReqContext(cctx) + + return marketsApi.IndexerAnnounceDeal(ctx, proposalCid) + }, +} diff --git a/cmd/lotus-miner/main.go b/cmd/lotus-miner/main.go index 110748f482d..7bb923ac651 100644 --- a/cmd/lotus-miner/main.go +++ b/cmd/lotus-miner/main.go @@ -49,6 +49,7 @@ func main() { lcli.WithCategory("market", retrievalDealsCmd), lcli.WithCategory("market", dataTransfersCmd), lcli.WithCategory("market", dagstoreCmd), + lcli.WithCategory("market", indexProvCmd), lcli.WithCategory("storage", sectorsCmd), lcli.WithCategory("storage", provingCmd), lcli.WithCategory("storage", storageCmd), diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 4d14bcb0e34..c44c312b693 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -43,6 +43,8 @@ * [DealsSetPieceCidBlocklist](#DealsSetPieceCidBlocklist) * [I](#I) * [ID](#ID) +* [Indexer](#Indexer) + * [IndexerAnnounceDeal](#IndexerAnnounceDeal) * [Log](#Log) * [LogAlerts](#LogAlerts) * [LogList](#LogList) @@ -663,6 +665,27 @@ Inputs: `null` Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` +## Indexer + + +### IndexerAnnounceDeal +IndexerAnnounceDeal informs indexer nodes that a new deal was received, +so they can download its index + + +Perms: + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `{}` + ## Log diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index d5b94fb8965..62d2d2a16f4 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -30,6 +30,7 @@ COMMANDS: retrieval-deals Manage retrieval deals and related configuration data-transfers Manage data transfers dagstore Manage the dagstore on the markets subsystem + index Manage the index provider on the markets subsystem NETWORK: net Manage P2P Network RETRIEVAL: @@ -1114,6 +1115,37 @@ OPTIONS: ``` +## lotus-miner index +``` +NAME: + lotus-miner index - Manage the index provider on the markets subsystem + +USAGE: + lotus-miner index command [command options] [arguments...] + +COMMANDS: + announce Announce a deal to indexers so they can download its index + help, h Shows a list of commands or help for one command + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus-miner index announce +``` +NAME: + lotus-miner index announce - Announce a deal to indexers so they can download its index + +USAGE: + lotus-miner index announce [command options] + +OPTIONS: + --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) + +``` + ## lotus-miner net ``` NAME: diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index d402f65edca..e99b908b29b 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -246,6 +246,34 @@ #Path = "" +[IndexerProvider] + # env var: LOTUS_INDEXERPROVIDER_LINKCACHESIZE + #LinkCacheSize = 0 + + # env var: LOTUS_INDEXERPROVIDER_LINKEDCHUNKSIZE + #LinkedChunkSize = 0 + + # env var: LOTUS_INDEXERPROVIDER_PUBSUBTOPIC + #PubSubTopic = "" + + # env var: LOTUS_INDEXERPROVIDER_PURGELINKCACHE + #PurgeLinkCache = false + + # Binding address for the libp2p host - 0 means random port. + # Format: multiaddress; see https://multiformats.io/multiaddr/ + # + # type: []string + # env var: LOTUS_INDEXERPROVIDER_LISTENADDRESSES + #ListenAddresses = ["/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0"] + + # The maximum number of simultaneous data transfers between the indexers + # and the indexer provider + # + # type: uint64 + # env var: LOTUS_INDEXERPROVIDER_MAXSIMULTANEOUSTRANSFERS + #MaxSimultaneousTransfers = 20 + + [Sealing] # Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time. # If the miner is accepting multiple deals in parallel, up to MaxWaitDealsSectors of new sectors will be created. diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 39baa97bf25..692d3b6d9c0 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -832,6 +832,10 @@ func (sm *StorageMinerAPI) DagstoreGC(ctx context.Context) ([]api.DagstoreShardR return ret, nil } +func (sm *StorageMinerAPI) IndexerAnnounceDeal(ctx context.Context, proposalCid cid.Cid) error { + return sm.StorageProvider.AnnounceDealToIndexer(ctx, proposalCid) +} + func (sm *StorageMinerAPI) DealsList(ctx context.Context) ([]api.MarketDeal, error) { return sm.listDeals(ctx) } From 60fe55cdc09bb0fbb1833465fa71dd3f15ea4246 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 17 Nov 2021 15:25:25 +0400 Subject: [PATCH 16/99] fix lint and gen --- .../en/default-lotus-miner-config.toml | 28 +++++++++++++++++++ itests/deals_anycid_test.go | 7 +++-- 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index d402f65edca..e99b908b29b 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -246,6 +246,34 @@ #Path = "" +[IndexerProvider] + # env var: LOTUS_INDEXERPROVIDER_LINKCACHESIZE + #LinkCacheSize = 0 + + # env var: LOTUS_INDEXERPROVIDER_LINKEDCHUNKSIZE + #LinkedChunkSize = 0 + + # env var: LOTUS_INDEXERPROVIDER_PUBSUBTOPIC + #PubSubTopic = "" + + # env var: LOTUS_INDEXERPROVIDER_PURGELINKCACHE + #PurgeLinkCache = false + + # Binding address for the libp2p host - 0 means random port. + # Format: multiaddress; see https://multiformats.io/multiaddr/ + # + # type: []string + # env var: LOTUS_INDEXERPROVIDER_LISTENADDRESSES + #ListenAddresses = ["/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0"] + + # The maximum number of simultaneous data transfers between the indexers + # and the indexer provider + # + # type: uint64 + # env var: LOTUS_INDEXERPROVIDER_MAXSIMULTANEOUSTRANSFERS + #MaxSimultaneousTransfers = 20 + + [Sealing] # Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time. # If the miner is accepting multiple deals in parallel, up to MaxWaitDealsSectors of new sectors will be created. diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index b7799f2980c..87bb93562fe 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -7,13 +7,14 @@ import ( "testing" "time" + selectorparse "github.com/ipld/go-ipld-prime/traversal/selector/parse" + "github.com/filecoin-project/go-state-types/abi" ipld "github.com/ipfs/go-ipld-format" "github.com/ipld/go-car" "github.com/ipld/go-car/v2/blockstore" "github.com/stretchr/testify/require" - "github.com/filecoin-project/go-fil-markets/shared" "github.com/filecoin-project/go-fil-markets/storagemarket" "github.com/filecoin-project/lotus/api" @@ -82,7 +83,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { require.NoError(t, err) // Get all CIDs from the file - sc := car.NewSelectiveCar(ctx, bs, []car.Dag{{Root: res.Root, Selector: shared.AllSelector()}}) + sc := car.NewSelectiveCar(ctx, bs, []car.Dag{{Root: res.Root, Selector: selectorparse.CommonSelector_ExploreAllRecursively}}) prepared, err := sc.Prepare() require.NoError(t, err) cids := prepared.Cids() @@ -147,7 +148,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { rd, []car.Dag{{ Root: targetCid, - Selector: shared.AllSelector(), + Selector: selectorparse.CommonSelector_ExploreAllRecursively, }}, ).Write(tmp) require.NoError(t, err) From 599a6bfb246d0cbb1174573d3b4f5348e2bd3871 Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Wed, 17 Nov 2021 12:37:15 +0100 Subject: [PATCH 17/99] fix: err message --- cmd/lotus-miner/index_provider.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/lotus-miner/index_provider.go b/cmd/lotus-miner/index_provider.go index 584e203dcf7..fa9574460e2 100644 --- a/cmd/lotus-miner/index_provider.go +++ b/cmd/lotus-miner/index_provider.go @@ -42,7 +42,7 @@ var indexProvAnnounceCmd = &cli.Command{ proposalCidStr := cctx.Args().First() proposalCid, err := cid.Parse(proposalCidStr) if err != nil { - return fmt.Errorf("invalid deal proposal CID: %w", proposalCid) + return fmt.Errorf("invalid deal proposal CID: %w", err) } marketsApi, closer, err := lcli.GetMarketsAPI(cctx) From 5454aebf13a563ddb55a5790e29b91190e0f7b22 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 17 Nov 2021 15:39:45 +0200 Subject: [PATCH 18/99] CLI tools for the DAGStore inverted index (#7361) * cli commands for dagstore * address comments from Dirk * rename inverted index to piece index --- api/api_storage.go | 8 +- api/proxy_gen.go | 28 ++++- build/openrpc/full.json.gz | Bin 25453 -> 25456 bytes build/openrpc/miner.json.gz | Bin 10575 -> 10721 bytes build/openrpc/worker.json.gz | Bin 2713 -> 2710 bytes cmd/lotus-miner/dagstore.go | 148 ++++++++++++++++++----- documentation/en/api-v0-methods-miner.md | 31 ++++- documentation/en/cli-lotus-miner.md | 30 +++++ node/impl/storminer.go | 51 ++++++++ 9 files changed, 261 insertions(+), 35 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index fc2f58a2634..21c2d968824 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -212,7 +212,13 @@ type StorageMiner interface { // IndexerAnnounceDeal informs indexer nodes that a new deal was received, // so they can download its index - IndexerAnnounceDeal(ctx context.Context, proposalCid cid.Cid) error + IndexerAnnounceDeal(ctx context.Context, proposalCid cid.Cid) error //perm:admin + + // DagstorePieceIndexSize returns the size of the piece index. + DagstorePieceIndexSize(ctx context.Context) (int64, error) //perm:admin + + // DagstoreLookupPieces returns information about shards that contain the given CID. + DagstoreLookupPieces(ctx context.Context, cid cid.Cid) ([]DagstoreShardInfo, error) //perm:admin // RuntimeSubsystems returns the subsystems that are enabled // in this instance. diff --git a/api/proxy_gen.go b/api/proxy_gen.go index 0ce7ee8dd88..06b3a16625d 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -623,6 +623,10 @@ type StorageMinerStruct struct { DagstoreListShards func(p0 context.Context) ([]DagstoreShardInfo, error) `perm:"read"` + DagstoreLookupPieces func(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) `perm:"admin"` + + DagstorePieceIndexSize func(p0 context.Context) (int64, error) `perm:"admin"` + DagstoreRecoverShard func(p0 context.Context, p1 string) error `perm:"write"` DealsConsiderOfflineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` @@ -657,7 +661,7 @@ type StorageMinerStruct struct { DealsSetPieceCidBlocklist func(p0 context.Context, p1 []cid.Cid) error `perm:"admin"` - IndexerAnnounceDeal func(p0 context.Context, p1 cid.Cid) error `` + IndexerAnnounceDeal func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` @@ -3694,6 +3698,28 @@ func (s *StorageMinerStub) DagstoreListShards(p0 context.Context) ([]DagstoreSha return *new([]DagstoreShardInfo), ErrNotSupported } +func (s *StorageMinerStruct) DagstoreLookupPieces(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) { + if s.Internal.DagstoreLookupPieces == nil { + return *new([]DagstoreShardInfo), ErrNotSupported + } + return s.Internal.DagstoreLookupPieces(p0, p1) +} + +func (s *StorageMinerStub) DagstoreLookupPieces(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) { + return *new([]DagstoreShardInfo), ErrNotSupported +} + +func (s *StorageMinerStruct) DagstorePieceIndexSize(p0 context.Context) (int64, error) { + if s.Internal.DagstorePieceIndexSize == nil { + return 0, ErrNotSupported + } + return s.Internal.DagstorePieceIndexSize(p0) +} + +func (s *StorageMinerStub) DagstorePieceIndexSize(p0 context.Context) (int64, error) { + return 0, ErrNotSupported +} + func (s *StorageMinerStruct) DagstoreRecoverShard(p0 context.Context, p1 string) error { if s.Internal.DagstoreRecoverShard == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 68f5e80cc46d1aa9137e152e97f358580a4ad40f..810bd301719b6fe2a459c9dcb7daf53915232e0f 100644 GIT binary patch literal 25456 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%0Augxt&?M1iRc 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 NCFpmx-ai-63yZp4YW^JV7KdRsFxzcG>^ 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 AhX4Qo delta 1865 zcmV-P2e$Z@6`2*V`T~DGoStZz@<8MlMg}f8hBzdqDu5w}=wQIPy9^z~#Kqts8ZiSb zkg!r5`VC@yk=<)ya)T2WuC{NjB`LqC>42~|u1aSgidE@XQ1;kRkwO|XG@Cfus9g82 z0YwOBlbcsWjpO28s`#TF4*O^BfFY<2S=|<*osB~^I9ub^cZh#m%k+MGpl$<*E)Pue z7FtQ`ums{#Ho_^Uq!MAtW?*K{KUCw(;Ku&C}Lt2|S>Txb!>3b76=R zGQ_6ouUYvuVI$+PpXqsP@qbai84#!ez)l$HE&zZ9Jzg(iWiYhA4~G&|wXqGeOKT3y zn(41PcGj_T-(r7f`>Z&2Ua}!KjF_6FI6t%aFhti}76JABN^vh~&M5Z9oNgt3Q^ed7 zr;w>s#WDPgOEvFG1Ap{L+(7&0%Ms%Ou0irZ*t7Jrg;NDD_%nD{2r&AHFZF}moZG6Pwqi_F+oB#36Fc2m96ZmZZ$eddpF6JZoXZ>uZG?=^xn6a)@v8Xv@4><(lDBZG{xXMTEv5F#Gyb}T^5+a zrj~@HqV_$E!qSY_t-$Xh?n?3+xk}qjZk!W#12J06L0o-Pvs8RH@(MXj`ia}b4S6rR z`zO%RxKc7@gDH|-wYB3;lQIQxf4aqHb`35N31686V!rohf%->2i&^M;TPwA^g!O7| zr?BTPtk&wMG4+zLUJ~y0lJG;XEPjTYeoVurCMt`TWI$uTe|d2jMZn?!s2eGcdnWNM zW<_^h9MWdF&?fp_jWvqgP>f5XmRneg(hQVFN=e-7aQ(zU%K6c_&}N9O=p*E6^x}hc;qjX2 zA*z48(8W1*q#?*niLot!n;ogeJ;z#%8tCpsMBN3To41ZVJStae=Wklp{6^;mkG1tx zOW4zSoH30DC3MJ4p-Tstf1*R0*5o8%`hQr%q(<&|h11f0y`tBer&;FyWs6*T5UXWZ3NuX*Zah1OfCqkG*IOu*voe zU1id_*?gvl!Gv;?Agf-G)(g_NjG50$4sj-UE+4+DV&;zdz8hT{f5XV%1GP5H?Q9?B zcIq7NuG!`;K-;_$zdg8D$GJMr?OB{VYn7ZZ*AD$k!20Q-gm@zvqJ`De8WAvIXq!PW zBX&C7Q^&%cu-{#Xg?pdosZ$>{il|YM-?e{PvaCPM1j6gL_Q#`?oQxtaF5}Sc{^vliSJYI?6~C6WW0U!qvM39;!F)EOI^Om z5|oXW*-y5eR~u1|t#V7+*or932~~SRV*33fn|vYRyVL5ElH-Yg5czNs`94F9PEnR> zGZ0rhL>YDyf4#z@RI^jir!MmBXC z=hQKL;*#QjTaR0^LsXx~sh_)4dQDi)EVlT4r(Uajx`|Ib?d_MU_H6%5{s2tuJy*|6 z;U<@Ce_Q9&K|*&gfhjGD1b288)frGWilPKlh&YY_DZxQ>-dY1)Dm?&0ENYFb5IzS=Sm9Ic{VX zXETRw>JLTKPburClp1Otw^}8qSz=o@gqbl_fAJD+?jFivUR-4f#EWYfA-jaDt-N2a zY^aj*Ek)68yW2TkJC5$CLbgk`o&QOw`gcG<8LH%*u23mUlV5YP*XF*`{THiW($&D_ z_Jc$LQ`ALj3<3}lfLQdDP9hO77Czg1rN+LqWYlr1bBd?ayXpS|00960-M9-cS$Y5f DQt7=m diff --git a/cmd/lotus-miner/dagstore.go b/cmd/lotus-miner/dagstore.go index 6522b02dc0c..c79906b782b 100644 --- a/cmd/lotus-miner/dagstore.go +++ b/cmd/lotus-miner/dagstore.go @@ -4,7 +4,9 @@ import ( "fmt" "os" + "github.com/dustin/go-humanize" "github.com/fatih/color" + "github.com/ipfs/go-cid" "github.com/urfave/cli/v2" "github.com/filecoin-project/lotus/api" @@ -21,6 +23,8 @@ var dagstoreCmd = &cli.Command{ dagstoreRecoverShardCmd, dagstoreInitializeAllCmd, dagstoreGcCmd, + dagstorePieceIndexSizeCmd, + dagstoreLookupPiecesCmd, }, } @@ -52,38 +56,7 @@ var dagstoreListShardsCmd = &cli.Command{ return err } - if len(shards) == 0 { - return nil - } - - tw := tablewriter.New( - tablewriter.Col("Key"), - tablewriter.Col("State"), - tablewriter.Col("Error"), - ) - - colors := map[string]color.Attribute{ - "ShardStateAvailable": color.FgGreen, - "ShardStateServing": color.FgBlue, - "ShardStateErrored": color.FgRed, - "ShardStateNew": color.FgYellow, - } - - for _, s := range shards { - m := map[string]interface{}{ - "Key": s.Key, - "State": func() string { - if c, ok := colors[s.State]; ok { - return color.New(c).Sprint(s.State) - } - return s.State - }(), - "Error": s.Error, - } - tw.Write(m) - } - - return tw.Flush(os.Stdout) + return printTableShards(shards) }, } @@ -265,3 +238,114 @@ var dagstoreGcCmd = &cli.Command{ return nil }, } + +func printTableShards(shards []api.DagstoreShardInfo) error { + if len(shards) == 0 { + return nil + } + + tw := tablewriter.New( + tablewriter.Col("Key"), + tablewriter.Col("State"), + tablewriter.Col("Error"), + ) + + colors := map[string]color.Attribute{ + "ShardStateAvailable": color.FgGreen, + "ShardStateServing": color.FgBlue, + "ShardStateErrored": color.FgRed, + "ShardStateNew": color.FgYellow, + } + + for _, s := range shards { + m := map[string]interface{}{ + "Key": s.Key, + "State": func() string { + if c, ok := colors[s.State]; ok { + return color.New(c).Sprint(s.State) + } + return s.State + }(), + "Error": s.Error, + } + tw.Write(m) + } + return tw.Flush(os.Stdout) +} + +var dagstorePieceIndexSizeCmd = &cli.Command{ + Name: "piece-index-size", + Usage: "Inspect the dagstore piece index size", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "color", + Usage: "use color in display output", + DefaultText: "depends on output being a TTY", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.IsSet("color") { + color.NoColor = !cctx.Bool("color") + } + + marketsApi, closer, err := lcli.GetMarketsAPI(cctx) + if err != nil { + return err + } + defer closer() + + ctx := lcli.ReqContext(cctx) + + size, err := marketsApi.DagstorePieceIndexSize(ctx) + if err != nil { + return err + } + + fmt.Println(humanize.Bytes(uint64(size))) + + return nil + }, +} + +var dagstoreLookupPiecesCmd = &cli.Command{ + Name: "lookup-pieces", + Usage: "Lookup pieces that a given CID belongs to", + ArgsUsage: "", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "color", + Usage: "use color in display output", + DefaultText: "depends on output being a TTY", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.IsSet("color") { + color.NoColor = !cctx.Bool("color") + } + + if cctx.NArg() != 1 { + return fmt.Errorf("must provide a CID") + } + + cidStr := cctx.Args().First() + cid, err := cid.Parse(cidStr) + if err != nil { + return fmt.Errorf("invalid CID: %w", err) + } + + marketsApi, closer, err := lcli.GetMarketsAPI(cctx) + if err != nil { + return err + } + defer closer() + + ctx := lcli.ReqContext(cctx) + + shards, err := marketsApi.DagstoreLookupPieces(ctx, cid) + if err != nil { + return err + } + + return printTableShards(shards) + }, +} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index c44c312b693..24b032636fb 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -23,6 +23,8 @@ * [DagstoreInitializeAll](#DagstoreInitializeAll) * [DagstoreInitializeShard](#DagstoreInitializeShard) * [DagstoreListShards](#DagstoreListShards) + * [DagstoreLookupPieces](#DagstoreLookupPieces) + * [DagstorePieceIndexSize](#DagstorePieceIndexSize) * [DagstoreRecoverShard](#DagstoreRecoverShard) * [Deals](#Deals) * [DealsConsiderOfflineRetrievalDeals](#DealsConsiderOfflineRetrievalDeals) @@ -444,6 +446,33 @@ Inputs: `null` Response: `null` +### DagstoreLookupPieces +DagstoreLookupPieces returns information about shards that contain the given CID. + + +Perms: admin + +Inputs: +```json +[ + { + "/": "bafy2bzacea3wsdh6y3a36tb3skempjoxqpuyompjbmfeyf34fi3uy6uue42v4" + } +] +``` + +Response: `null` + +### DagstorePieceIndexSize +DagstorePieceIndexSize returns the size of the piece index. + + +Perms: admin + +Inputs: `null` + +Response: `9` + ### DagstoreRecoverShard DagstoreRecoverShard attempts to recover a failed shard. @@ -673,7 +702,7 @@ IndexerAnnounceDeal informs indexer nodes that a new deal was received, so they can download its index -Perms: +Perms: admin Inputs: ```json diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 62d2d2a16f4..acf79adc4cb 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1036,6 +1036,8 @@ COMMANDS: recover-shard Attempt to recover a shard in errored state initialize-all Initialize all uninitialized shards, streaming results as they're produced; only shards for unsealed pieces are initialized by default gc Garbage collect the dagstore + piece-index-size Inspect the dagstore piece index size + lookup-pieces Lookup pieces that a given CID belongs to help, h Shows a list of commands or help for one command OPTIONS: @@ -1115,6 +1117,34 @@ OPTIONS: ``` +### lotus-miner dagstore piece-index-size +``` +NAME: + lotus-miner dagstore piece-index-size - Inspect the dagstore piece index size + +USAGE: + lotus-miner dagstore piece-index-size [command options] [arguments...] + +OPTIONS: + --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) + +``` + +### lotus-miner dagstore lookup-pieces +``` +NAME: + lotus-miner dagstore lookup-pieces - Lookup pieces that a given CID belongs to + +USAGE: + lotus-miner dagstore lookup-pieces [command options] + +OPTIONS: + --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) + +``` + ## lotus-miner index ``` NAME: diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 692d3b6d9c0..4a34eac8546 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -836,6 +836,57 @@ func (sm *StorageMinerAPI) IndexerAnnounceDeal(ctx context.Context, proposalCid return sm.StorageProvider.AnnounceDealToIndexer(ctx, proposalCid) } +func (sm *StorageMinerAPI) DagstorePieceIndexSize(ctx context.Context) (int64, error) { + if sm.DAGStore == nil { + return 0, fmt.Errorf("dagstore not available on this node") + } + + res, err := sm.DAGStore.TopLevelIndex.Size() + if err != nil { + return 0, fmt.Errorf("failed to get dagstore piece index size: %w", err) + } + + return res, nil +} + +func (sm *StorageMinerAPI) DagstoreLookupPieces(ctx context.Context, cid cid.Cid) ([]api.DagstoreShardInfo, error) { + if sm.DAGStore == nil { + return nil, fmt.Errorf("dagstore not available on this node") + } + + keys, err := sm.DAGStore.TopLevelIndex.GetShardsForMultihash(cid.Hash()) + if err != nil { + return nil, err + } + + var ret []api.DagstoreShardInfo + + for _, k := range keys { + shard, err := sm.DAGStore.GetShardInfo(k) + if err != nil { + return nil, err + } + + ret = append(ret, api.DagstoreShardInfo{ + Key: k.String(), + State: shard.ShardState.String(), + Error: func() string { + if shard.Error == nil { + return "" + } + return shard.Error.Error() + }(), + }) + } + + // order by key. + sort.SliceStable(ret, func(i, j int) bool { + return ret[i].Key < ret[j].Key + }) + + return ret, nil +} + func (sm *StorageMinerAPI) DealsList(ctx context.Context) ([]api.MarketDeal, error) { return sm.listDeals(ctx) } From 7655e660f3934a57dc9d957ece5e43e3c75b4195 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 18 Nov 2021 12:07:12 +0400 Subject: [PATCH 19/99] integrate store-the-hash --- go.mod | 3 ++- go.sum | 8 ++++++-- itests/kit/client.go | 11 ++++++++--- itests/kit/deals_state.go | 2 +- markets/dagstore/wrapper.go | 17 ++++++++++------- markets/dagstore/wrapper_migration_test.go | 7 ++++++- markets/dagstore/wrapper_test.go | 10 ++++++++-- node/modules/storageminer_dagstore.go | 6 ++++-- 8 files changed, 45 insertions(+), 19 deletions(-) diff --git a/go.mod b/go.mod index 06a6799b6e2..6b0f24f3ed0 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.5.0 + github.com/filecoin-project/dagstore v0.5.1-0.20211118071820-a75afb62d8ce github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 @@ -37,6 +37,7 @@ require ( github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.13.3-0.20211117072527-8713155662ff + github.com/filecoin-project/go-indexer-core v0.2.4 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 diff --git a/go.sum b/go.sum index 4831d889bfd..be18c532d47 100644 --- a/go.sum +++ b/go.sum @@ -302,8 +302,9 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.5.0 h1:akiheGtSCU7aGon6T74bwNbDhYW0XZCTsnORKNmzSgU= github.com/filecoin-project/dagstore v0.5.0/go.mod h1:Id2VG7uZxnF6NWR3JX1evNA83JonnU0U7Fc2r14Vltc= +github.com/filecoin-project/dagstore v0.5.1-0.20211118071820-a75afb62d8ce h1:cYK19JNHrVQD4nkh6b41wLU1TnxByaln+sc8AEtZT9I= +github.com/filecoin-project/dagstore v0.5.1-0.20211118071820-a75afb62d8ce/go.mod h1:bW1kjUKlVsQkITxKYlIdXHC8j/+wIgEl3caxUFJijGI= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -351,8 +352,9 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGy github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.2/go.mod h1:wV+NmrF8fHG6Xii3ecoZf2JW3laGTe5xtsWz609jo+Y= -github.com/filecoin-project/go-indexer-core v0.2.3 h1:kaUL2r8CuihK53lhmtCScffb7Bzs+N1yRGpwvxzCN+U= github.com/filecoin-project/go-indexer-core v0.2.3/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= +github.com/filecoin-project/go-indexer-core v0.2.4 h1:90vvxoBeNZN+h4W+vZ+VsoxKaDBr/bfZJJNByapGeM0= +github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.0.0-20211013165050-9ab325b6d2eb/go.mod h1:lKwBnslfNGG7JnsP9uQZl3yK7f74fit1MyHcwuuOP3k= @@ -427,6 +429,7 @@ github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= github.com/gammazero/radixtree v0.2.5 h1:muPQ4eEgCkUymFWPiVQRuXOQv4IhWg8YXH2r71MoqPM= github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= @@ -909,6 +912,7 @@ github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1 github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c h1:izfvqCuEqk2V7BRkh7GCm7lyKC2ItyAbzUu4WgNmggc= github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= diff --git a/itests/kit/client.go b/itests/kit/client.go index c9f8946ec8c..9fb546d8c5c 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -106,9 +106,14 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) tmpdir, err := ioutil.TempDir(os.TempDir(), "test-cli-Client") require.NoError(t, err) path := filepath.Join(tmpdir, "outfile.dat") - out = clientCLI.RunCmd("client", "retrieve", dataCid.String(), path) - fmt.Println("retrieve:\n", out) - require.Regexp(t, regexp.MustCompile("Success"), out) + + for { + out = clientCLI.RunCmd("client", "retrieve", dataCid.String(), path) + fmt.Println("retrieve:\n", out) + if strings.Contains(out, "Success") { + break + } + } } func CreateImportFile(ctx context.Context, client api.FullNode, rseed int, size int) (res *api.ImportRes, path string, data []byte, err error) { diff --git a/itests/kit/deals_state.go b/itests/kit/deals_state.go index 617a6d28e8d..1a69e20b9a7 100644 --- a/itests/kit/deals_state.go +++ b/itests/kit/deals_state.go @@ -14,7 +14,7 @@ func CategorizeDealState(dealStatus string) TestDealState { switch dealStatus { case "StorageDealFailing", "StorageDealError": return TestDealStateFailed - case "StorageDealStaged", "StorageDealAwaitingPreCommit", "StorageDealSealing", "StorageDealActive", "StorageDealExpired", "StorageDealSlashed": + case "StorageDealAwaitingPreCommit", "StorageDealSealing", "StorageDealActive", "StorageDealExpired", "StorageDealSlashed": return TestDealStateComplete } return TestDealStateInProgress diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go index 98c63361f45..34e848844c9 100644 --- a/markets/dagstore/wrapper.go +++ b/markets/dagstore/wrapper.go @@ -10,6 +10,9 @@ import ( "sync" "time" + "github.com/filecoin-project/go-indexer-core/store/storethehash" + "github.com/libp2p/go-libp2p-core/host" + carindex "github.com/ipld/go-car/v2/index" "github.com/ipfs/go-cid" @@ -56,7 +59,7 @@ type Wrapper struct { var _ stores.DAGStoreWrapper = (*Wrapper)(nil) -func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI) (*dagstore.DAGStore, *Wrapper, error) { +func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI, h host.Host) (*dagstore.DAGStore, *Wrapper, error) { // construct the DAG Store. registry := mount.NewRegistry() if err := registry.Register(lotusScheme, mountTemplate(minerApi)); err != nil { @@ -85,11 +88,11 @@ func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI) (*dagstore.DAGSto return nil, nil, xerrors.Errorf("failed to initialise dagstore index repo: %w", err) } - //store, err := storethehash.New(indexDir) - //if err != nil { - //return nil, nil, xerrors.Errorf("failed to initialise store the index: %w", err) - //} - //topIndex := index.NewInverted(store) + store, err := storethehash.New(indexDir) + if err != nil { + return nil, nil, xerrors.Errorf("failed to initialise store the index: %w", err) + } + topIndex := index.NewInverted(store, h.ID()) dcfg := dagstore.Config{ TransientsDir: transientsDir, @@ -98,7 +101,7 @@ func NewDAGStore(cfg config.DAGStoreConfig, minerApi MinerAPI) (*dagstore.DAGSto MountRegistry: registry, FailureCh: failureCh, TraceCh: traceCh, - //TopLevelIndex: topIndex, + TopLevelIndex: topIndex, // not limiting fetches globally, as the Lotus mount does // conditional throttling. MaxConcurrentIndex: cfg.MaxConcurrentIndex, diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index 13d8db876d9..eaa78259097 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -4,6 +4,8 @@ import ( "context" "testing" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + "github.com/filecoin-project/dagstore" "github.com/stretchr/testify/require" @@ -93,8 +95,11 @@ func TestShardRegistration(t *testing.T) { cfg := config.DefaultStorageMiner().DAGStore cfg.RootDir = t.TempDir() + h, err := mocknet.New(ctx).GenPeer() + require.NoError(t, err) + mapi := NewMinerAPI(ps, sa, 10) - dagst, w, err := NewDAGStore(cfg, mapi) + dagst, w, err := NewDAGStore(cfg, mapi, h) require.NoError(t, err) require.NotNil(t, dagst) require.NotNil(t, w) diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go index 4cf53737377..235edecb114 100644 --- a/markets/dagstore/wrapper_test.go +++ b/markets/dagstore/wrapper_test.go @@ -8,6 +8,8 @@ import ( "testing" "time" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + mh "github.com/multiformats/go-multihash" carindex "github.com/ipld/go-car/v2/index" @@ -31,11 +33,13 @@ func TestWrapperAcquireRecovery(t *testing.T) { pieceCid, err := cid.Parse("bafkqaaa") require.NoError(t, err) + h, err := mocknet.New(ctx).GenPeer() + require.NoError(t, err) // Create a DAG store wrapper dagst, w, err := NewDAGStore(config.DAGStoreConfig{ RootDir: t.TempDir(), GCInterval: config.Duration(1 * time.Millisecond), - }, mockLotusMount{}) + }, mockLotusMount{}, h) require.NoError(t, err) defer dagst.Close() //nolint:errcheck @@ -81,12 +85,14 @@ func TestWrapperAcquireRecovery(t *testing.T) { // TestWrapperBackground verifies the behaviour of the background go routine func TestWrapperBackground(t *testing.T) { ctx := context.Background() + h, err := mocknet.New(ctx).GenPeer() + require.NoError(t, err) // Create a DAG store wrapper dagst, w, err := NewDAGStore(config.DAGStoreConfig{ RootDir: t.TempDir(), GCInterval: config.Duration(1 * time.Millisecond), - }, mockLotusMount{}) + }, mockLotusMount{}, h) require.NoError(t, err) defer dagst.Close() //nolint:errcheck diff --git a/node/modules/storageminer_dagstore.go b/node/modules/storageminer_dagstore.go index 1f72a49b90e..3d0b101bd24 100644 --- a/node/modules/storageminer_dagstore.go +++ b/node/modules/storageminer_dagstore.go @@ -7,6 +7,8 @@ import ( "path/filepath" "strconv" + "github.com/libp2p/go-libp2p-core/host" + "go.uber.org/fx" "golang.org/x/xerrors" @@ -63,7 +65,7 @@ func NewMinerAPI(lc fx.Lifecycle, r repo.LockedRepo, pieceStore dtypes.ProviderP // DAGStore constructs a DAG store using the supplied minerAPI, and the // user configuration. It returns both the DAGStore and the Wrapper suitable for // passing to markets. -func DAGStore(lc fx.Lifecycle, r repo.LockedRepo, minerAPI mdagstore.MinerAPI) (*dagstore.DAGStore, *mdagstore.Wrapper, error) { +func DAGStore(lc fx.Lifecycle, r repo.LockedRepo, minerAPI mdagstore.MinerAPI, h host.Host) (*dagstore.DAGStore, *mdagstore.Wrapper, error) { cfg, err := extractDAGStoreConfig(r) if err != nil { return nil, nil, err @@ -82,7 +84,7 @@ func DAGStore(lc fx.Lifecycle, r repo.LockedRepo, minerAPI mdagstore.MinerAPI) ( } } - dagst, w, err := mdagstore.NewDAGStore(cfg, minerAPI) + dagst, w, err := mdagstore.NewDAGStore(cfg, minerAPI, h) if err != nil { return nil, nil, xerrors.Errorf("failed to create DAG store: %w", err) } From 780c40329ee93fcdb48be6418b58fbce4b787bb4 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 2 Dec 2021 12:32:17 +0000 Subject: [PATCH 20/99] Upgrade to the latest indexer dependencies Do not upgrade to the latest storetheindex, because it uses go-ipfs for bootstrapping mechanism and that comes with dependencies that we don not wish to upgrade in lotus just now; namely: - go-bitswap - go-path - interface-go-ipfs-core - go-libp2p-kad-dht - go-libp2p-quic-transport --- go.mod | 8 +++++--- go.sum | 26 ++++++++++++++++++-------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/go.mod b/go.mod index 6b0f24f3ed0..67567124271 100644 --- a/go.mod +++ b/go.mod @@ -37,15 +37,16 @@ require ( github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.13.3-0.20211117072527-8713155662ff - github.com/filecoin-project/go-indexer-core v0.2.4 + github.com/filecoin-project/go-indexer-core v0.2.6 github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1 // indirect github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.1.1 github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b - github.com/filecoin-project/index-provider v0.0.0-20211117103856-70cd9b7ab68b + github.com/filecoin-project/index-provider v0.0.0-20211117105122-6ee67478aad8 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.5 github.com/filecoin-project/specs-actors/v3 v3.1.1 @@ -53,6 +54,7 @@ require ( github.com/filecoin-project/specs-actors/v5 v5.0.4 github.com/filecoin-project/specs-actors/v6 v6.0.1 github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 + github.com/filecoin-project/storetheindex v0.0.0-20211126125638-1f013514c397 // indirect github.com/filecoin-project/test-vectors/schema v0.0.5 github.com/gbrlsnchs/jwt/v3 v3.0.1 github.com/gdamore/tcell/v2 v2.2.0 @@ -153,7 +155,7 @@ require ( go.uber.org/fx v1.9.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 - golang.org/x/net v0.0.0-20210917221730-978cfadd31cf + golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20210917161153-d61c044b1678 golang.org/x/time v0.0.0-20210723032227-1f47c861a9ac diff --git a/go.sum b/go.sum index be18c532d47..ca3f5f0c7dc 100644 --- a/go.sum +++ b/go.sum @@ -353,13 +353,16 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AG github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.2/go.mod h1:wV+NmrF8fHG6Xii3ecoZf2JW3laGTe5xtsWz609jo+Y= github.com/filecoin-project/go-indexer-core v0.2.3/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= -github.com/filecoin-project/go-indexer-core v0.2.4 h1:90vvxoBeNZN+h4W+vZ+VsoxKaDBr/bfZJJNByapGeM0= github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= +github.com/filecoin-project/go-indexer-core v0.2.6 h1:3Pt5+ZG20G5R1VF2eS0sawhqKCzc8cVb/WJ4fEeruZg= +github.com/filecoin-project/go-indexer-core v0.2.6/go.mod h1:wW5Ab0gJXL2vT4iEMbPUfPs773iMc86Q8GtfSEqmu3Y= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.0.0-20211013165050-9ab325b6d2eb/go.mod h1:lKwBnslfNGG7JnsP9uQZl3yK7f74fit1MyHcwuuOP3k= -github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9 h1:NWe71o5Kgi/0/eMlPJKF//nnIPwOR73AXRk6R/+LLA4= github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9/go.mod h1:g32LVimhcYPte22LK8XslKqLBem54QxuMQmkrzbAyEI= +github.com/filecoin-project/go-legs v0.0.0-20211125094504-5fdf15090c48/go.mod h1:g32LVimhcYPte22LK8XslKqLBem54QxuMQmkrzbAyEI= +github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1 h1:dq7K8iCh8gnttxr35BHJcI6o/8I5z1sArlqL9LJjti0= +github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1/go.mod h1:8rq/QxX6wlL0AehqVi5CqxXT3xYz1LIpp1HCZ6qI2EY= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -385,8 +388,8 @@ github.com/filecoin-project/go-statestore v0.1.1/go.mod h1:LFc9hD+fRxPqiHiaqUEZO github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b h1:fkRZSPrYpk42PV3/lIXiL0LHetxde7vyYYvSsttQtfg= github.com/filecoin-project/go-storedcounter v0.0.0-20200421200003-1c99c62e8a5b/go.mod h1:Q0GQOBtKf1oE10eSXSlhN45kDBdGvEcVOqMiffqX+N8= github.com/filecoin-project/index-provider v0.0.0-20211116211010-ae6b83454d89/go.mod h1:wu0yi7NbT3VzYr3s0n2zheg3mpdSP09A0hBFIQfUs44= -github.com/filecoin-project/index-provider v0.0.0-20211117103856-70cd9b7ab68b h1:qVQpqoguf9+vPONSMQZ3xYVzxzwAITyBHjM238zAr6c= -github.com/filecoin-project/index-provider v0.0.0-20211117103856-70cd9b7ab68b/go.mod h1:wu0yi7NbT3VzYr3s0n2zheg3mpdSP09A0hBFIQfUs44= +github.com/filecoin-project/index-provider v0.0.0-20211117105122-6ee67478aad8 h1:FQSKRQj8Us2TsfdvnEchfS0HHPLWpQX/8mY7XbVCOKM= +github.com/filecoin-project/index-provider v0.0.0-20211117105122-6ee67478aad8/go.mod h1:wu0yi7NbT3VzYr3s0n2zheg3mpdSP09A0hBFIQfUs44= github.com/filecoin-project/specs-actors v0.9.4/go.mod h1:BStZQzx5x7TmCkLv0Bpa07U6cPKol6fd3w9KjMPZ6Z4= github.com/filecoin-project/specs-actors v0.9.12/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -409,8 +412,9 @@ github.com/filecoin-project/specs-actors/v6 v6.0.1 h1:laxvHNsvrq83Y9n+W7znVCePi3 github.com/filecoin-project/specs-actors/v6 v6.0.1/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506 h1:Ur/l2+6qN+lQiqjozWWc5p9UDaAMDZKTlDS98oRnlIw= github.com/filecoin-project/specs-storage v0.1.1-0.20201105051918-5188d9774506/go.mod h1:nJRRM7Aa9XVvygr3W9k6xGF46RWzr2zxF/iGoAIfA/g= -github.com/filecoin-project/storetheindex v0.0.0-20211019180831-2704585e5f99 h1:qdlA/LrP6UeYFkyXdZzzQaaUNvKXjRIP5j86peIzgvI= github.com/filecoin-project/storetheindex v0.0.0-20211019180831-2704585e5f99/go.mod h1:IwKNyPe59SXmss9mKhx2GzkJXTBSmSjl1FiQTwFdsus= +github.com/filecoin-project/storetheindex v0.0.0-20211126125638-1f013514c397 h1:ZrRU/3QITMjT+JP3qp62VkRiPMgVh74iRer354wLCDg= +github.com/filecoin-project/storetheindex v0.0.0-20211126125638-1f013514c397/go.mod h1:vRNYKeVJ/kdL/dMuWioZZt9K5pZ4SU5RV2lXlAKDLBo= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -904,6 +908,7 @@ github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/ github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= github.com/ipld/go-ipld-prime v0.12.0/go.mod h1:hy8b93WleDMRKumOJnTIrr0MbbFbx9GD6Kzxa53Xppc= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.12.4-0.20211026094848-168715526f2d/go.mod h1:JUI6cS52J83Tz5li0Zl6M2tDX4r5x68Y77K1fbXHFYo= github.com/ipld/go-ipld-prime v0.14.0 h1:2FnBqUjmmgxgZD6/zB3eygWlmIsHNGrZ57L99x3xD6Q= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= @@ -912,8 +917,9 @@ github.com/ipld/go-ipld-prime-proto v0.0.0-20200922192210-9a2bfd4440a6/go.mod h1 github.com/ipld/go-ipld-prime-proto v0.1.0/go.mod h1:11zp8f3sHVgIqtb/c9Kr5ZGqpnCLF1IVTNOez9TopzE= github.com/ipld/go-ipld-selector-text-lite v0.0.0 h1:MLU1YUAgd3Z+RfVCXUbvxH1RQjEe+larJ9jmlW1aMgA= github.com/ipld/go-ipld-selector-text-lite v0.0.0/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c h1:izfvqCuEqk2V7BRkh7GCm7lyKC2ItyAbzUu4WgNmggc= github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= +github.com/ipld/go-storethehash v0.0.0-20211122175924-41b16c131842 h1:X1UkORbce9wX7S72MMIX9DAe00U8Ln2xG+haUhaLCUw= +github.com/ipld/go-storethehash v0.0.0-20211122175924-41b16c131842/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1125,6 +1131,8 @@ github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpg github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.5.1 h1:CJylx+h2+4+s68GvrM4pGNyfNhOYviWBPtVv5PA7sfo= github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-gostream v0.3.1 h1:XlwohsPn6uopGluEWs1Csv1QCEjrTXf2ZQagzZ5paAg= +github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -2023,8 +2031,9 @@ golang.org/x/crypto v0.0.0-20210513164829-c07d793c2f9a/go.mod h1:P+XmwS30IXTQdn5 golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= -golang.org/x/crypto v0.0.0-20210915214749-c084706c2272 h1:3erb+vDS8lU1sxfDHF4/hhWyaXnhIaO+7RgL4fDZORA= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871 h1:/pEO3GD/ABYAjuakUS6xSEmmlyVS4kxBNkeA9tLJiTI= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20181106170214-d68db9428509/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2139,8 +2148,9 @@ golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20210917221730-978cfadd31cf h1:R150MpwJIv1MpS0N/pc+NhTM8ajzvlmxlY5OYsrevXQ= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 h1:CIJ76btIcR3eFI5EgSo6k1qKw9KJexJuRLI9G7Hp5wE= +golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181017192945-9dcd33a902f4/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= golang.org/x/oauth2 v0.0.0-20181203162652-d668ce993890/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= From 43cde484f44fc0307534333a204ae28690a27bcb Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 9 Dec 2021 16:23:12 +0000 Subject: [PATCH 21/99] Upgrade go-legs to a version with debugging features In order to debug the gossipsub issue, upgrade go-legs to a branch that implments an admin HTTP API to allow checking peerstate connecting to a host and explicitly publishing CIDs. This is to reduce the roundtrip time we have to wait for a deal to be made and advertisement published to debug issues. Admin server runs on localhost only and will not be present in the final version of go-legs or will be disabled. See: - https://github.com/filecoin-project/go-legs/pull/47 --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 67567124271..971a453f9c2 100644 --- a/go.mod +++ b/go.mod @@ -39,7 +39,7 @@ require ( github.com/filecoin-project/go-fil-markets v1.13.3-0.20211117072527-8713155662ff github.com/filecoin-project/go-indexer-core v0.2.6 github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1 // indirect + github.com/filecoin-project/go-legs v0.0.0-20211209161055-918cd188bf1d // indirect github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.2 github.com/filecoin-project/go-state-types v0.1.1 diff --git a/go.sum b/go.sum index ca3f5f0c7dc..a46059f538f 100644 --- a/go.sum +++ b/go.sum @@ -363,6 +363,8 @@ github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9/go.mod h1 github.com/filecoin-project/go-legs v0.0.0-20211125094504-5fdf15090c48/go.mod h1:g32LVimhcYPte22LK8XslKqLBem54QxuMQmkrzbAyEI= github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1 h1:dq7K8iCh8gnttxr35BHJcI6o/8I5z1sArlqL9LJjti0= github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1/go.mod h1:8rq/QxX6wlL0AehqVi5CqxXT3xYz1LIpp1HCZ6qI2EY= +github.com/filecoin-project/go-legs v0.0.0-20211209161055-918cd188bf1d h1:DXm6XG2YibCTcm1vmNz9FWZ2nwz8tgoycrhclZRgKzA= +github.com/filecoin-project/go-legs v0.0.0-20211209161055-918cd188bf1d/go.mod h1:HFp0jUZopkX9DW6FOmhHltVfEatfAcm3ZD6Z/kY4iNg= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= From 6b7b9793abd67f29343d216e4d39b67cd0febccf Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Mon, 13 Dec 2021 14:44:56 +0000 Subject: [PATCH 22/99] Set default index provider ingest config values Set default values for index-provider ingest config. Leave a TODO to use provider config APIs once defaults exposed. Run `go mod tidy` --- go.sum | 2 -- node/config/def.go | 10 ++++++++++ node/config/def_test.go | 5 +++++ 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/go.sum b/go.sum index a46059f538f..17e1e4148bf 100644 --- a/go.sum +++ b/go.sum @@ -361,8 +361,6 @@ github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4G github.com/filecoin-project/go-legs v0.0.0-20211013165050-9ab325b6d2eb/go.mod h1:lKwBnslfNGG7JnsP9uQZl3yK7f74fit1MyHcwuuOP3k= github.com/filecoin-project/go-legs v0.0.0-20211112111427-68d536862db9/go.mod h1:g32LVimhcYPte22LK8XslKqLBem54QxuMQmkrzbAyEI= github.com/filecoin-project/go-legs v0.0.0-20211125094504-5fdf15090c48/go.mod h1:g32LVimhcYPte22LK8XslKqLBem54QxuMQmkrzbAyEI= -github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1 h1:dq7K8iCh8gnttxr35BHJcI6o/8I5z1sArlqL9LJjti0= -github.com/filecoin-project/go-legs v0.0.0-20211202193658-45deff4405e1/go.mod h1:8rq/QxX6wlL0AehqVi5CqxXT3xYz1LIpp1HCZ6qI2EY= github.com/filecoin-project/go-legs v0.0.0-20211209161055-918cd188bf1d h1:DXm6XG2YibCTcm1vmNz9FWZ2nwz8tgoycrhclZRgKzA= github.com/filecoin-project/go-legs v0.0.0-20211209161055-918cd188bf1d/go.mod h1:HFp0jUZopkX9DW6FOmhHltVfEatfAcm3ZD6Z/kY4iNg= github.com/filecoin-project/go-multistore v0.0.3/go.mod h1:kaNqCC4IhU4B1uyr7YWFHd23TL4KM32aChS0jNkyUvQ= diff --git a/node/config/def.go b/node/config/def.go index 6c518d20930..1bf58572d77 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -10,6 +10,7 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" + ipconfig "github.com/filecoin-project/index-provider/config" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -224,6 +225,15 @@ func DefaultStorageMiner() *StorageMiner { GCInterval: Duration(1 * time.Minute), }, } + + // TODO: Remove hardcoded defaults once provider library exposes them. + // See: https://github.com/filecoin-project/index-provider/issues/108 + cfg.IndexerProvider.Ingest = ipconfig.Ingest{ + LinkCacheSize: 1024, + LinkedChunkSize: 100, + PubSubTopic: "indexer/ingest", + } + cfg.Common.API.ListenAddress = "/ip4/127.0.0.1/tcp/2345/http" cfg.Common.API.RemoteListenAddress = "127.0.0.1:2345" return cfg diff --git a/node/config/def_test.go b/node/config/def_test.go index d45bc6ec8f3..85264358b54 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -52,3 +52,8 @@ func TestDefaultMinerRoundtrip(t *testing.T) { require.True(t, reflect.DeepEqual(c, c2)) } + +func TestDefaultStorageMiner_SetsIndexIngestTopic(t *testing.T) { + subject := DefaultStorageMiner() + require.Equal(t, "indexer/ingest", subject.IndexerProvider.PubSubTopic) +} From a51b08e3867508ce77ba17773d674053576bf0bd Mon Sep 17 00:00:00 2001 From: Dirk McCormick Date: Mon, 13 Dec 2021 18:15:28 +0100 Subject: [PATCH 23/99] feat: add IndexerProvider AnnounceAddress config --- documentation/en/default-lotus-miner-config.toml | 14 +++++++++++--- node/config/def.go | 1 + node/config/doc_gen.go | 8 ++++++++ node/config/types.go | 5 +++++ node/modules/lp2p/addrs.go | 4 ++-- node/modules/storageminer_idxprov.go | 10 ++++++++-- 6 files changed, 35 insertions(+), 7 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index e99b908b29b..f5135cd0023 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -248,13 +248,13 @@ [IndexerProvider] # env var: LOTUS_INDEXERPROVIDER_LINKCACHESIZE - #LinkCacheSize = 0 + #LinkCacheSize = 1024 # env var: LOTUS_INDEXERPROVIDER_LINKEDCHUNKSIZE - #LinkedChunkSize = 0 + #LinkedChunkSize = 100 # env var: LOTUS_INDEXERPROVIDER_PUBSUBTOPIC - #PubSubTopic = "" + #PubSubTopic = "indexer/ingest" # env var: LOTUS_INDEXERPROVIDER_PURGELINKCACHE #PurgeLinkCache = false @@ -266,6 +266,14 @@ # env var: LOTUS_INDEXERPROVIDER_LISTENADDRESSES #ListenAddresses = ["/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0"] + # Addresses to explicitly announce to other peers. If not specified, + # all interface addresses are announced + # Format: multiaddress + # + # type: []string + # env var: LOTUS_INDEXERPROVIDER_ANNOUNCEADDRESSES + #AnnounceAddresses = [] + # The maximum number of simultaneous data transfers between the indexers # and the indexer provider # diff --git a/node/config/def.go b/node/config/def.go index 1bf58572d77..5ab9861f04c 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -182,6 +182,7 @@ func DefaultStorageMiner() *StorageMiner { "/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0", }, + AnnounceAddresses: []string{}, MaxSimultaneousTransfers: DefaultSimultaneousTransfers, }, diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 394f8ab09db..972531eef82 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -346,6 +346,14 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f Comment: `Binding address for the libp2p host - 0 means random port. Format: multiaddress; see https://multiformats.io/multiaddr/`, + }, + { + Name: "AnnounceAddresses", + Type: "[]string", + + Comment: `Addresses to explicitly announce to other peers. If not specified, +all interface addresses are announced +Format: multiaddress`, }, { Name: "MaxSimultaneousTransfers", diff --git a/node/config/types.go b/node/config/types.go index 44c40e30654..77ef91fe256 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -156,6 +156,11 @@ type IndexerProviderConfig struct { // Format: multiaddress; see https://multiformats.io/multiaddr/ ListenAddresses []string + // Addresses to explicitly announce to other peers. If not specified, + // all interface addresses are announced + // Format: multiaddress + AnnounceAddresses []string + // The maximum number of simultaneous data transfers between the indexers // and the indexer provider MaxSimultaneousTransfers uint64 diff --git a/node/modules/lp2p/addrs.go b/node/modules/lp2p/addrs.go index 88c66772d87..d092ff0ab97 100644 --- a/node/modules/lp2p/addrs.go +++ b/node/modules/lp2p/addrs.go @@ -11,7 +11,7 @@ import ( mamask "github.com/whyrusleeping/multiaddr-filter" ) -func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) { +func MakeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFactory, error) { var annAddrs []ma.Multiaddr for _, addr := range announce { maddr, err := ma.NewMultiaddr(addr) @@ -59,7 +59,7 @@ func makeAddrsFactory(announce []string, noAnnounce []string) (p2pbhost.AddrsFac func AddrsFactory(announce []string, noAnnounce []string) func() (opts Libp2pOpts, err error) { return func() (opts Libp2pOpts, err error) { - addrsFactory, err := makeAddrsFactory(announce, noAnnounce) + addrsFactory, err := MakeAddrsFactory(announce, noAnnounce) if err != nil { return opts, err } diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 7022823a8d9..4bd15a09c2d 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -34,6 +34,7 @@ import ( "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/helpers" + "github.com/filecoin-project/lotus/node/modules/lp2p" "github.com/filecoin-project/lotus/node/repo" ) @@ -57,7 +58,7 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv) (pro return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) } - h, err := createIndexerProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses) + h, err := createIndexerProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses, cfg.AnnounceAddresses) if err != nil { return nil, xerrors.Errorf("creating indexer provider host: %w", err) } @@ -94,13 +95,18 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv) (pro } } -func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string) (host.Host, error) { +func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string, announceAddrs []string) (host.Host, error) { ctx := helpers.LifecycleCtx(mctx, lc) + addrsFactory, err := lp2p.MakeAddrsFactory(announceAddrs, nil) + if err != nil { + return nil, err + } opts := []libp2p.Option{ libp2p.Identity(pkey), libp2p.Peerstore(pstore), libp2p.ListenAddrStrings(listenAddrs...), + libp2p.AddrsFactory(addrsFactory), libp2p.Ping(true), libp2p.UserAgent("lotus-indexer-provider-" + build.UserVersion()), } From 21a8f7185925ce2bbae988bb9c362eb77eafb07e Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 14:59:09 +0400 Subject: [PATCH 24/99] compiles --- go.mod | 10 ++-- go.sum | 72 +++++++++++----------------- node/modules/storageminer_idxprov.go | 9 +--- 3 files changed, 37 insertions(+), 54 deletions(-) diff --git a/go.mod b/go.mod index b8d36e6fde2..ac520e04738 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.5.1-0.20220112075533-ee91088affb1 + github.com/filecoin-project/dagstore v0.5.1 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 @@ -36,7 +36,8 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112081049-7165da072c0c + github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 + github.com/filecoin-project/go-indexer-core v0.2.7 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 @@ -44,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.1.0 // indirect + github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 @@ -145,7 +146,7 @@ require ( github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 + github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 @@ -177,3 +178,4 @@ replace github.com/filecoin-project/test-vectors => ./extern/test-vectors //replace github.com/filecoin-project/specs-actors/v7 => /Users/zenground0/pl/repos/specs-actors // replace github.com/filecon-project/specs-storage => /Users/zenground0/pl/repos/specs-storage +replace github.com/ipfs/go-path => github.com/ipfs/go-path v0.0.7 diff --git a/go.sum b/go.sum index 6c950cd3acc..6972bac3605 100644 --- a/go.sum +++ b/go.sum @@ -79,7 +79,6 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= @@ -97,6 +96,7 @@ github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= @@ -298,10 +298,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= -github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= -github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= -github.com/filecoin-project/dagstore v0.5.1-0.20220112075533-ee91088affb1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= +github.com/filecoin-project/dagstore v0.5.1 h1:ojzW/8z4PiquPDSA3EJ+Y4JcL+SWuloLaisy/hYcKMA= +github.com/filecoin-project/dagstore v0.5.1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -325,12 +323,11 @@ github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2 github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -338,10 +335,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= -github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112081049-7165da072c0c h1:zrVwAnkOblTHFnhReZIZOrCfWDhclszB1nr/BZoFt4g= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112081049-7165da072c0c/go.mod h1:oQg5Q79yBf+dY1Z/wbIdX3uPJUKGQg9B6SB5XP8wqKA= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 h1:C3rdpJJQm8/UX3aAPNbVHzSEDjI9EvD1jb2eroA3aK8= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0/go.mod h1:H1pk9szltDLCOvQW/6fy0ugvUnDY7CDCf9HJSGSoj60= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -351,10 +346,11 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AG github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= github.com/filecoin-project/go-indexer-core v0.2.6/go.mod h1:wW5Ab0gJXL2vT4iEMbPUfPs773iMc86Q8GtfSEqmu3Y= +github.com/filecoin-project/go-indexer-core v0.2.7 h1:D0egR6Q3Jkp5r4klxkdDQvjXeLx3cwZMKE55qop2xCI= github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitviL7h1fksIU6a4j52yPnA/E1PU= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.1.0/go.mod h1:HFp0jUZopkX9DW6FOmhHltVfEatfAcm3ZD6Z/kY4iNg= +github.com/filecoin-project/go-legs v0.2.1 h1:XnQO5fesqo0sFLZhoPmYzJM38FNO7X93TM9HUsCMKbo= github.com/filecoin-project/go-legs v0.2.1/go.mod h1:iHDfdqieReblkLoHneB68wvthFtNKB+wkeEWKtiJESk= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -378,8 +374,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.1.0 h1:49K9S17uTrTHLT90xchJ7BxION8odyhKdtu5w7DyyYU= -github.com/filecoin-project/index-provider v0.1.0/go.mod h1:lFxPujkBr4sYllLKZKCbjKktsU4dDINCyLLSK2rz/6o= +github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d h1:wEhUj2MpECUcOEr/UDMPBjG6ElGOcEwePtra1/bvrMQ= +github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d/go.mod h1:pTZVxt9mF+YCYSfNsn7i0rwhoMBmbjfSDAQVoxWGP10= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -392,7 +388,6 @@ github.com/filecoin-project/specs-actors/v3 v3.1.1/go.mod h1:mpynccOLlIRy0QnR008 github.com/filecoin-project/specs-actors/v4 v4.0.0/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= github.com/filecoin-project/specs-actors/v4 v4.0.1 h1:AiWrtvJZ63MHGe6rn7tPu4nSUY8bA1KDNszqJaD5+Fg= github.com/filecoin-project/specs-actors/v4 v4.0.1/go.mod h1:TkHXf/l7Wyw4ZejyXIPS2rK8bBO0rdwhTZyQQgaglng= -github.com/filecoin-project/specs-actors/v5 v5.0.0-20210512015452-4fe3889fff57/go.mod h1:283yBMMUSDB2abcjP/hhrwTkhb9h3sfM6KGrep/ZlBI= github.com/filecoin-project/specs-actors/v5 v5.0.4 h1:OY7BdxJWlUfUFXWV/kpNBYGXNPasDIedf42T3sGx08s= github.com/filecoin-project/specs-actors/v5 v5.0.4/go.mod h1:5BAKRAMsOOlD8+qCw4UvT/lTLInCJ3JwOWZbX8Ipwq4= github.com/filecoin-project/specs-actors/v6 v6.0.0/go.mod h1:V1AYfi5GkHXipx1mnVivoICZh3wtwPxDVuds+fbfQtk= @@ -404,7 +399,7 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.1.0/go.mod h1:zCaWVI27t/OBG/Ngh1RfNBaxEc8jPOoH3O2GaHLAymI= +github.com/filecoin-project/storetheindex v0.2.0/go.mod h1:P3Hd3sIWEkBU1fPnE49Y8nh/mdErOdIfiHBb85QAWfg= github.com/filecoin-project/storetheindex v0.2.1 h1:jhsMh5O52bBU/NrnjJs2iLPI92T38kjlU9bk/dP0sts= github.com/filecoin-project/storetheindex v0.2.1/go.mod h1:Tc5mYdAnGUzly40cuo35yITDD3XhF9EX5BO7evGsJ5M= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -423,12 +418,14 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To= github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= +github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= +github.com/gammazero/radixtree v0.2.5 h1:muPQ4eEgCkUymFWPiVQRuXOQv4IhWg8YXH2r71MoqPM= github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= @@ -691,6 +688,7 @@ github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= @@ -722,7 +720,6 @@ github.com/ipfs/go-cid v0.0.5/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67Fexh github.com/ipfs/go-cid v0.0.6-0.20200501230655-7c82f3b81c00/go.mod h1:plgt+Y5MnOey4vO4UlUazGqdbEXuFYitED67FexhXog= github.com/ipfs/go-cid v0.0.6/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= github.com/ipfs/go-cid v0.0.7/go.mod h1:6Ux9z5e+HpkQdckYoX1PG/6xqKspzlEIR5SDmgqgC/I= -github.com/ipfs/go-cid v0.0.8-0.20210716091050-de6c03deae1c/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cid v0.1.0 h1:YN33LQulcRHjfom/i25yoOZR4Telp1Hr/2RU3d0PnC0= github.com/ipfs/go-cid v0.1.0/go.mod h1:rH5/Xv83Rfy8Rw6xG+id3DYAMUVmem1MowoKwdXmN2o= github.com/ipfs/go-cidutil v0.0.2 h1:CNOboQf1t7Qp0nuNh8QMmhJs0+Q//bRL1axtCnIB1Yo= @@ -773,12 +770,11 @@ github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= -github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= +github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= github.com/ipfs/go-graphsync v0.8.0/go.mod h1:CLxN859dUTcXCav1DvNvmAUWPZfmNLjlGLJYy+c3dlM= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= -github.com/ipfs/go-graphsync v0.10.4/go.mod h1:oei4tnWAKnZ6LPnapZGPYVVbyiKV1UP3f8BeLU7Z4JQ= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= @@ -790,7 +786,6 @@ github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86 github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= -github.com/ipfs/go-ipfs-blockstore v1.0.3/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= @@ -802,12 +797,12 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= +github.com/ipfs/go-ipfs-cmds v0.6.0 h1:yAxdowQZzoFKjcLI08sXVNnqVj3jnABbf9smrPQmBsw= github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= github.com/ipfs/go-ipfs-config v0.16.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= +github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= @@ -906,16 +901,11 @@ github.com/ipfs/go-namesys v0.3.1/go.mod h1:/BL4xk8LP5Lq82AmaRKyxZv/eYRlumNiU9SZ github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= -github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8= -github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0= -github.com/ipfs/go-path v0.1.2/go.mod h1:3DdbxZb0PtT0g3UlMqyzms1UBKPc0pQ2NHx5/XScYdY= -github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= github.com/ipfs/go-peertaskqueue v0.4.0/go.mod h1:KL9F49hXJMoXCad8e5anivjN+kWdr+CyGcyh4K6doLc= -github.com/ipfs/go-peertaskqueue v0.6.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= @@ -925,16 +915,15 @@ github.com/ipfs/go-unixfs v0.1.0/go.mod h1:lysk5ELhOso8+Fed9U1QTGey2ocsfaZ18h0NC github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= github.com/ipfs/go-unixfs v0.2.5/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= -github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= github.com/ipfs/interface-go-ipfs-core v0.5.1/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= +github.com/ipfs/interface-go-ipfs-core v0.5.2 h1:m1/5U+WpOK2ZE7Qzs5iIu80QM1ZA3aWYi2Ilwpi+tdg= github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= @@ -948,8 +937,6 @@ github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ1 github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.0.3-0.20210920144420-f35d88ce16ca/go.mod h1:Xr6GwkDhv8dtOtgHzOynAkIOg0t0YiPc5DxBPppWqZA= -github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= @@ -976,6 +963,7 @@ github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5d github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipld/go-storethehash v0.0.0-20211122175924-41b16c131842/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= +github.com/ipld/go-storethehash v0.0.1 h1:U9E9n3dE0IaImSNbRcUmm5Dk9UPiS9H0i+LmCFFGJBI= github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= @@ -1050,7 +1038,6 @@ github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQ github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid/v2 v2.0.4/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.6/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= -github.com/klauspost/cpuid/v2 v2.0.8/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -1195,6 +1182,7 @@ github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKB github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= +github.com/libp2p/go-libp2p-gostream v0.3.1 h1:XlwohsPn6uopGluEWs1Csv1QCEjrTXf2ZQagzZ5paAg= github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= @@ -1583,7 +1571,6 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= @@ -1611,7 +1598,6 @@ github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77 github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.4.0 h1:fbqb6ky7erjdD+/zaEBJgZWu1i8D6i/wmPywGK7sdow= github.com/multiformats/go-multicodec v0.4.0/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= @@ -1927,8 +1913,8 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -1937,8 +1923,8 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= +github.com/warpfork/go-testmark v0.9.0 h1:nc+uaCiv5lFQLYjhuC2LTYeJ7JaC+gdDmsz9r0ISy0Y= github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= @@ -1967,8 +1953,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -2072,18 +2059,17 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= -go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= go.uber.org/fx v1.13.1/go.mod h1:bREWhavnedxpJeTq9pQT53BbvwhUv7TcpsOqcH4a+3w= +go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 4bd15a09c2d..b0e0e97d062 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -25,7 +25,6 @@ import ( dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/index-provider/engine" - p2pserver "github.com/filecoin-project/index-provider/server/provider/libp2p" "github.com/ipfs/go-datastore/namespace" "github.com/libp2p/go-libp2p-core/host" @@ -81,13 +80,10 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv) (pro return xerrors.Errorf("starting indexer provider engine: %s", err) } - // Add a handler to libp2p that listens for incoming index requests - p2pserver.New(ctx, h, e) - return nil }, OnStop: func(ctx context.Context) error { - return e.Shutdown(ctx) + return e.Shutdown() }, }) @@ -96,7 +92,6 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv) (pro } func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string, announceAddrs []string) (host.Host, error) { - ctx := helpers.LifecycleCtx(mctx, lc) addrsFactory, err := lp2p.MakeAddrsFactory(announceAddrs, nil) if err != nil { return nil, err @@ -111,7 +106,7 @@ func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci libp2p.UserAgent("lotus-indexer-provider-" + build.UserVersion()), } - h, err := libp2p.New(ctx, opts...) + h, err := libp2p.New(opts...) if err != nil { return nil, err } From dec79c70a1ff72f3659bc2d8425e0b1941e9e038 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 15:03:46 +0400 Subject: [PATCH 25/99] fix compilation --- node/builder_miner.go | 1 - 1 file changed, 1 deletion(-) diff --git a/node/builder_miner.go b/node/builder_miner.go index 330b3bd6dbe..de22ef8aa60 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -169,7 +169,6 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(dtypes.ProviderTransport), modules.NewProviderTransport), Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDataTransfer), Override(new(provider.Interface), modules.IndexerProvider(cfg.IndexerProvider)), - Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDAGServiceDataTransfer), Override(new(*storedask.StoredAsk), modules.NewStorageAsk), Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, nil)), Override(new(storagemarket.StorageProvider), modules.StorageProvider), From 64bf3fccd2a12a3e90023ac8a6dfb4f791c1238d Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 15:05:27 +0400 Subject: [PATCH 26/99] update index provider dep --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index ac520e04738..04a19d32995 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d + github.com/filecoin-project/index-provider v0.2.0 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 6972bac3605..4dbbdc31cfa 100644 --- a/go.sum +++ b/go.sum @@ -374,8 +374,9 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d h1:wEhUj2MpECUcOEr/UDMPBjG6ElGOcEwePtra1/bvrMQ= github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d/go.mod h1:pTZVxt9mF+YCYSfNsn7i0rwhoMBmbjfSDAQVoxWGP10= +github.com/filecoin-project/index-provider v0.2.0 h1:r1VPVhtWrU5+6Mo6g2Ozr5NXWMFz1qHt0NKJzV5ELZ8= +github.com/filecoin-project/index-provider v0.2.0/go.mod h1:eYiwZfJNadwn/8Grwn2e4nX2cH4PYl2k8SZqm9k+eCA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= From 3a52f0569225567f1b3c67776e696a27d0635ab2 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 15:53:15 +0400 Subject: [PATCH 27/99] green ci --- itests/deals_anycid_test.go | 4 +-- itests/kit/deals.go | 29 +++++++--------------- markets/dagstore/wrapper_migration_test.go | 3 --- 3 files changed, 11 insertions(+), 25 deletions(-) diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index 87bb93562fe..2c9fc2d9b3c 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -88,7 +88,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { require.NoError(t, err) cids := prepared.Cids() for i, c := range cids { - blk, err := bs.Get(c) + blk, err := bs.Get(ctx, c) require.NoError(t, err) nd, err := ipld.Decode(blk) @@ -129,7 +129,7 @@ func TestDealRetrieveByAnyCid(t *testing.T) { require.Empty(t, offer.Err) // retrieve in a CAR file and ensure roots match - outputCar := dh.PerformRetrievalForOffer(ctx, true, offer) + outputCar := dh.PerformRetrieval(ctx, dealCid, targetCid, true) _, err = os.Stat(outputCar) require.NoError(t, err) f, err := os.Open(outputCar) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index fdda6f03648..b2a571e407d 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -306,23 +306,19 @@ func (dh *DealHarness) StartSealingWaiting(ctx context.Context) { } } -func (dh *DealHarness) PerformRetrieval(ctx context.Context, dealCid *cid.Cid, root cid.Cid, carExport bool) (path string) { +func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool) (path string) { // perform retrieval. - info, err := dh.client.ClientGetDealInfo(ctx, *dealCid) + info, err := dh.client.ClientGetDealInfo(ctx, *deal) require.NoError(dh.t, err) offers, err := dh.client.ClientFindData(ctx, root, &info.PieceCID) require.NoError(dh.t, err) require.NotEmpty(dh.t, offers, "no offers") - return dh.PerformRetrievalForOffer(ctx, carExport, offers[0]) -} - -func (dh *DealHarness) PerformRetrievalForOffer(ctx context.Context, carExport bool, offer api.QueryOffer) string { - outputF, err := ioutil.TempFile(dh.t.TempDir(), "ret-car") + carFile, err := ioutil.TempFile(dh.t.TempDir(), "ret-car") require.NoError(dh.t, err) - defer outputF.Close() //nolint:errcheck + defer carFile.Close() //nolint:errcheck caddr, err := dh.client.WalletDefaultAddress(ctx) require.NoError(dh.t, err) @@ -366,21 +362,14 @@ consumeEvents: Path: carFile.Name(), IsCAR: carExport, })) - ref := &api.FileRef{ - Path: outputF.Name(), - IsCAR: carExport, - } - order := offer.Order(caddr) - updates, err := dh.client.ClientRetrieveWithEvents(ctx, order, ref) - require.NoError(dh.t, err) - - for update := range updates { - require.Emptyf(dh.t, update.Err, "retrieval failed: %s", update.Err) + ret := carFile.Name() + if carExport { + actualFile := dh.ExtractFileFromCAR(ctx, carFile) + ret = actualFile.Name() + _ = actualFile.Close() //nolint:errcheck } - ret := outputF.Name() - return ret } diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index 756fa58577e..4c143a3e6b3 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -10,7 +10,6 @@ import ( "github.com/filecoin-project/dagstore" "github.com/stretchr/testify/require" - "github.com/filecoin-project/dagstore" "github.com/filecoin-project/dagstore/mount" "github.com/filecoin-project/go-state-types/abi" @@ -100,11 +99,9 @@ func TestShardRegistration(t *testing.T) { cfg.RootDir = t.TempDir() mapi := NewMinerAPI(ps, &wrappedSA{sa}, 10) - dagst, w, err := NewDAGStore(cfg, mapi) h, err := mocknet.New(ctx).GenPeer() require.NoError(t, err) - mapi := NewMinerAPI(ps, sa, 10) dagst, w, err := NewDAGStore(cfg, mapi, h) require.NoError(t, err) require.NotNil(t, dagst) From 05afaf6094f0b6fecbc7ff62bf014b67b4fee2a7 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 16:03:39 +0400 Subject: [PATCH 28/99] make gen --- build/openrpc/full.json.gz | Bin 26593 -> 26593 bytes build/openrpc/miner.json.gz | Bin 12680 -> 12927 bytes build/openrpc/worker.json.gz | Bin 3803 -> 3804 bytes documentation/en/api-v0-methods-miner.md | 11 +++- documentation/en/cli-lotus.md | 61 +++++++++++------------ 5 files changed, 40 insertions(+), 32 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 1e4efea1a4fcc8ed6a49cd9c92876b457456c26f..a15f7d23f72ccec2e7d5e7b0c906d8c61028e1a8 100644 GIT binary patch delta 24175 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 literal 12680 zcmV;3F?Y@%iwFP!00000|LlEhbKADk@L$33{qQ6m*`Y4h#WVeo*h%VBr}bky?Q&+QvBTN4Aka=}km)OO$; zeZmAeSJYV>^fibAc(u}jVH1iT>EVg^?`!Z1ikF98qYglhV>_?Gw;OUp@eH_!XM`e$ zKr4m~`1xl*uqB$^PzTYqL%>f2JtQH%?tu4>^P5et)~l86P-L=Cp4h*5Mb?q7pw1f;EdW6fBg;+n@Oz-yk1MRlMKIdpa>%y^D$f20Em_f@$9gS{Q zh&8vT|3wDXZl4%_|E#ftOzoIDYs8RQImm#NJ>g$HNuG5y^eCq6)HYm(OneLu zz(Gr!B4A;1r**WoV`<0Qg3^_H{N~M^H#s!y<(rvDZwD*KW_Z1^81259TK4qK61o&Q zZ{P~QSvmIO=09^p4(Im&JMRxiJ?-hKlTWoLHksjhZQ2!J1A#V-!vgK1p4WPNzZXVM|xf%{%`yhRTrHh42j(A zfK?YHH8pqzr}!}Zu27hUP4n!57|imbG&T-~cWqf3O!}(3|Jq+_!o;RDJ%;4#j3M}@ zDp@b5$Vq|ujXwt11rP*HBE#+v`bU#df7~CAZ^OZPEx&K(oDAg5d9pyp-GyV{Gf7*C zHDeGm8FPvcFVP$`{E&HJU(pN4wr3r%>VYq}t^n&T@g-u<`+$k}*WlF>uD*opFP8Au zr4A;!woweN9A?e|Uy8Gn)4+z!hR24oUH+C&?bev2I%|ZZ=%sp<5P_1U`tnUXJ7v!} zO=`zoUDrF_7_{RFHw|oicFhqUKi%GTeC7S6KzqkcEzwDd4?KJ%)9qOS-tVUn+v2uQ z5~CtAz7hZ;GCQ)K!ZInnoc+{tGTv2MKL$O5fN#=O*CaXooWe4{t;+VI+v{t`ngPlG zPyh{%FK`evfn^(a8bfdeDU%QvG2%GGV)A}v8;cHD4cH@s z=!5Ot9sVI)Ua!Hc5Pn3NLR_-iGwpcX z(V}dr9Z&oRzoLzHOxBjw;q8%mB82lBhBusTdeg7aK(PPdnv3D45Bozp?Ynnqx%#jD z_|Iy+v6rj=PM0&Zne_)V++S~o>opqm?wN^HSwTclSCRQK%>Cw^fC&X>CL$EiaP(7O zO2lTN+NTxtO{3}}t^L!?sJ2ac_we)2T5QFt7&j?vW*ZtYE?Bl^optrD-fh4_8^{Kb z5QEzr#8K4|$SeYhP|Xou3I=psW`!RxnZ^Hlx1sE<_HSb8e_g#>8023I^uIszuuUcrn7nk+a1ilL(5vJ zdH43@*UuOKdH43}{eLdrUjG6RxyO!8mQ26hLkII6y^AQIHgN4F0xL)t9RP{R`??{l zGxjWktwXE-)xqBlybDzSwOKk^zJgLOm;pg(ByDztXi>n26%uBuwc^iWeVD7d+ z0=3k}AcnV`_am4%YvO`Abf$2QfMHt}GT0meTky!~+mC=ZJuJl}a@{N$nM6CwTPf*h zZYXP0IEO<72QGsDAY)0tjxfCI_f2=^F7U87g43@9JQxm-%-Q;@)Bk7Y4yH?J4$a3t z#&h!@t)pG74TD*xK9#>`i>e)KH)~z*8+?iRpQwhK_h6=c10Bt`_fsalk5&3u><7@{ z{c%2#T~FPO zOVP3e=7=B%QU(VSfQgA7g`Qur9f(W)4)~iJLTxaE2DUJTjN~9i4sZ~4FuI49%fEbM zJIriYiPLTNr%%Pewbzb;Tt2ev1$F^rOffR-0!)NcgMDJyOule?MD)(50W9%cwD%1m z|2J?v|2*69@W}u(+X3hvIU6>)|Ev*MVPqh1a(3Dg29X87Zf?SP58$rdjsW2T=paCB z3ZjdHm)zK=$l5SW;k}K`8*=tLfCk0)m~J@ohz5q&%CYY;nID2P;!*@n4>|`P0enNa z1vSHtO9A8}2bl~X>;li=o7rsoqBG(XhCK_$J>A?8@j1f)Q@)x}q#a}-=)LsdV;8Jl zG+SG2L=Vteg7r!mj0Q9o2*j72kq`Q3%@!xI_N<{tQ79xE{3o3)q)?>V3e#-;qxxGK|`?WwkU&L$r6o?AzwR1@DlKtG@jYcQZNsk+G`4+ zW%+XPj@S=`F*}zLp|uKrC)NhQdx$N*g|rFZ+lD()#?MRW+#%|QTBva&*K>&Hnz&`0 z=FJ(nOjv2hS}4Na`g5i2jkzmuR60C+VYcq5n=f20kzwB>r@o;Z1ytM0jRI@R#7!Vr zY~RL^fRv);in>ffIN}9>T&c&5+iFUmQ#6BQHH=)W0XS2vtjzxzVM!u-yLX1yy zYaM*w3_Q*VFF!@la!=Ui$wbcYvzdhny7Wy~{<0c77lM^r4^!K=a?OQ8xN<%h3sHvM zRR*w?ICL+36hI&h|yCK+KMleNeg+7ye zw0Duz7fbO&(WY>==y0tnCv_q3B1wZ#CN88**_7tTZq? z4(kM)z+trIB0~8QF|uX{qRkYOxtMc8{q$C30vtd)1ZNar7tCyDiA*rv00_MJ+zx=? z#5R!uUOghEu*x)gJ5G>ag#RhwOu!6=NGJ{?id%Wi7r4W2#trpN-9L6Jbn~Aos z>P^gzC2xJ3&mo15COJ~*9J}eDE@k<{zRo)5{KQY|ShGU4$iU>DYlg7O9cV^y+=|YN zVkS8^jJ;HgSa7OP0lMp+2qqNt=S zc#ADL^NrGIxqPPxEh=VBcr;jcs4|)=3nNNbN-1Pg5-;0poI7)ZNaL6ahA2UXX%xrfMlUaV zDMAQM$Ac7tZiq$7goRXRlguHstnzYLrJol!6(NRZBTotdH^e6D0Vvg(Bm@1HMP3ez z4Duqgt`Kd|TP=f@U18F9E*EozqSLxO8_2NTI_3w!gw=(0rKRL<>iW9*SCy*G( zI)xNoJCL|D3Du~Gj4WVT62pWPQm@US-}vm5hs~`Jat`_5{USA+)oopwk~5s*V&<7h z8T=9B310ohAAeBw4b1U9BH{D1Q_dVVT_A_gN@Gc{8PmVL+XS{!DBU9zwfMGf@3jA` zZU6c4>*Lp7|N8em`sM%V>f`XO>wNy#JLAvCU*3JV>iy!rw?AG#I-kz(fBio?s~iWn zrv<@(IN3MM2*vXP#Ujjkis78tF2zQ*y+kg=EGg&_@N4kuC&^cN=l{9g$)z8`R+*#! zq5)-_R{6O3Rfk+)qUm}*=jDx3B}|O9<1iB;CMaFN3lz*9xLUXyVl*ZW_g9d}xL8Ij zsUc-FQYqwri427AF`4@y{Kx;SkxS1`wc|m@|K-<7NrWYyxhG-)PZp36WO=QFkVo-U zgt3XrX_OaKsWi6?8F$6Yu~rAcaOpnLHd^$|jZB4@ zs5AEpiE)YFf7okd!H1cc@K4Bf;asv3zcb_E0@axse+oFE4tjhN=3b?D@2@Z4wBH1A zCb~bB#G?lu?8?ZHmt=1P29gXv!b9>3Wga(_xjiKKs1h|q8K-Ojc#I__ z;}N`64KdDs5|}X#EQhd+zLHmV3fZ&kezPLw*RC4RMO90g_FN9Dd=O|0C8mvuzR2>Y zCN(+xnaW~eX^WzFLr2H&m^v`cL+iNp% zhUWx|nfs=RYhQaEjaT@PT{u>9hw2TrObKTXRTa?@pADriVsonaMYRN8zL2GJcE!pl z>56cbl{7`1!s=_v7~zyyU_n}yE|KeKrSB!q&B6VCwZuTzGZKyhu^A)_)K(W!NEvz~ zxEaHfjH=2a3c6XXkwAJo>O(T@w9b$>Qc)CsD*n3-^_9YB;_{1OLp5;$H%mk)pMiU5 z2^VVO;TbU;1YN{semM!A0>a1=K3yd1?A zObU9zMMtSFN)-~x9?_O6iAWHZUNj_Yr4-2Bo__y8r{9$em9+;3?SVmiV6d|TgO^&Q zY@iP^k|QIEwQ?S00!F<8qX}T!C^MSIw=Fi>78`Agjkd)`+hU__vC;k3<3|}8+@Vf8 zBjQeVTBEW-CbTTw9zPuBu+$ZOqK{mapV3i8{huD)mMnn`v?XRicFWdA*n*89o|lXS z=mgVzg3ab;_pNDuSQFFbK*`#&I@*P}N5JmCc8Of%+%sv-7yJ^KRH`yLG#uW>gAwn@In zD&dYi-i9o_Q5INu4@uZ`jk*U2V=E>X3`6`7|jG}BX1B(i1y zgGG{bR^FcmEmapzg3D#on_%s-*hDEyvO;-o&baK7HSoiuUTo^meZLaS*7x-(z;hp6BlT z0RDktZnY-1=WU?EbQZ8I??5sP(3i68BTjN^egc&`)1I54u*ZrHgWcTXt$@G8bD;8# znhybPEE}55#vrh53=?4%7h(+XC49)*T?dAOw~w!Y#IL8@$U(2(@iOyk#f8`uT36iI zWh>)t0XS5Dcc1AB@RGISba9U6(AZo!Hnk1g+g(@RS$=2Ps>uma+L*`K$9x%976G~(!AlUh8JebuIlU7`crf zX~E=Fu{|FJnPbT(;8w8O6S!~1UQb||n(6d=l@zGZE^809-leln+StrUDsSkW#cmMRvT|}NilDgCUImSiKzQp0Wm`+{rPtDHMb7!4 zJIE@Jg$X9}cWm`5$(i8uj4GbOhPlS8D@1couLD5M)a;DnwVgtp(UGO4O5&}GI61+l z>qlntQ2F53F9^>UR68y{0ewkl9NnXg+A7?_aX%t@a&{_>3s9llB#=TE%d4MO{1a+B z=+OHpkD`+uG(y)BtXr4MkLGfb5Mo*YN!uuip~hoixG+1n4W9kz-^^$E@rukIie>M1 z8jr;(eG6LkK!W60t3{ub%#^Ag{191(CL%#!*eQE=m{AoZ5W`^vaV;GbfGMYig3pxn zP|&(rO%%nw)kQzDF3M(xtX4|9>^)4(* z8cbFqX;4YONR32+y3ah+IN#MJsM9@%?B-1?$RZKjovk`$DOPPCtDlDaLURJh9 zcbt(e5>mAIt0o(ZzZzj;@z)kvIKZ`K;Ff{+oq>CLMmY6_h0Hk;_D?nDjR24{E}Y^+ z-@wY{-3X){zKwz_$GUM$G*@bOFl><&BH5|hZUG>251M;JJw%AVmvv9R-U)=yp`vzJl`jIKFCPW5F+d&BFKT% z6Jfui%?HO`R=)AP0Ot0kd}i0p2>iT}wX(mJ{jKb8W&b|O{-cac86nL++4snk;x(jw z1j_d1d!(~wBzheCR))7Syp`dt4BsaiKFr7*6Y}fAvG36(T3OhD;tJNZz)_dw5@@Al zx_2?qmoZL6_%#&{ z*PaEp`bivt*?wA<9St?GI#=(8E^6&*sWvs#_C zH#%!KHK|)&(&`cwT{6kY&h&+-g`kT>VLFsfC@iBnt+RKCKx#_V$A{PMAzER-H^M%PgA{4y zH}r5N47$eZM*W5!0xR)(vKnK9Dwo!nKz=7>m)iYVtIHL1c`vt$03-Mld%484PLxIj zN+mt+eOpU|M{sCHf5!*aYVTHi@16Dz`KCRsYBktP)nNVHT>Vf?*NMxBK&hm`YKCA$ zx^G%}wILU+^4d$~)kaygdh12&twCyE$tW+FmNOkb4xV zr0KIeHuukX7FhKlussEA_4YpM?O|@+4e#FInlb+oDBF+DjC9tFUXEkmMrF1Nc`p=l zE5lnE?#b{`R^5#?p?Ha|)>C)ma@MIN!;?_t7pjPFf<}3Fs-z(1T&$7+Tk38V8Rl}i zoyJH&a{*l-;D(Rs0#X1S1Q3B!i}j8PpbP8*Ok4_yfeve5%#s*#YSGf~Rcb4UyV*5i zKKp+$nHkpA`UIUjMBQZ7h3E7>?J38NGb#gkbNhB`JL%i$RhTUbK-E^tF^Qt!>RLky z)V6-?Gq9QpnFR z_-lS;HJRD3!7I^=xNAC}M^o73nBq~WrR;F|po@<;-kK)hSC|8814w|qLIk)R*daKZ z0b+ZkLq{N4;mBHxy?`12%&bjh>1w2EaO;q0#78{A54^~TN$yyEP& zWlVjCcZ@+44atl3)WYuK1e@A1Ga)*Od+Se;z|?l3r5$hM#{7^3yxZOWKn|W^WU{XP znK-d9B2+upW_q{RA7~xz!m;nM$?UZ7**TmdE9vLyXjc?E^!>^<_$B*Yz1z{=6Ept6 z6Jr++HqZrfyqB6D>FLC_EJ%^Vu;MQSQi;b;V$QBSb<0mv3j2TRXul$~3Xe}XL6kGg z%UtH4T-7puFmELaK1$fdvdJn7A)GUnA$qis^1*d#T;CTVRTUIM5-mGa8OfD}5v4j6 zY~>tKw%0iG2D9&5dy*|vnqNv#V>y~AHzhJu<6N2^UMD6{cXJ3TvyG!xOiE8AUY7AU zOgftP9T(OmMU?-k(pm+({2%P%<3TT@{D2pfz$0fqSZlZ16^$ty3g+1eD3u-U2Z{t zfY?H2@aCJ=?e(=|&46r((BRw#90X0kb`<;|%$@s2r8u}toxsIh@MXll04GuIDJ)lz zGD^9KeSi2<-sxOK-t!@pzU4RUy;(15+!HF3doSw*V$jdX-j1^J1tO+6>8U3SJvdq7 zknLJU^RrV`5$J);6@pQ?l?7jjd$H*Ak@C;}Ah57Yfjt8&?~Nw{eW^!nFhyL50e%dK z06~v56o$UIYe2+BCqp9E60em+S;qNDWzn>NIibx?uLvqzK1@L71y5fx|t$a@PIe%z*kzUz?M z{OF)IQ^!W0TF>O$?f3wPdhox>uE0HItD}r8yMO@r!XpdT@#IIrG{ryx!0mEP6z>97 z2{8)zgR_N*h5-aUSepaS8}4z*4S9f=x}0;Cwu69)pyh%onz0{Dhf?TJ*FS`7nQ6b7 zX_%4TBS_>EbnZUb&ga$Kfo8QxVHu#jlQGd=tVmEIJU0?14ZnUwj1=dcga{|+U~5D@ z*~$^o^PP?VXt5)MQAUKnPrcMwcpD$?#CNal-&ctEJM}ueoC{g1EeqK<7i3fXT!eRR z#%}5Id@vYiL@kSX4l*I@`g7xeie0)vdv&jFybDFgZmOROR$OXqd3Ia^OPPl^Xd-v= zP8p`2hc{^Y3{KwE)aCklWvwf_dY{8_+j?4`RZdMZW4&WsRo~f~1l5ecH3@Z_E?3D2 zlq6EI<295_1-@4vt_=>?1uhsG6|xf-?$C8*yzgL97Up0P?k^wP`ve0t3bZ(Nzmfww2x8=_B!BIaqcI&E{ znZPE2iHZq$zg*D`upRIx#PpPNAx|@OZwR#kb?|(SoFEqwLC4y( zhU<^ThDW&pK*8Rq1`h@>8e_l!Vl&(qMX-qV!mfk8W^8NfZ#uy%wk;%crtYW>V7QaC ziRUMpVaKJfJM3$6L*Sa)OGq)}<4v&X#Wc3rZJG1OV$NZ17*Rlrb&sjyfaI>DpW2ivpIF9@fNxonR93z1~g3vxh^sR4xn+@8|HTY5}9DS0TBFw9GAzML2zQ5$N;Z|^9>Ud z8(dgIuv}Xd8|>}D3L1CF40>U#`uEugzNj7t{cz-6?|XJ#D1t^ z5hHVOirnkj>g74u$63y{90O=sY@<34TuN@EO!k}HmX$V9U^YKOqpe(5zzdVys4Gqv zXXJ`IDC+Wr4<~ES`Q`nMw_c$ynF*NHvPHQ*L!eD^d)`N28(M(fo2k{PzFo&gBv_&z8;2c{cvcKQQ3g7-9)CnSc9LOvy`y@ir! z!mA-s)`4#*b+i+ExjgkFzuAvV|A)A(^jP~hvGl*L-YpFBuLb(wpMTaw^(F@WXwdK7 zdNs1V+H(9xjpJ`xw7Of<1?0T?QG61P+j@5UT+fb?_cb=|gx>svkLFn11lZ9MpI;$S zU@N~>5HKCdSV%p%MAYG0d(i7>*S4R(>8->$bm@C1mEzFR&h0s;;$JZ_({Hcw61fyE zR~}dg8YtZ==jsV@5gO;JaYuV=P<$`KNrEYTTwy2vh%LmQ2+tSPTd^o<#a^5dOfj@B zEM)TT*|XmXLpp>H9c$xHWw|#-W-cC$QPJ;P>$?-ZDh4PT`&%y`wzYxU`{JI@;d~ys#lh z_82ljAT!#_Nz<3+*z4uyG`UxvXQPg1Pk_jF-AB%sZZT1~Pr?UT;JQ!1t>n)OaL;z+ zdA|TAGaJ~m#tyS3Ly$W4(`}S4AMiX+$K9S@;G=JVbzd6S403ag+`6~grorT0)fV2G z%}>3&`&&e93jeZ?cN>b%h>0HgbuL*qzYIJ_JG3q#G3_NmuG;~tBjCp)7DjEm4c?9` zorUP7E(~La-qvr4i_Neig9+Os^NKib%UpAw7+1OkZg0Z6;#(wtP+P1WUvx7}2IX(@ znwx>%A2)H+P5NG$@AAT)LBLG`WZPnw#agdygkBh+*D`E%h8<>QRSFh-Yntb_0n>A$ z#IkW1+2%i6v^>^~!>P@jDYSNQOS2;)BoxRxcGBC@b`9DdWhEtg1VAY?DrO@_A>?gq zk?Z#+V!Kv7Fmu-wTZbQboRtFA^FErQc^~0?h2&%Ig$J4Fv9U0&^rV#7ifW_btUDQx zrw3@(*AE8f2pvrO$T*n5VQ(}WOyLn6YaQ+L<++rVd~fNX*U>(~NB>TL{`&-yt7w1? zBjh2?D7X?sVD@j6j>7>snR-zx5@{6EGiAd8Bn4hSFL4xn|=-LInGM;6`cMKxs-`4 zqmBX%faK{=;R+MVh+%QPS&19I!wrw;`t3*BUqHIJ=3D+(Uv6cpIOl*Sfn0vA>J;d5 zXEf=FD8BN$L0v4H-0ivMwz6@Ilfl-I?+^M%lTm-%AC9-;B~6pA;(o!aJ=Nq^K}OcH z^5NBtx$o4PtD2DB8g^SV>|R*%;Up^sU#!6?GA!sIA?xa>-58*P?d#cTLf7&K{XES) zD7%QB)5|Mt6V`wO=T+Lnq8)&)b3a; zZ;;xR@E++|H6uL1_st%I(c64lYM>~z!9%IH=`?^H&&0`hz?>SmSJ z5aQqiCT4vB8A2(J5%6SWjwRbq`HJ<+$sIwi9}zvbjk}6Pcj7SQxj9M6%9|=EXdh~hdX|E&qM0Kj*h+CNDWZis$Zw^h zu0`9hLQH1XK)2UtEaG6wNL=seoo+|(=(ip150G}hd^{5Xk2=~Clki7UYJ~H)HwI25C&F8>=bD}$u2k8mpOw*=V-b{)ne6*Q2a+c} zOP`ywW(8ui{(-qSf*nL|?vJ}DOSTuB)3zaZ?aAzZhTQF`@IA^(j1?1Jy%Ku(eO?V% zPvG1JJG@h5SPF8tpd@+@@G1g0w>Eks)nKKlW|V}@YO5mVlq6iHQ;JuRO?YjNdt0d) zyEAj|W!qN6tQ<9uuDHtShmKqTighV3^1?B;`}lSr-|pi>CFq4bK1UqnzKYy#Mn2D;DI-F!R5tCgY|>jN?N<; zg6t8Xf`${6WBW#j)zAFgYI~8FrLle!DNPJ`fRKZ5kisL(M9o~y6(leXrrM% z?oOe8FzimvgTWCzI+z;z_yErIqgmJJ4bhPqkCe=Tcn#e@gqUi_x_5JncC7XEo_^5n9&~%x`sBFRJJv^kX&vns+oj&LFKm};TRGPcJCQik zN*Br&A8ad7vpbANYO-J7QzWY_*dd?>^($HSb8rDMf752RvxJPSO-RuJ#Y-f+`9?5F zg-gp`+U~lak)&XvS;I*?si5KfQSCs*Nl`9PaarFq zr{cb8{#|-WCDGB&=EQc;C35YxV?^Xa9DI0yS-6gqH=5C5%#7_ zq-np`>-Ks_gHcbTpN|l?ym2&ExNnDlR|QreJADQF8fYP$ldjwHZ^zGciOhx zRo@Xw7oG<;ygC2wJ)L9ysIL$E!|`sMNqn6p(r>7Ddy}I4NRoMu&4Kq zCi-~L8z&~EKN|GMlcWA%)U-D#K&JI`J~w41W#uzcW=eEEA7x5qX`Q{f1gQ*jc4xv= zx&KCY=XDUt_jQKbo2+e5v%8F3cW2fnEcSeB*fb|r%MxkRaTtuQjt3$OZwy-vKJ@R9%g zxLS)~D!rqf@V~kDAV2Q6Oa*HXrb;|$fVi}rppWRc^oM?IT4Q0z$%r-?Lb2CnW`xJ5 zsm#Ymucdk!!&sD^Qs$~3W>=!IYFcU}vQIHLHk{8K;%kO36D*{-95IfS5MqSe74wE; z3}5~mE)kSID>GJ=Sn_I5;_{~i4RP_c%W4w)8ooW4XirbKPyasv0RR7P&48MPSpooK CH?hC~ diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index edfabcc6b998b81113797881dd01f4390b022998..7049571e9b281b3093f19f69217fe8509271ded9 100644 GIT binary patch delta 2335 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 F002ugnO*<@ delta 2356 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 Date: Wed, 12 Jan 2022 16:55:45 +0400 Subject: [PATCH 29/99] get tests working --- itests/deals_anycid_test.go | 5 +++-- itests/kit/deals.go | 27 ++++++++++++++------------- 2 files changed, 17 insertions(+), 15 deletions(-) diff --git a/itests/deals_anycid_test.go b/itests/deals_anycid_test.go index 2c9fc2d9b3c..8e061af2932 100644 --- a/itests/deals_anycid_test.go +++ b/itests/deals_anycid_test.go @@ -129,12 +129,13 @@ func TestDealRetrieveByAnyCid(t *testing.T) { require.Empty(t, offer.Err) // retrieve in a CAR file and ensure roots match - outputCar := dh.PerformRetrieval(ctx, dealCid, targetCid, true) + outputCar := dh.PerformRetrieval(ctx, dealCid, targetCid, true, offer) _, err = os.Stat(outputCar) require.NoError(t, err) f, err := os.Open(outputCar) require.NoError(t, err) - ch, _ := car.ReadHeader(bufio.NewReader(f)) + ch, err := car.ReadHeader(bufio.NewReader(f)) + require.NoError(t, err) require.EqualValues(t, ch.Roots[0], targetCid) require.NoError(t, f.Close()) diff --git a/itests/kit/deals.go b/itests/kit/deals.go index b2a571e407d..ca3848c588b 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -306,14 +306,20 @@ func (dh *DealHarness) StartSealingWaiting(ctx context.Context) { } } -func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool) (path string) { - // perform retrieval. - info, err := dh.client.ClientGetDealInfo(ctx, *deal) - require.NoError(dh.t, err) +func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root cid.Cid, carExport bool, offers ...api.QueryOffer) (path string) { + var offer api.QueryOffer + if len(offers) == 0 { + // perform retrieval. + info, err := dh.client.ClientGetDealInfo(ctx, *deal) + require.NoError(dh.t, err) - offers, err := dh.client.ClientFindData(ctx, root, &info.PieceCID) - require.NoError(dh.t, err) - require.NotEmpty(dh.t, offers, "no offers") + offers, err := dh.client.ClientFindData(ctx, root, &info.PieceCID) + require.NoError(dh.t, err) + require.NotEmpty(dh.t, offers, "no offers") + offer = offers[0] + } else { + offer = offers[0] + } carFile, err := ioutil.TempFile(dh.t.TempDir(), "ret-car") require.NoError(dh.t, err) @@ -327,7 +333,7 @@ func (dh *DealHarness) PerformRetrieval(ctx context.Context, deal *cid.Cid, root updates, err := dh.client.ClientGetRetrievalUpdates(updatesCtx) require.NoError(dh.t, err) - retrievalRes, err := dh.client.ClientRetrieve(ctx, offers[0].Order(caddr)) + retrievalRes, err := dh.client.ClientRetrieve(ctx, offer.Order(caddr)) require.NoError(dh.t, err) consumeEvents: for { @@ -364,11 +370,6 @@ consumeEvents: })) ret := carFile.Name() - if carExport { - actualFile := dh.ExtractFileFromCAR(ctx, carFile) - ret = actualFile.Name() - _ = actualFile.Close() //nolint:errcheck - } return ret } From 07c842d6e01e44ec60d74dd98379c508857b5994 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 17:43:56 +0400 Subject: [PATCH 30/99] lotus soup green --- testplans/lotus-soup/go.mod | 8 +- testplans/lotus-soup/go.sum | 218 ++++++++++++++++++++++++++++++++---- 2 files changed, 199 insertions(+), 27 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 308ee5140c7..6ba232cdc43 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -9,7 +9,7 @@ require ( github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.12.1 - github.com/filecoin-project/go-fil-markets v1.14.1 + github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -25,13 +25,13 @@ require ( github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-log/v2 v2.4.0 github.com/ipfs/go-merkledag v0.5.1 - github.com/ipfs/go-unixfs v0.2.6 + github.com/ipfs/go-unixfs v0.3.1 github.com/ipld/go-car v0.3.3 github.com/kpacha/opencensus-influxdb v0.0.0-20181102202715-663e2683a27c github.com/libp2p/go-libp2p v0.17.0 github.com/libp2p/go-libp2p-core v0.13.0 github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 - github.com/multiformats/go-multiaddr v0.4.1 + github.com/multiformats/go-multiaddr v0.5.0 github.com/testground/sdk-go v0.2.6 go.opencensus.io v0.23.0 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c @@ -43,3 +43,5 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ../../extern/filecoin-ffi replace github.com/filecoin-project/lotus => ../../ + +replace github.com/ipfs/go-path => github.com/ipfs/go-path v0.0.7 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index 47e65fd549c..c53300eca59 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -1,3 +1,4 @@ +bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -37,6 +38,7 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= +contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -116,7 +118,6 @@ github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWX github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= -github.com/Stebalien/go-bitfield v0.0.1 h1:X3kbSSPUaJK60wV2hjOPZwmpljr6VGCqdq4cBLhbQBo= github.com/Stebalien/go-bitfield v0.0.1/go.mod h1:GNjFpasyUVkHMsfEOk8EFLJ9syQ6SI+XWrX9Wf2XH0s= github.com/VividCortex/gohistogram v1.0.0/go.mod h1:Pf5mBqqDxYaXu3hDrrU+w6nw50o/4+TcAqDqk/vUH7g= github.com/acarl005/stripansi v0.0.0-20180116102854-5a71ef0e047d h1:licZJFw2RwpHMqeKTCYkitsPqHNxTmd4SNR5r94FGM8= @@ -127,12 +128,16 @@ github.com/agnivade/levenshtein v1.0.1/go.mod h1:CURSv5d9Uaml+FovSIICkLbAUZ9S4Rq github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= +github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v0.0.0-20180407024304-ca021399b1a6/go.mod h1:V8iCPQYkqmusNa815XgQio277wI47sdRh1dUOLdyC6Q= @@ -194,6 +199,7 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bonitoo-io/go-sql-bigquery v0.3.4-1.4.0/go.mod h1:J4Y6YJm0qTWB9aFziB7cPeSyc6dOZFyJdteSeybVpXQ= @@ -230,6 +236,7 @@ github.com/cenkalti/backoff v0.0.0-20181003080854-62661b46c409/go.mod h1:90ReRw6 github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.0/go.mod h1:dgIUBU3pDso/gPgZ1osOZ0iQf77oPR28Tjxl5dIMyVM= @@ -238,6 +245,7 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= @@ -274,6 +282,7 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -358,6 +367,7 @@ github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0 github.com/elastic/gosigar v0.14.1 h1:T0aQ7n/n2ZA9W7DmAnj60v+qzqKERdBgJBO1CG2W6rc= github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= @@ -379,9 +389,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= -github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= -github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= +github.com/filecoin-project/dagstore v0.5.1 h1:ojzW/8z4PiquPDSA3EJ+Y4JcL+SWuloLaisy/hYcKMA= +github.com/filecoin-project/dagstore v0.5.1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -403,19 +412,22 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= -github.com/filecoin-project/go-data-transfer v1.12.0/go.mod h1:tDrD2jLU2TpVhd+5B8iqBp0fQRV4lP80WZccKXugjYc= +github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= +github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= github.com/filecoin-project/go-data-transfer v1.12.1 h1:gAznAZKySVs2FS6T/vDq7R3f0DewLnxeROe0oOE6bZU= github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= -github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff h1:2bG2ggVZ/rInd/YqUfRj4A5siGuYOPxxuD4I8nYLJF0= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= +github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= +github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= +github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.0.0-20201016201715-d41df56b4f6a/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88OqLYEo6roi+GiIeOh8= github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.1 h1:Bx+TSbkAN8K97Hpjgu+MpeRFbXIKH/fNpNp1ZGAEH3I= -github.com/filecoin-project/go-fil-markets v1.14.1/go.mod h1:vXOHH3q2+zLk929W+lIq3etuDFTyJJ8nG2DwGHG2R1E= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 h1:C3rdpJJQm8/UX3aAPNbVHzSEDjI9EvD1jb2eroA3aK8= +github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0/go.mod h1:H1pk9szltDLCOvQW/6fy0ugvUnDY7CDCf9HJSGSoj60= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -423,8 +435,14 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= +github.com/filecoin-project/go-indexer-core v0.2.6/go.mod h1:wW5Ab0gJXL2vT4iEMbPUfPs773iMc86Q8GtfSEqmu3Y= +github.com/filecoin-project/go-indexer-core v0.2.7 h1:D0egR6Q3Jkp5r4klxkdDQvjXeLx3cwZMKE55qop2xCI= +github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitviL7h1fksIU6a4j52yPnA/E1PU= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-legs v0.2.1 h1:XnQO5fesqo0sFLZhoPmYzJM38FNO7X93TM9HUsCMKbo= +github.com/filecoin-project/go-legs v0.2.1/go.mod h1:iHDfdqieReblkLoHneB68wvthFtNKB+wkeEWKtiJESk= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -447,6 +465,9 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= +github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d/go.mod h1:pTZVxt9mF+YCYSfNsn7i0rwhoMBmbjfSDAQVoxWGP10= +github.com/filecoin-project/index-provider v0.2.0 h1:r1VPVhtWrU5+6Mo6g2Ozr5NXWMFz1qHt0NKJzV5ELZ8= +github.com/filecoin-project/index-provider v0.2.0/go.mod h1:eYiwZfJNadwn/8Grwn2e4nX2cH4PYl2k8SZqm9k+eCA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -470,8 +491,12 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= +github.com/filecoin-project/storetheindex v0.2.0/go.mod h1:P3Hd3sIWEkBU1fPnE49Y8nh/mdErOdIfiHBb85QAWfg= +github.com/filecoin-project/storetheindex v0.2.1 h1:jhsMh5O52bBU/NrnjJs2iLPI92T38kjlU9bk/dP0sts= +github.com/filecoin-project/storetheindex v0.2.1/go.mod h1:Tc5mYdAnGUzly40cuo35yITDD3XhF9EX5BO7evGsJ5M= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -486,8 +511,15 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To= +github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= +github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= +github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= +github.com/gammazero/radixtree v0.2.5 h1:muPQ4eEgCkUymFWPiVQRuXOQv4IhWg8YXH2r71MoqPM= +github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -502,6 +534,7 @@ github.com/globalsign/mgo v0.0.0-20180905125535-1ca0a4f7cbcb/go.mod h1:xkRDCp4j0 github.com/globalsign/mgo v0.0.0-20181015135952-eeefdecb41b8/go.mod h1:xkRDCp4j0OGD1HRkm4kmhM+pmpv3AKq5SU7GMg4oO/Q= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= +github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-chi/chi v4.1.0+incompatible/go.mod h1:eB3wogJHnLi3x/kFX2A+IbTBlXxmMeXJVKy9tTv1XzQ= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= @@ -719,6 +752,7 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= +github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -876,9 +910,15 @@ github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1: github.com/ipfs/bbloom v0.0.1/go.mod h1:oqo8CVWsJFMOZqTglBG4wydCE4IQA/G2/SEofB0rjUI= github.com/ipfs/bbloom v0.0.4 h1:Gi+8EGJ2y5qiD5FbsbpX/TMNcJw8gSqr7eyjHa4Fhvs= github.com/ipfs/bbloom v0.0.4/go.mod h1:cS9YprKXpoZ9lT0n/Mw/a6/aFV6DTjTLYHeA+gyqMG0= +github.com/ipfs/go-bitfield v1.0.0 h1:y/XHm2GEmD9wKngheWNNCNL0pzrWXZwCdQGv1ikXknQ= +github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIcAEPrdtus= github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= +github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= +github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= +github.com/ipfs/go-bitswap v0.4.0/go.mod h1:J2sAsp9UKxLgHDektSy3y3Q9OfQjM9sjhKBR1dlwrMg= github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -887,6 +927,10 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= +github.com/ipfs/go-blockservice v0.1.1/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= +github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -906,11 +950,14 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= +github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= @@ -922,29 +969,47 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= +github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= +github.com/ipfs/go-ds-flatfs v0.4.5/go.mod h1:e4TesLyZoA8k1gV/yCuBTnt2PJtypn4XUlB5n8KQMZY= +github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= +github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= +github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= +github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= +github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= +github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= -github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= +github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= +github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= +github.com/ipfs/go-graphsync v0.8.0/go.mod h1:CLxN859dUTcXCav1DvNvmAUWPZfmNLjlGLJYy+c3dlM= +github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= +github.com/ipfs/go-ipfs v0.10.0/go.mod h1:HsnRkQdpruG6JMaycJyrlLwJdduw1dJv2rEPgWxdJvA= +github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= +github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= +github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= @@ -954,10 +1019,13 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= +github.com/ipfs/go-ipfs-cmds v0.6.0 h1:yAxdowQZzoFKjcLI08sXVNnqVj3jnABbf9smrPQmBsw= +github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= +github.com/ipfs/go-ipfs-config v0.16.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= +github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= +github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -979,11 +1047,16 @@ github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkg github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= +github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= +github.com/ipfs/go-ipfs-pinner v0.1.2/go.mod h1:/u9kMe+TyQybN21O5OBicdyx3x93lVI77PCtiTnArUk= +github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-provider v0.6.1/go.mod h1:I4Cig3InhftbRJohph76Qy/P2uKEZILNGiKvDJmmC28= +github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= @@ -1002,9 +1075,12 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= +github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= +github.com/ipfs/go-ipns v0.1.0/go.mod h1:3IbsuPkR6eAGcnx+E7j6HpOSbSQJPZ6zlRj+NK3jPxQ= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -1028,39 +1104,60 @@ github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72g github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= +github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= +github.com/ipfs/go-merkledag v0.3.0/go.mod h1:4pymaZLhSLNVuiCITYrpViD6vmfZ/Ws4n/L9tfNv3S4= +github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= +github.com/ipfs/go-mfs v0.1.2/go.mod h1:T1QBiZPEpkPLzDqEJLNnbK55BVKVlNi2a+gVm4diFo0= +github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= +github.com/ipfs/go-namesys v0.3.1/go.mod h1:/BL4xk8LP5Lq82AmaRKyxZv/eYRlumNiU9SZUe1Hlps= +github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= +github.com/ipfs/go-peertaskqueue v0.4.0/go.mod h1:KL9F49hXJMoXCad8e5anivjN+kWdr+CyGcyh4K6doLc= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= +github.com/ipfs/go-unixfs v0.1.0/go.mod h1:lysk5ELhOso8+Fed9U1QTGey2ocsfaZ18h0NCO2Fj9s= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.6 h1:gq3U3T2vh8x6tXhfo3uSO3n+2z4yW0tYtNgVP/3sIyA= +github.com/ipfs/go-unixfs v0.2.5/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= +github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= +github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= +github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= +github.com/ipfs/interface-go-ipfs-core v0.5.1/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= +github.com/ipfs/interface-go-ipfs-core v0.5.2 h1:m1/5U+WpOK2ZE7Qzs5iIu80QM1ZA3aWYi2Ilwpi+tdg= +github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= +github.com/ipfs/tar-utils v0.0.1/go.mod h1:ACflm9wXvV9w0eMJt6yYXxS2zuIV+yXGNwbuq1bhLeE= +github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= +github.com/ipld/go-car v0.3.1/go.mod h1:dPkEWeAK8KaVvH5TahaCs6Mncpd4lDMpkbs0/SPzuVs= +github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= @@ -1071,8 +1168,12 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.2/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= +github.com/ipld/go-ipld-prime v0.12.4-0.20211026094848-168715526f2d/go.mod h1:JUI6cS52J83Tz5li0Zl6M2tDX4r5x68Y77K1fbXHFYo= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= +github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.3 h1:cGUmxSws2IHurn00/iLMDapeXsnf9+FyAtYVy8G/JsQ= github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= @@ -1081,6 +1182,10 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= +github.com/ipld/go-storethehash v0.0.0-20211122175924-41b16c131842/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= +github.com/ipld/go-storethehash v0.0.1 h1:U9E9n3dE0IaImSNbRcUmm5Dk9UPiS9H0i+LmCFFGJBI= +github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -1209,6 +1314,7 @@ github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5 github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= +github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= @@ -1228,8 +1334,12 @@ github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniV github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= github.com/libp2p/go-libp2p v0.8.3/go.mod h1:EsH1A+8yoWK+L4iKcbPYu6MPluZ+CHWI9El8cTaefiM= github.com/libp2p/go-libp2p v0.10.0/go.mod h1:yBJNpb+mGJdgrwbKAKrhPU0u3ogyNFTfjJ6bdM+Q/G8= +github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= +github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= +github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= +github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0 h1:8l4GV401OSd4dFRyHDtIT/mEzdh/aQGoFC8xshYgm5M= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= @@ -1243,6 +1353,7 @@ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQ github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= github.com/libp2p/go-libp2p-autonat v0.2.3/go.mod h1:2U6bNWCNsAG9LEbwccBDQbjzQ8Krdjge1jLTE9rdoMM= +github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat v0.7.0 h1:rCP5s+A2dlhM1Xd66wurE0k7S7pPmM0D+FlqqSBXxks= @@ -1315,15 +1426,22 @@ github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfx github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.4.0/go.mod h1:bZ0aJSrFc/eX2llP0ryhb1kpgkPyTo23SJ5b7UQCMh4= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= +github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= +github.com/libp2p/go-libp2p-gostream v0.3.1 h1:XlwohsPn6uopGluEWs1Csv1QCEjrTXf2ZQagzZ5paAg= +github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= +github.com/libp2p/go-libp2p-http v0.2.1/go.mod h1:9KdioZ7XqNH0eZkZG9bulZLzHv11A7/12fT97agqWhg= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= +github.com/libp2p/go-libp2p-kad-dht v0.11.1/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= +github.com/libp2p/go-libp2p-kad-dht v0.13.1/go.mod h1:iVdxmsKHVPQSCGPP4V/A+tDFCLsxrREZUBX8ohOcKDw= github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= @@ -1339,6 +1457,7 @@ github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3 github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= +github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1 h1:/pyhkP1nLwjG3OM+VuaNJkQT/Pqq73WzB3aDN3Fx1sc= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= @@ -1352,7 +1471,9 @@ github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8 github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= @@ -1380,14 +1501,20 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= +github.com/libp2p/go-libp2p-pubsub v0.4.0/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= +github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub-router v0.4.0/go.mod h1:hs0j0ugcBjMOMgJ6diOlZM2rZEId/w5Gg86E+ac4SmQ= +github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= +github.com/libp2p/go-libp2p-quic-transport v0.12.0/go.mod h1:EKHqxZbWE/FhDJZ6ebyZ/4v3X9zyuuuKIN0XR9vANT0= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= @@ -1416,6 +1543,8 @@ github.com/libp2p/go-libp2p-swarm v0.2.4/go.mod h1:/xIpHFPPh3wmSthtxdGbkHZ0OET1h github.com/libp2p/go-libp2p-swarm v0.2.7/go.mod h1:ZSJ0Q+oq/B1JgfPHJAT2HTall+xYRNYp1xs4S2FBWKA= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= @@ -1435,6 +1564,7 @@ github.com/libp2p/go-libp2p-testing v0.5.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aL github.com/libp2p/go-libp2p-testing v0.6.0 h1:tV/wz6mS1VoAYA/5DGTiyzw9TJ+eXMCMvzU5VPLJSgg= github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aLRijpYOR+zVjjlh+A= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= +github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= @@ -1444,6 +1574,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2 github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= @@ -1461,6 +1592,8 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= +github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= +github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-libp2p-yamux v0.7.0 h1:bVXHbTj/XH4uBBsPrg26BlDABk5WYRlssY73P0SjhPc= @@ -1514,6 +1647,7 @@ github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2L github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1 h1:yD80l2ZOdGksnOyHrhxDdTDFrf7Oy+v3FMVArIRgZxQ= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-socket-activation v0.1.0/go.mod h1:gzda2dNkMG5Ti2OfWNNwW0FDIbj0g/aJJU320FcLfhk= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= @@ -1524,9 +1658,11 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= +github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= +github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= github.com/libp2p/go-tcp-transport v0.4.0 h1:VDyg4j6en3OuXf90gfDQh5Sy9KowO9udnd0OU8PP6zg= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-testutil v0.0.1/go.mod h1:iAcJc/DKJQanJ5ws2V+u5ywdL2n12X1WbbEG+Jjy69I= @@ -1550,9 +1686,12 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= +github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0 h1:luRV68GS1vqqr6EFUjtu1kr51d+IbW0gSowu8emYWAI= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= +github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -1620,6 +1759,7 @@ github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9 github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -1642,6 +1782,7 @@ github.com/miekg/dns v1.1.22/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.29/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1706,13 +1847,15 @@ github.com/multiformats/go-multiaddr v0.3.0/go.mod h1:dF9kph9wfJ+3VLAaeBqo9Of8x4 github.com/multiformats/go-multiaddr v0.3.1/go.mod h1:uPbspcUPd5AfaP6ql3ujFY+QWzmBD8uLLL4bXW0XfGc= github.com/multiformats/go-multiaddr v0.3.3/go.mod h1:lCKNGP1EQ1eZ35Za2wlqnabm9xQkib3fyB+nZXHLag0= github.com/multiformats/go-multiaddr v0.4.0/go.mod h1:YcpyLH8ZPudLxQlemYBPhSm0/oCXAT8Z4mzFpyoPyRc= -github.com/multiformats/go-multiaddr v0.4.1 h1:Pq37uLx3hsyNlTDir7FZyU8+cFCTqd5y1KiM2IzOutI= github.com/multiformats/go-multiaddr v0.4.1/go.mod h1:3afI9HfVW8csiF8UZqtpYRiDyew8pRX7qLIGHu9FLuM= +github.com/multiformats/go-multiaddr v0.5.0 h1:i/JuOoVg4szYQ4YEzDGtb2h0o8M7CG/Yq6cGlcjWZpM= +github.com/multiformats/go-multiaddr v0.5.0/go.mod h1:3KAxNkUqLTJ20AAwN4XVX4kZar+bR+gh4zgbfr3SNug= github.com/multiformats/go-multiaddr-dns v0.0.1/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= +github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= @@ -1732,8 +1875,9 @@ github.com/multiformats/go-multibase v0.0.3 h1:l/B6bJDQjvQ5G52jw4QGSYeOTZoAwIO77 github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPwIdYQD509ZjSb5y9Oc= github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= -github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61 h1:ZrUuMKNgJ52qHPoQ+bx0h0uBfcWmN7Px+4uKSZeesiI= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multicodec v0.4.0 h1:fbqb6ky7erjdD+/zaEBJgZWu1i8D6i/wmPywGK7sdow= +github.com/multiformats/go-multicodec v0.4.0/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1742,12 +1886,14 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= +github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1880,6 +2026,7 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= +github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -1923,6 +2070,7 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= +github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= @@ -2072,6 +2220,7 @@ github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/uber-go/tally v3.3.15+incompatible/go.mod h1:YDTIBxdXyOU/sCWilKB4bgyufu1cEi0jdVnRdxvjnmU= github.com/uber/athenadriver v1.1.4/go.mod h1:tQjho4NzXw55LGfSZEcETuYydpY1vtmixUabHkC1K/E= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -2090,8 +2239,9 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= @@ -2101,8 +2251,9 @@ github.com/vektah/gqlparser v1.1.2/go.mod h1:1ycwN7Ij5njmMkPPAOaRFY4rET2Enx7IkVv github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= +github.com/warpfork/go-testmark v0.9.0 h1:nc+uaCiv5lFQLYjhuC2LTYeJ7JaC+gdDmsz9r0ISy0Y= +github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= @@ -2130,8 +2281,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -2140,6 +2292,7 @@ github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= +github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= @@ -2166,6 +2319,7 @@ github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/ github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -2238,14 +2392,18 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= -go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= +go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= +go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.13.1/go.mod h1:bREWhavnedxpJeTq9pQT53BbvwhUv7TcpsOqcH4a+3w= +go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= +go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= +go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -2323,6 +2481,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2358,6 +2518,7 @@ golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHl golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs= golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= +golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE= @@ -2370,6 +2531,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2438,6 +2600,7 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2529,6 +2692,7 @@ golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191128015809-6d18c012aee9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2584,7 +2748,9 @@ golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -2648,6 +2814,7 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= @@ -2687,6 +2854,7 @@ golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2835,6 +3003,7 @@ gopkg.in/fsnotify/fsnotify.v1 v1.4.7/go.mod h1:Fyux9zXlo4rWoMSIzpn9fDAYjalPqJ/K1 gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -2896,6 +3065,7 @@ modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= From 051d993d62e727879ffa0bbf35eddbefee921057 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 17:48:12 +0400 Subject: [PATCH 31/99] update markets --- go.mod | 2 +- go.sum | 51 ++----------------------------------- testplans/lotus-soup/go.mod | 2 +- testplans/lotus-soup/go.sum | 50 ++---------------------------------- 4 files changed, 6 insertions(+), 99 deletions(-) diff --git a/go.mod b/go.mod index 04a19d32995..0fabad4e1a6 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 + github.com/filecoin-project/go-fil-markets v1.15.0 github.com/filecoin-project/go-indexer-core v0.2.7 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index 4dbbdc31cfa..2771e6e23e1 100644 --- a/go.sum +++ b/go.sum @@ -33,7 +33,6 @@ cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0Zeo cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk= cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= -contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -335,8 +334,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 h1:C3rdpJJQm8/UX3aAPNbVHzSEDjI9EvD1jb2eroA3aK8= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0/go.mod h1:H1pk9szltDLCOvQW/6fy0ugvUnDY7CDCf9HJSGSoj60= +github.com/filecoin-project/go-fil-markets v1.15.0 h1:PjoALE+brZTdZCteaj05KXt4lP5eWVWDeZmfwVAXa4w= +github.com/filecoin-project/go-fil-markets v1.15.0/go.mod h1:d6oFs7L6NCIcjY0p31KjbKAEhc0WIn8dguxGGIdTiXo= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -345,7 +344,6 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGy github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= -github.com/filecoin-project/go-indexer-core v0.2.6/go.mod h1:wW5Ab0gJXL2vT4iEMbPUfPs773iMc86Q8GtfSEqmu3Y= github.com/filecoin-project/go-indexer-core v0.2.7 h1:D0egR6Q3Jkp5r4klxkdDQvjXeLx3cwZMKE55qop2xCI= github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitviL7h1fksIU6a4j52yPnA/E1PU= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= @@ -374,7 +372,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d/go.mod h1:pTZVxt9mF+YCYSfNsn7i0rwhoMBmbjfSDAQVoxWGP10= github.com/filecoin-project/index-provider v0.2.0 h1:r1VPVhtWrU5+6Mo6g2Ozr5NXWMFz1qHt0NKJzV5ELZ8= github.com/filecoin-project/index-provider v0.2.0/go.mod h1:eYiwZfJNadwn/8Grwn2e4nX2cH4PYl2k8SZqm9k+eCA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -400,7 +397,6 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.2.0/go.mod h1:P3Hd3sIWEkBU1fPnE49Y8nh/mdErOdIfiHBb85QAWfg= github.com/filecoin-project/storetheindex v0.2.1 h1:jhsMh5O52bBU/NrnjJs2iLPI92T38kjlU9bk/dP0sts= github.com/filecoin-project/storetheindex v0.2.1/go.mod h1:Tc5mYdAnGUzly40cuo35yITDD3XhF9EX5BO7evGsJ5M= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -422,7 +418,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To= github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= @@ -566,7 +561,6 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -694,10 +688,8 @@ github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIc github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= -github.com/ipfs/go-bitswap v0.4.0/go.mod h1:J2sAsp9UKxLgHDektSy3y3Q9OfQjM9sjhKBR1dlwrMg= github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -706,7 +698,6 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.1/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= @@ -729,7 +720,6 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= @@ -754,7 +744,6 @@ github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1 github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= -github.com/ipfs/go-ds-flatfs v0.4.5/go.mod h1:e4TesLyZoA8k1gV/yCuBTnt2PJtypn4XUlB5n8KQMZY= github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= @@ -762,24 +751,20 @@ github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1 github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= -github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.8.0/go.mod h1:CLxN859dUTcXCav1DvNvmAUWPZfmNLjlGLJYy+c3dlM= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-ipfs v0.10.0/go.mod h1:HsnRkQdpruG6JMaycJyrlLwJdduw1dJv2rEPgWxdJvA= github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -802,7 +787,6 @@ github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTH github.com/ipfs/go-ipfs-cmds v0.6.0 h1:yAxdowQZzoFKjcLI08sXVNnqVj3jnABbf9smrPQmBsw= github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= -github.com/ipfs/go-ipfs-config v0.16.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -827,14 +811,12 @@ github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBG github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= -github.com/ipfs/go-ipfs-pinner v0.1.2/go.mod h1:/u9kMe+TyQybN21O5OBicdyx3x93lVI77PCtiTnArUk= github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-provider v0.6.1/go.mod h1:I4Cig3InhftbRJohph76Qy/P2uKEZILNGiKvDJmmC28= github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= @@ -858,8 +840,6 @@ github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYD github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= -github.com/ipfs/go-ipns v0.1.0/go.mod h1:3IbsuPkR6eAGcnx+E7j6HpOSbSQJPZ6zlRj+NK3jPxQ= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -883,11 +863,8 @@ github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72g github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= -github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.0/go.mod h1:4pymaZLhSLNVuiCITYrpViD6vmfZ/Ws4n/L9tfNv3S4= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= @@ -896,9 +873,7 @@ github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fG github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-mfs v0.1.2/go.mod h1:T1QBiZPEpkPLzDqEJLNnbK55BVKVlNi2a+gVm4diFo0= github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= -github.com/ipfs/go-namesys v0.3.1/go.mod h1:/BL4xk8LP5Lq82AmaRKyxZv/eYRlumNiU9SZUe1Hlps= github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= @@ -906,16 +881,13 @@ github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-peertaskqueue v0.4.0/go.mod h1:KL9F49hXJMoXCad8e5anivjN+kWdr+CyGcyh4K6doLc= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= -github.com/ipfs/go-unixfs v0.1.0/go.mod h1:lysk5ELhOso8+Fed9U1QTGey2ocsfaZ18h0NCO2Fj9s= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.5/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= @@ -923,17 +895,14 @@ github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLf github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.5.1/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/interface-go-ipfs-core v0.5.2 h1:m1/5U+WpOK2ZE7Qzs5iIu80QM1ZA3aWYi2Ilwpi+tdg= github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= -github.com/ipfs/tar-utils v0.0.1/go.mod h1:ACflm9wXvV9w0eMJt6yYXxS2zuIV+yXGNwbuq1bhLeE= github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.1/go.mod h1:dPkEWeAK8KaVvH5TahaCs6Mncpd4lDMpkbs0/SPzuVs= github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= @@ -948,9 +917,7 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.2/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.4-0.20211026094848-168715526f2d/go.mod h1:JUI6cS52J83Tz5li0Zl6M2tDX4r5x68Y77K1fbXHFYo= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= @@ -963,7 +930,6 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= -github.com/ipld/go-storethehash v0.0.0-20211122175924-41b16c131842/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipld/go-storethehash v0.0.1 h1:U9E9n3dE0IaImSNbRcUmm5Dk9UPiS9H0i+LmCFFGJBI= github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= @@ -1193,8 +1159,6 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.11.1/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= -github.com/libp2p/go-libp2p-kad-dht v0.13.1/go.mod h1:iVdxmsKHVPQSCGPP4V/A+tDFCLsxrREZUBX8ohOcKDw= github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= @@ -1251,17 +1215,13 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.4.0/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub-router v0.4.0/go.mod h1:hs0j0ugcBjMOMgJ6diOlZM2rZEId/w5Gg86E+ac4SmQ= github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= -github.com/libp2p/go-libp2p-quic-transport v0.12.0/go.mod h1:EKHqxZbWE/FhDJZ6ebyZ/4v3X9zyuuuKIN0XR9vANT0= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= @@ -1730,7 +1690,6 @@ github.com/prometheus/client_golang v1.1.0/go.mod h1:I1FGZT9+L76gKKOs5djB6ezCbFQ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeDPbaTKGT+JTgUa3og= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -1772,7 +1731,6 @@ github.com/prometheus/procfs v0.2.0/go.mod h1:lV6e/gmhEcM9IjHGsFOCxxuZ+z1YqCvr4O github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= -github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= @@ -2060,13 +2018,10 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.13.1/go.mod h1:bREWhavnedxpJeTq9pQT53BbvwhUv7TcpsOqcH4a+3w= go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= -go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= @@ -2342,7 +2297,6 @@ golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200420163511-1957bb5e6d1f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2433,7 +2387,6 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 6ba232cdc43..f7907c4b2e7 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -9,7 +9,7 @@ require ( github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.12.1 - github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 + github.com/filecoin-project/go-fil-markets v1.15.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.1 github.com/filecoin-project/go-storedcounter v0.1.0 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index c53300eca59..8751bff12b5 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -38,7 +38,6 @@ cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohl cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs= cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= -contrib.go.opencensus.io/exporter/prometheus v0.3.0/go.mod h1:rpCPVQKhiyH8oomWgm34ZmgIdZa8OVYO5WAIygPbBBE= contrib.go.opencensus.io/exporter/prometheus v0.4.0 h1:0QfIkj9z/iVZgK31D9H9ohjjIDApI2GOPScCKwxedbs= contrib.go.opencensus.io/exporter/prometheus v0.4.0/go.mod h1:o7cosnyfuPVK0tB8q0QmaQNhGnptITnPQB+z1+qeFB0= dmitri.shuralyov.com/app/changes v0.0.0-20180602232624-0a106ad413e3/go.mod h1:Yl+fi1br7+Rr3LqpNJf1/uxUdtRUV+Tnj0o93V2B9MU= @@ -426,8 +425,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0 h1:C3rdpJJQm8/UX3aAPNbVHzSEDjI9EvD1jb2eroA3aK8= -github.com/filecoin-project/go-fil-markets v1.14.2-0.20220112094113-068e7f35a0e0/go.mod h1:H1pk9szltDLCOvQW/6fy0ugvUnDY7CDCf9HJSGSoj60= +github.com/filecoin-project/go-fil-markets v1.15.0 h1:PjoALE+brZTdZCteaj05KXt4lP5eWVWDeZmfwVAXa4w= +github.com/filecoin-project/go-fil-markets v1.15.0/go.mod h1:d6oFs7L6NCIcjY0p31KjbKAEhc0WIn8dguxGGIdTiXo= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -436,7 +435,6 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGy github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= -github.com/filecoin-project/go-indexer-core v0.2.6/go.mod h1:wW5Ab0gJXL2vT4iEMbPUfPs773iMc86Q8GtfSEqmu3Y= github.com/filecoin-project/go-indexer-core v0.2.7 h1:D0egR6Q3Jkp5r4klxkdDQvjXeLx3cwZMKE55qop2xCI= github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitviL7h1fksIU6a4j52yPnA/E1PU= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= @@ -465,7 +463,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.1.1-0.20220107223914-37c38e2b284d/go.mod h1:pTZVxt9mF+YCYSfNsn7i0rwhoMBmbjfSDAQVoxWGP10= github.com/filecoin-project/index-provider v0.2.0 h1:r1VPVhtWrU5+6Mo6g2Ozr5NXWMFz1qHt0NKJzV5ELZ8= github.com/filecoin-project/index-provider v0.2.0/go.mod h1:eYiwZfJNadwn/8Grwn2e4nX2cH4PYl2k8SZqm9k+eCA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -491,7 +488,6 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.2.0/go.mod h1:P3Hd3sIWEkBU1fPnE49Y8nh/mdErOdIfiHBb85QAWfg= github.com/filecoin-project/storetheindex v0.2.1 h1:jhsMh5O52bBU/NrnjJs2iLPI92T38kjlU9bk/dP0sts= github.com/filecoin-project/storetheindex v0.2.1/go.mod h1:Tc5mYdAnGUzly40cuo35yITDD3XhF9EX5BO7evGsJ5M= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= @@ -514,7 +510,6 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= -github.com/gabriel-vasile/mimetype v1.1.2/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To= github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= @@ -752,7 +747,6 @@ github.com/google/go-github v17.0.0+incompatible/go.mod h1:zLgOLi98H3fifZn+44m+u github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/gopacket v1.1.17/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= -github.com/google/gopacket v1.1.18/go.mod h1:UdDNZ1OO62aGYVnPhxT1U6aI7ukYtA/kB8vaU0diBUM= github.com/google/gopacket v1.1.19 h1:ves8RnFZPGiFnTS0uPQStjwru6uO6h+nlr9j6fL7kF8= github.com/google/gopacket v1.1.19/go.mod h1:iJ8V8n6KS+z2U1A8pUwu8bW5SyEMkXJB8Yo/Vo+TKTo= github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= @@ -915,10 +909,8 @@ github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIc github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= -github.com/ipfs/go-bitswap v0.1.3/go.mod h1:YEQlFy0kkxops5Vy+OxWdRSEZIoS7I7KDIwoa5Chkps= github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= -github.com/ipfs/go-bitswap v0.4.0/go.mod h1:J2sAsp9UKxLgHDektSy3y3Q9OfQjM9sjhKBR1dlwrMg= github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -927,7 +919,6 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.1/go.mod h1:t+411r7psEUhLueM8C7aPA7cxCclv4O3VsUVxt9kz2I= github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= @@ -950,7 +941,6 @@ github.com/ipfs/go-datastore v0.0.1/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAK github.com/ipfs/go-datastore v0.0.5/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.0/go.mod h1:d4KVXhMt913cLBEI/PXAy6ko+W7e9AhyAKBGh803qeE= github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= -github.com/ipfs/go-datastore v0.3.0/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= @@ -975,7 +965,6 @@ github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1 github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= -github.com/ipfs/go-ds-flatfs v0.4.5/go.mod h1:e4TesLyZoA8k1gV/yCuBTnt2PJtypn4XUlB5n8KQMZY= github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= @@ -983,24 +972,20 @@ github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1 github.com/ipfs/go-ds-leveldb v0.4.2/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUNumo= github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= -github.com/ipfs/go-ds-measure v0.1.0/go.mod h1:1nDiFrhLlwArTME1Ees2XaBOl49OoCgd2A3f8EchMSY= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= -github.com/ipfs/go-filestore v0.0.3/go.mod h1:dvXRykFzyyXN2CdNlRGzDAkXMDPyI+D7JE066SiKLSE= github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.8.0/go.mod h1:CLxN859dUTcXCav1DvNvmAUWPZfmNLjlGLJYy+c3dlM= github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= github.com/ipfs/go-graphsync v0.11.5 h1:WA5hVxGBtcal6L6nqubKiqRolaZxbexOK3GumGFJRR4= github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= -github.com/ipfs/go-ipfs v0.10.0/go.mod h1:HsnRkQdpruG6JMaycJyrlLwJdduw1dJv2rEPgWxdJvA= github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= @@ -1023,7 +1008,6 @@ github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTH github.com/ipfs/go-ipfs-cmds v0.6.0 h1:yAxdowQZzoFKjcLI08sXVNnqVj3jnABbf9smrPQmBsw= github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= -github.com/ipfs/go-ipfs-config v0.16.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= @@ -1048,14 +1032,12 @@ github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBG github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= -github.com/ipfs/go-ipfs-pinner v0.1.2/go.mod h1:/u9kMe+TyQybN21O5OBicdyx3x93lVI77PCtiTnArUk= github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= -github.com/ipfs/go-ipfs-provider v0.6.1/go.mod h1:I4Cig3InhftbRJohph76Qy/P2uKEZILNGiKvDJmmC28= github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= @@ -1079,8 +1061,6 @@ github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYD github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= -github.com/ipfs/go-ipns v0.0.2/go.mod h1:WChil4e0/m9cIINWLxZe1Jtf77oz5L05rO2ei/uKJ5U= -github.com/ipfs/go-ipns v0.1.0/go.mod h1:3IbsuPkR6eAGcnx+E7j6HpOSbSQJPZ6zlRj+NK3jPxQ= github.com/ipfs/go-ipns v0.1.2 h1:O/s/0ht+4Jl9+VoxoUo0zaHjnZUS+aBQIKTuzdZ/ucI= github.com/ipfs/go-ipns v0.1.2/go.mod h1:ioQ0j02o6jdIVW+bmi18f4k2gRf0AV3kZ9KeHYHICnQ= github.com/ipfs/go-log v0.0.1/go.mod h1:kL1d2/hzSpI0thNYjiKfjanbVNU+IIGA/WnNESY9leM= @@ -1104,11 +1084,8 @@ github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72g github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= -github.com/ipfs/go-merkledag v0.1.0/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= -github.com/ipfs/go-merkledag v0.3.0/go.mod h1:4pymaZLhSLNVuiCITYrpViD6vmfZ/Ws4n/L9tfNv3S4= -github.com/ipfs/go-merkledag v0.3.1/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= @@ -1116,9 +1093,7 @@ github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3P github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= -github.com/ipfs/go-mfs v0.1.2/go.mod h1:T1QBiZPEpkPLzDqEJLNnbK55BVKVlNi2a+gVm4diFo0= github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= -github.com/ipfs/go-namesys v0.3.1/go.mod h1:/BL4xk8LP5Lq82AmaRKyxZv/eYRlumNiU9SZUe1Hlps= github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= @@ -1126,16 +1101,13 @@ github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= -github.com/ipfs/go-peertaskqueue v0.4.0/go.mod h1:KL9F49hXJMoXCad8e5anivjN+kWdr+CyGcyh4K6doLc= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= -github.com/ipfs/go-unixfs v0.1.0/go.mod h1:lysk5ELhOso8+Fed9U1QTGey2ocsfaZ18h0NCO2Fj9s= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= -github.com/ipfs/go-unixfs v0.2.5/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= @@ -1143,17 +1115,14 @@ github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLf github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= -github.com/ipfs/interface-go-ipfs-core v0.5.1/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/interface-go-ipfs-core v0.5.2 h1:m1/5U+WpOK2ZE7Qzs5iIu80QM1ZA3aWYi2Ilwpi+tdg= github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= -github.com/ipfs/tar-utils v0.0.1/go.mod h1:ACflm9wXvV9w0eMJt6yYXxS2zuIV+yXGNwbuq1bhLeE= github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= -github.com/ipld/go-car v0.3.1/go.mod h1:dPkEWeAK8KaVvH5TahaCs6Mncpd4lDMpkbs0/SPzuVs= github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= @@ -1168,9 +1137,7 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= -github.com/ipld/go-ipld-prime v0.12.2/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= -github.com/ipld/go-ipld-prime v0.12.4-0.20211026094848-168715526f2d/go.mod h1:JUI6cS52J83Tz5li0Zl6M2tDX4r5x68Y77K1fbXHFYo= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= @@ -1183,7 +1150,6 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= -github.com/ipld/go-storethehash v0.0.0-20211122175924-41b16c131842/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipld/go-storethehash v0.0.1 h1:U9E9n3dE0IaImSNbRcUmm5Dk9UPiS9H0i+LmCFFGJBI= github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= @@ -1440,8 +1406,6 @@ github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-pnet v0.0.1/go.mod h1:el9jHpQAXK5dnTpKA4yfCNBZXvrzdOU75zz+C6ryp3k= github.com/libp2p/go-libp2p-kad-dht v0.2.1/go.mod h1:k7ONOlup7HKzQ68dE6lSnp07cdxdkmnRa+6B4Fh9/w0= -github.com/libp2p/go-libp2p-kad-dht v0.11.1/go.mod h1:5ojtR2acDPqh/jXf5orWy8YGb8bHQDS+qeDcoscL/PI= -github.com/libp2p/go-libp2p-kad-dht v0.13.1/go.mod h1:iVdxmsKHVPQSCGPP4V/A+tDFCLsxrREZUBX8ohOcKDw= github.com/libp2p/go-libp2p-kad-dht v0.15.0 h1:Ke+Oj78gX5UDXnA6HBdrgvi+fStJxgYTDa51U0TsCLo= github.com/libp2p/go-libp2p-kad-dht v0.15.0/go.mod h1:rZtPxYu1TnHHz6n1RggdGrxUX/tA1C2/Wiw3ZMUDrU0= github.com/libp2p/go-libp2p-kbucket v0.2.1/go.mod h1:/Rtu8tqbJ4WQ2KTCOMJhggMukOLNLNPY1EtEWWLxUvc= @@ -1501,12 +1465,9 @@ github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1 github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= github.com/libp2p/go-libp2p-pubsub v0.3.2/go.mod h1:Uss7/Cfz872KggNb+doCVPHeCDmXB7z500m/R8DaAUk= -github.com/libp2p/go-libp2p-pubsub v0.4.0/go.mod h1:izkeMLvz6Ht8yAISXjx60XUQZMq9ZMe5h2ih4dLIBIQ= -github.com/libp2p/go-libp2p-pubsub v0.5.4/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.6.0 h1:98+RXuEWW17U6cAijK1yaTf6mw/B+n5yPA421z+dlo0= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= -github.com/libp2p/go-libp2p-pubsub-router v0.4.0/go.mod h1:hs0j0ugcBjMOMgJ6diOlZM2rZEId/w5Gg86E+ac4SmQ= github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6 h1:2lH7rMlvDPSvXeOR+g7FE6aqiEwxtpxWKQL8uigk5fQ= github.com/libp2p/go-libp2p-pubsub-tracer v0.0.0-20200626141350-e730b32bf1e6/go.mod h1:8ZodgKS4qRLayfw9FDKDd9DX4C16/GMofDxSldG8QPI= @@ -1514,7 +1475,6 @@ github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+ github.com/libp2p/go-libp2p-quic-transport v0.5.0/go.mod h1:IEcuC5MLxvZ5KuHKjRu+dr3LjCT1Be3rcD/4d8JrX8M= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= -github.com/libp2p/go-libp2p-quic-transport v0.12.0/go.mod h1:EKHqxZbWE/FhDJZ6ebyZ/4v3X9zyuuuKIN0XR9vANT0= github.com/libp2p/go-libp2p-quic-transport v0.13.0/go.mod h1:39/ZWJ1TW/jx1iFkKzzUg00W6tDJh73FC0xYudjr7Hc= github.com/libp2p/go-libp2p-quic-transport v0.15.0/go.mod h1:wv4uGwjcqe8Mhjj7N/Ic0aKjA+/10UnMlSzLO0yRpYQ= github.com/libp2p/go-libp2p-quic-transport v0.15.2 h1:wHBEceRy+1/8Ec8dAIyr+/P7L2YefIGprPVy5LrMM+k= @@ -2026,7 +1986,6 @@ github.com/prometheus/client_golang v1.3.0/go.mod h1:hJaj2vgQTGQmVCsAACORcieXFeD github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.4.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.5.1/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= -github.com/prometheus/client_golang v1.6.0/go.mod h1:ZLOG9ck3JLRdB5MgO8f+lLTe83AXG6ro35rLTxvnIl4= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= github.com/prometheus/client_golang v1.9.0/go.mod h1:FqZLKOZnGdFAhOK4nqGHa7D66IdsO+O441Eve7ptJDU= github.com/prometheus/client_golang v1.10.0/go.mod h1:WJM3cc3yu7XKBKa/I8WeZm+V3eltZnBwfENSU7mdogU= @@ -2070,7 +2029,6 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3 h1:4jVXhlkAyzOScmCkXBTOLRLTz8EeU+eyjrwB/EPq0VU= github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/prometheus v0.0.0-20200609090129-a6600f564e3c/go.mod h1:S5n0C6tSgdnwWshBUceRx5G1OsjLv/EeZ9t3wIfEtsY= -github.com/prometheus/statsd_exporter v0.20.0/go.mod h1:YL3FWCG8JBBtaUSxAg4Gz2ZYu22bS84XM89ZQXXTWmQ= github.com/prometheus/statsd_exporter v0.21.0 h1:hA05Q5RFeIjgwKIYEdFd59xu5Wwaznf33yKI+pyX6T8= github.com/prometheus/statsd_exporter v0.21.0/go.mod h1:rbT83sZq2V+p73lHhPZfMc3MLCHmSHelCh9hSGYNLTQ= github.com/raulk/clock v1.1.0 h1:dpb29+UKMbLqiU/jqIJptgLR1nn23HLgMY0sTCDza5Y= @@ -2392,13 +2350,10 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.13.1/go.mod h1:bREWhavnedxpJeTq9pQT53BbvwhUv7TcpsOqcH4a+3w= go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= -go.uber.org/goleak v0.10.0/go.mod h1:VCZuO8V8mFPlL0F5J5GK1rtHV3DrFcQ1R8ryq7FK0aI= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= @@ -2814,7 +2769,6 @@ golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtn golang.org/x/tools v0.0.0-20191030062658-86caa796c7ab/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= -golang.org/x/tools v0.0.0-20191114200427-caa0b0f7d508/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= From 8c8652e7bb25fd7f6c5846154c4b1152208be09e Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 12 Jan 2022 18:06:48 +0400 Subject: [PATCH 32/99] add a new cli --- api/api_storage.go | 3 +++ api/proxy_gen.go | 13 +++++++++++ build/openrpc/full.json.gz | Bin 26593 -> 26596 bytes build/openrpc/miner.json.gz | Bin 12927 -> 12982 bytes build/openrpc/worker.json.gz | Bin 3804 -> 3805 bytes cmd/lotus-miner/index_provider.go | 28 +++++++++++++++++++++++ documentation/en/api-v0-methods-miner.md | 11 +++++++++ documentation/en/cli-lotus-miner.md | 19 +++++++++++++-- node/impl/storminer.go | 4 ++++ 9 files changed, 76 insertions(+), 2 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index 69212074983..decd534d683 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -223,6 +223,9 @@ type StorageMiner interface { // so they can download its index IndexerAnnounceDeal(ctx context.Context, proposalCid cid.Cid) error //perm:admin + // IndexerAnnounceAllDeals informs the indexer nodes aboutall active deals. + IndexerAnnounceAllDeals(ctx context.Context) error //perm:admin + // DagstorePieceIndexSize returns the size of the piece index. DagstorePieceIndexSize(ctx context.Context) (int64, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index ff491919ebb..fc9f2f8d53f 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -671,6 +671,8 @@ type StorageMinerStruct struct { DealsSetPieceCidBlocklist func(p0 context.Context, p1 []cid.Cid) error `perm:"admin"` + IndexerAnnounceAllDeals func(p0 context.Context) error `perm:"admin"` + IndexerAnnounceDeal func(p0 context.Context, p1 cid.Cid) error `perm:"admin"` MarketCancelDataTransfer func(p0 context.Context, p1 datatransfer.TransferID, p2 peer.ID, p3 bool) error `perm:"write"` @@ -3994,6 +3996,17 @@ func (s *StorageMinerStub) DealsSetPieceCidBlocklist(p0 context.Context, p1 []ci return ErrNotSupported } +func (s *StorageMinerStruct) IndexerAnnounceAllDeals(p0 context.Context) error { + if s.Internal.IndexerAnnounceAllDeals == nil { + return ErrNotSupported + } + return s.Internal.IndexerAnnounceAllDeals(p0) +} + +func (s *StorageMinerStub) IndexerAnnounceAllDeals(p0 context.Context) error { + return ErrNotSupported +} + func (s *StorageMinerStruct) IndexerAnnounceDeal(p0 context.Context, p1 cid.Cid) error { if s.Internal.IndexerAnnounceDeal == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index a15f7d23f72ccec2e7d5e7b0c906d8c61028e1a8..7cccdfb9bfeb71afad4f1ea23c7cd0da3911cb16 100644 GIT binary patch delta 16729 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 M|E!P#iYZ400H#c#Y5)KL delta 16717 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index e205226dd7cbfa08bedcb358841385ed05ad5911..083a54e39d24ce6be46887d393f2e626ae1ccf74 100644 GIT binary patch literal 12982 zcmV;nGD*!JiwFP!00000|LlExbKADE_*cR3_s2~-vO_(rhiCeSV<)Lkoz~ZO+Ivsz zIfY0_!Zih|BxGC7_`ClG0N(`omaI5Dr_)*_xL5%D!eV#vO|w^sI4eUt*1Cti!=cvE zFqzrf@i&cPY9Z}dyRhln1y`4+;N

u3+iaj{MK7v270|G-2K+H*%+BD%0mS3Cat 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 literal 12927 zcmV-_GJwq=iwFP!00000|LlGHbKADE|G$Fa_lKKwXoq@OmORrR5<5wK>a@PL)82bx z&nZMg60RvgB_TU%#{c_w0Ps!lP05PGb2_cX$6^8Qes-}~EWT-Ug^05f4#8<`Z7!?z}*&RffJkn3u?W+B&f@QO(?fBp5>oZgbznwa2~3x2w0)PZyK z2@~X8GiPnG*C0yZ)ye=SB@BIKho|ztufZ!QZytIN=>RznbzXySx8#=L8E_BJ2}2Hn zc8nYF^Ur`_TRwKn9K_ZR0Y4G+n56hx2k#x{H_EQps}*$^viK`c{9oQ%8BM%e8Lw~2 z(=GYyufH^1bJxoybT-)WI&djFxpw%FO*aQC>S8f8-fcdlce>^vcWpENWxUZ% z@Ru6b^!-@VuDL)<$myZ4aJjM(Z%3OMz5ZaR-Rb;w!3MN19lAme!~BUEv|XfYY_mfA zaXS4!WHRmUiSzgO8av3+PMEVsoSBt_Ovv~Z@z#^#ny#U*a>&l8>2hY`efWskVm$>8 zT2h99jmf>HYiq~WPP7GMEBEBho4I)8(4@;ZGf&=TU-@*76vv*cEyDrd zTao1aF;3nsmf~;PrGrlCa)}uqUWeLo(ayPbgPbKMkRj#WGX(9+_0-1hLVX{*aB8F9 z9|>|kK--=|^WN77@7|x(xli7FDpI#qC7t?FHS z#Fazy&3|r6sf{3sJeeFQ)uZXp+#0`WL1>Be(+fk-@gxU5uaWpS{s+~E&X9%zH+8V; zfuyAduiz9PhVK=EY4~WKKM>r3uNA3I`n}fZ7tP| zQOH!xDL%YHbIkce)+N1Wmky;f9jyA`%bhF9dY||T@#_P?;r%suwS=oL;rExH@Xlop zCb_;*jIA7H&LLk(vy;QXyUn}DyRu#VRuApgl%&3DguUpeT2%-^DWv-HO*=p1*Mv-J zCq2V3bgvKE$wasYl+JDh!{evBJKZu+|`neRCvMTM={)<7vTMV3b`$Q_DSJX zMEX~OKm@ZR-&1-fl|Sbo^*Oojmim62dV~SrrK@jAa`ZXHW&X2erWd{bKs(V)NdAif zXbOITgP;X$YTj#{!4+g2AueOWarjfjjrAIQY5w4Gua{wR=yJ7Y$VaIf7AHa=%iw&u zo363VFgbkxl_6pwOMc{YGNZ!k@bAvS@(L1*E{TW~tp?)q=>lT%enriN4pu{ci6Hh! zo%_Q-WXS6^coou*7_%H}6k$2X7%8Y$GeYr^iP|9Em95&Lyb&)8<=03cE1hX4V_l1? zrFJs$FZ_x&+6h_Pwl1DW)~N*NH=J)c+w`aZKoh~iqiZcjn*kh**mU6Dqvh)V=-0nj z>kVD5{%^XRq0MYCoZ-QGGg`0Fu>UaBp6VNj2x%t$AlXqi6J5@X&^;4kTc3 zd!0C{+XIzHpa9hz@G9Xz$1y8>fn%2V>)nR&yW0N}+xYkOyM;;qwLt&<^Uqp+c!{)9 z2413UeAAZ5!h-WDCeYcuCnmKxB5=HP(P$WnP31Wwb=6`|{gZw_!#{BlWau3<@7Jq( z{z-&DmVe^SFr~|&^cW&U)E+|xw;;|?cE~B#s40H9fKUs8sk}ysg&e>Z2)HX`ayw%I zKKy_W;vu+Mpj#r>|9~eLE?^7D#4F;n94z@zaou;;gkUlUkC-j^{abSJ`_1R;|Gay9 z`s?S*|Gay9{r*3fZ*P79h&*72k|noq575D4M(-j97zHj}BCvvNp#w-P(bg^Djqz&{ zCLb4w02A6aZ!y+Q>7T5(`F=fxN3owyE4gQKrIlc&gM7A!50W9%cKJPn1{%_!T z@p(Ss5rY9{)B)%LIU7E>f3Fc(VPqn3dVZ!$hscKiY;MDG59qF4U6ODCbPynvf#}D< zOX2J@WN$d9@PT6MmYn|%pvmw9W*fmgVu9nea_9pl^Fwe>T!x_KQ5VD`gl~!Ppk~-{ z8Gr(Ekj44IF7O<_8Rf$l9T8tJ=q%{>baPAO>zo73#Mg{6?I0UL@1{o|yI}32+1lnk zdW6mrtXI-uG@-dbApY68_@KYn{Np6PJ%7-XC=`kfa)sao60tzbKql;sN*ZPm+b+Pf zP_{XX@=E}rK-Zj;-_Rp)`5%Y3(*a)4%-V0R&8uk$*;V{@p!B^^zacWJ-CVGUi?EgN9_w`=Xq7El)JohkWZ4;Y-rvXgs6NQYsIe(lrCnwtZZ@ zC-jkUWfvF`daK}fVs8L^fY=sONJ_-qHk^raeO^N69x*qxLajTwUO+t8#jO%FZ_mNy zV5OaCA%wm4$4c89cUSUQYVqua`MSr)1>i#I{d#rD{fLI}5+Ri3<(k+!JjGT6u!%IX z3%H5*sn{is@s|xd9^{A^7au3+#gXRt0TJ%bwP(`3Auo=)E7yYJv`(=F94_T9B20Lt z$eta@XQmtqO^=3`J;puDfZ8EAXWZlAV}ZC!2O#j41attwDYcLZUOg_bx!^7qHboc_ zg5}y~*yMK)R?xghR?rGp)7Qd9gWwZ?Y60EFVSG`bodv!&-J1^AJ6vx8*T)&V4t&88 z72VrmRG>R@$>%Y39x@Zn>%n4IwoR8G|71Y1n`n!9vj zkW!z*zq*}O(aB58Nu6XQjQbz<3Yqi)In5(?Q9_Nwc2Qz&#q1Ic7JDZ#CLm*IxneG# z@;LGafFeo}i`LbPVhAYbbTT3tUW1!3h5^oJk*k6W9bgt!%v&OcxeIrE*9tuDWh9lK zA!xg&l(^VJ&hN9CjS0H)V{zhUJ#{W5tF~xUO6^>OR!CQ^=kh~TQTH+(*viH_FCX_g zl63b~c>5XYsj83UNn^XB8ztJF;6|x#QEU^;cS5@xp&ex8EX6+&*$Ut)sJ0=t3bI>~ zTQ&Qg;O<6nhgtbJ>2K6B*rsTx*efqhNJYY!oaG4900TjtQn%^tbVCb^Bhoy7-K%i@BTQy4dD(pwKug+k&g-1$NU} z>ZS3Aznzu1^+}{3@y80yA}5oZIT6yTmNF6HaVs`2%9&!pJa)6(7CeWps0&4DCb1gW z;*MZlQWQ(CCp}}(*EQci5G;CveQIMwn0De<&JkPi9=JCVy>C(X_xlxai!jhXkDEuF)u%hW<1Ht zqT$v|Djc@n+0?wZ8yW8usVqw#%pnTQc#2@IP51LID;snb-&?Zo;Z!1N+6yNcal77% zORg*r@q#8XDHs1`DfYz3$`ayIeT~?b@(hY7XN3-A)w=v(K@sg%LI@=~u=U!L&sPTQ zN1Lxs`gyrHX<29|;G0jkT@@*g`ZiXO1oNGGyd3oyai2}lHDM;xQiUt~@ zX1`OBm!l%XyxgLcD70@t$|P#kSC6fl4;Aa3YP=lPILgajiU>m6`5=X)TT+oKX(9F1 zB(n>hs=ORk8Rg|oMTDW<%##AbEvZTQ1eE$plEHqbA}>cpj`K3Jt`Tc7TCJj%T{1h^ z)L*C(C4<)0)j-AV)@8p7Oz(4Gy2Ff%!DO6~6espQBj+t4bWKd8OsOb?7799rr9U!J zLP4x4KB)Q2Mg|oNvU-Q>mHl$O;yEhwn|6#M*nYMd+hSCp)eM7^@NFMT1Q6tKEhT)u0 zmtnJBv?7;c77BU-{2ILaN%2-*hEZ;FYV;%6u993-)S+w_EuS~PP^$|pG+octSmOoM6I$~W6POwSK*wPCp}$z2iQ{{`t42YhEgD{zDgZF1fg%^K?5UNIcy=-93q;sY7i^ZM)&x$iGLY8l7r%s*zBQ zibve5j7-_{*Av@Dq8d~A6~74qOagswE9k#i_c*B&L#z{zzS_$Cyw*1v!K7}fMDVCWnzQ;NwLEpo5(9h;3u|4uYJNK zRbAl|{F=VTzj3sX0>?s^!R0C}nDBLlIa7X}0`&K9l+U#}oZ&fva^${gH$sp4x+ZD} zsm^GwI79WiTIF;EkJU2J5g(0GZ^Xv52|F~g6Zv; z4@I}rHbebT8AIV0`*^ouzESv0T*Q?uG!vI_vqXf65qN;M45212o)gnS&_x3Ct08!b ze5ukZSc8|7H zt4P7H@(e%KQ>C_wbgSP#(CT;XQi$DxLAPMgEg0-51!&-Z%b%I8- z62=K)+bCq5=C>Okc1vV^Lz%u8@nI2aeX_gI}SU7TIKS6Lm3y7q2K~Eo(>g z<3+WlKh(7=_$cbv$ZH}8OzE0fr*E&4pQygq9aE;N{%6KlQANr^H$6o~fi3%=ERvM7>hUya zmkr@0v|Kg33DvI3O;oZJUnnok8OJWw1Acmxdis+2UN;}?=7ak&A53^L6~9TuHL3cp zXPm19Q3Bh#W!Z__=u&TZPDC}f;*LqF-0!&EY=1%>2@sSIzsLNHJ>R?Y^5X+NBez-; zpYyg*!#;~xR&*el2I!+Ke@Td3xi~?YO7>oups>Z70fSV3w-hfZ7!hR!MiLU)Vo4JVjVV?^`=4>H5kXdJWy%ncpZcgfeJf3ul*q8E*<8 zD=+#RM6yBw-e#@1TwI_zG&h$HWz?kJ?7IHU@;lqDnjDZ)6SMe`SDtm1>}m45RLw+* z164)0aQDgG&89y-08|MfNX@R7yi#Q%@8dz4XMH3ozl>Cli!zxpbw7c6^3)_(KSW7Y z4pqcTR;h`?4Qj1`QPbR=z>=1lIfU?D=JA$yHM}r?zn5E~@KP3NXzJ-l$*6t&$P*l= ziv9U0$sA8ULAQq2p5T2e{(6GT)JUiAm)Qap`eogs-VPS^I5K!KtxM!!Y6-5h7g}P^ zY9}Kj_+Q0sW{s@$ce=*V#lX85_&&tIOF4~kMK3k@3LN>S$s)C~d^S2@c!_d6&6lwe zv)9k9=n;%lJ8nvvn$lY-*n6oU)6ND=HGf<2NPe_!b-iK6F~@S`uaL`?u%%-P6x4Qd zPJyD`b_7%1p|U3xsMvyxq2-FXfKlMc``xhx-LVDTu?0H;!=u~+DOZR&8_yQiJ{L+& zs{YYXYI<$KTZ+rAA05|~J?PGDdR`D1WgOcrb>g~dExqfkT6#j^`8c|V@9_MbFyZVZ zE(`#i;=|Jg#6-;Xbg&wVOPA2HkQK~zb+9^8T`xqE>zrzQRq-R}YSbg*9CPlriXzcb zD`)Qwttj|ZZ+e;MknAIuY5yZGa9i{FL^!hrzi+7QKtc_+*o#5Gg-#rOx1H!r$i=XC zoLfcfy0t=k*M)`lgi%qIlPhBgiYx8aum}l;x9(7Owe((kExitME{45vR(UK;FqyyO zU%wX41g~dQ@svKy4PIR%mb-c#5NfApXOyq)6zYujER8COyJg_y6kD#JnJH4`gI~WO zJYO*Fq<97NMXhm6GHR;`56At8*y;J1GB2QvYzjKr96pFHqeS( zE4c1LEl+8*_G;h}dlxc(F-b{a(hVQi-h>*kz~K;;K?Fdn-*QYa?k;Nx#U9 zM2Y2Y6!i^Ob(50dcS{>VLqn3>?pbJJ;+r~K0p!@0xff`{Qs(Am?H1|xGj@xF5-tB~ zsK)ZIR+L!&wM7*Uc`uMP%AE+;zQrT%GKQnr5wGD zlB=e=aZc50dxMrM09TmH9AL<0n9M7sk*btA%Cd4{J94wkjKM1))iVr3*Mf3r6`l65 z3RR(dT)uM5OLJh4GP1+3gmk^NWHLf6#fg*1ii_|mC7wYO9iBql_7cEFE<_j_Sq;EX z@#o%4CCgmljwj~q#&wS4X5sFl>K>tOSAhK9)s1)6az|9_zP zm;ZmQqB_dSVlaU&k+4#%w@di-ToUY!bZv=Agi-U6;PF3x1kmig<>*lxKv#N5#&l8XPa3`q|4Z7U|UBS zn+>Eb_<)#5wybMd#ru`4YAqWonrX*?`W)}%bj8j>b{4Y8LUvf)VYP?V#~FJe9}z(gWFCb5iZ&k{x~zTT zc>&GsqkLx5?ErpW&pPbyu)o9p4*T~B`zIMYWh9z?q7TSJ@djugp|X8^k2KZ}qQ|-K zFucR?4#PVP-y;kk7#TaqBz|2w^Z{L=m5og(k6=v$PI)X>P^*OL-occI9*I97!L|)A z9ZF|z{l#kqSM7kmy1T_o+MOZj48e{JL7qmH%L+`FF-~OowUrLntp#`Xtb{%5W$Z)C zg5CiYB{5X#r4HS2H7n)N$t)>*SXwq_B1DpwQi-6J<&s{HgS<)2c;o;r)y zS-dS;yne>kI0@TV2sTbF4ro-eZc|F_`gSa6vmNUd?Lud>I-9jOHfuLEsXJTJ*^)B0 zWRS5t(+5!-K^MuwbSS-{u!=>AQQH2>PNKoKj7qW>-3m`*f$0*zXP4XK7GLS@{h;UQ36rwYpKip~t{W ze4bs6u})Rn)|g;^CuNtq`B`VnOW5*JZWRG8@TYXS#H>k{MubW&JMO*P$bv_BXvcoX zJJnh5&U){i^$zu>TdnFW*h{rw$GLm;Lzr%oml2^-%Yrpb!H6{9w(;sxE;{42m&U8h zvgqvAi?&ulK`+A`G5#X6hz@@?8A zw{}AeteZ~9LPE7{n#7`0Y&F>D6=!1$2CbW%bp~xO4O*x@C8eb8wL3oc&$t#?cOkG_ z1?=qh9@_1pkz04eJ2$vt&VPi;_Oml1jkRN!iQc)kMBHsxf$~#jfMKR}Kl?2&JXRD|xa&EPEh9rbrxRY z%^+i6wx^TV<^ow~7|xquPCz6JcczruufZ$K0fFn~x2HTKpQPH#@z)AgvvDZJfwf+) zxS^KBfGh6_Co_4bxSEV13Pn6;+ey;?gW@DgasovCPPZe#Lv1wHz ztACo<4Sh>CHFYgTCrjPn6d!&jD`;6rK7EbP{CgZ@jfEAdWBxi~>jiT_FNoLF^Em&j6v`FBd#wwg8CG^?U)` z6*Q4>()kPeEkT$qki*R`di34^kJz@s6amvgTn2SO9qGrL(6+t1HZ|`7pBdO-NgZ@c z{MJlJBJWo7`124$`N^}jw2o&U(d?elAKoc^_14x3yyEPQF{XLIJEkBd9m&h})W+`O z6kFN}cOmq|x%FpAa!OrjYbV<{F+UUm?{v36kb`F!S-fd~Bu;IN2-8lqnbGSHhMKNj zI`jcs+)oRyUBD@_lW`thyJpZ~?^o0mhwS%^p02$oR{VkoW0wv#(Is-co0<`6>6F?w zWXR!Mi5rrs#N{VBX4js%6{{(Q?LX<-uL!NeOVYiYWBdJIr^vk0p4jiX*n%1$J1R*5%Ebj^EDfOSQP@?S0Wt%6zp z4|eeJ@F=7FfR~gYGG{*6Yq#DJjVUTwNB)b6ql`?6hu=YFF0N2+%sWLq$I;Gip@!QX z?@!iDImsMeE|G;HL-q!^h*+*T*`D7AOSy<6U2fkahV!|D=3HLH8RhcP!&`FYh0(bK z1@J6<8M@@Z7$?md$IG*aD&7hR}) z%5T_uyHV13BvgfaFKh+kIAiyARFy9gvE)imGcfe%WWgbywaUlO&&ooeM=}=#qjYNn zU&wng^!ZHrYkv^f*kypuz{{@D9}#>1b%jjEu^ZZFYX^D~Q&*`oD5}+);UzlsA1T)E z4B9z*9&4b6nrHVWPvNupoFgXJ{E>GTaQ=i(1O3n;qhjfxu~Nr+p8B52yW5EYj*Q@c zwL^h>s#cSXU3P&0h!2l!*d&r4CDWDy1q8RNHBr6`R3+pn&<~*&G8+aE^k{DmylA+m zCAZ`eV&)3XSyBf93qjijQ#9j0xD92{VXnUj*D2FpE7OsYvAsu%$S3IBf1u9i)!czr zy-Z;hp}dtb`MmrhL5c9(OqewN<{2?co_CTWoE(F#3H4+vOGMANHvXgKjvVzeGW>n% zW#+=0_=q6BdqaO;A>z-}o9J>bWu>(&RNq{ZZRv9n-;EW!lgo?YQ9mPVS&nnC6S8SM zH%_QHq#Hb6KB^mUqGVt<)lLmBF4ea@KQ6(gD#9B)q7L#-Ij3HPH+b|Jg1o7r%Z>A@ zo~|A0eU89w7ioP~oEl{2ddIY?d9XD}s-1XilIk`?u8JO%LZsrrYlut*u~&gnUEH;c zyA~_hH6v_FtZD7K+i$JI?95JBHRioXs%>ABgcN2<>;n7iU?)G)->nIr%vot;)vMo~g z4C3wRe>UeufRM$OyQOuLJhl98g1Vh{UJQ>$xw%`{?JUP!=P$?9)5C)Gm>S9#<*|gu zg$%g+u>8{LV9wgJ=ue?rX8gcgczhVCt46fg(R=g0~6A|mM6o6d3lvD9#qn*bEdjT-1+K%+GU z3@EmveNhIBR4;5gm}|zSrv9W8yyDYBGUw)wQ2@i4Bqd&)Xoek^z1I2LBTHI+3l3`hf>awk()*o$YRrFsyHEa==UcRTZgCEDh~R_skOBAUdd)DMa^Du z3Zq4ZD^3yZ-O-wpKi=uuTj7lYl~pd*#EG3^3piZ#InS<`F59yM`OH*!7ak30Sq^et zWC0vd6QMUO{QM=dz;pv3_yakv$TfrDlv>CHuVnBI6APOHEFoB~ZH7&L_h1Fhdt?Qz zaMgV+f^QIf;!iE0yEu#^3Lo?csCcVR-?yIkaxlO)y7GEb7~HkWx6JtzeO z#mhW?q$pJNZlR}J=xM6j{oD*F_X4|hi**I>7b~%!s#v7Rf?P@M^?dc}8tn6|R$IXV zv~507od+Q$w^b$kP3_AnA1R@1euhR@xvoGL2Dw>RLN3n9wFpo&)d`7^LbFC1&)-*D!6jUMkwSIHr4`!9xYp@87-mlvYEmfbfU~%4LuKfk-tUfBVsb1 zEV-dG0KptT1jXmTbOX-MexN|`o^Is{g(0JmPlal4ArehQH6+Fx@Es*xJEhCznVz*o&zh{>#Hk+*2mL#*MwVAwPMoN5@=c3YcWb+V zoL4_e48loQ&u*XV*>Ul{!REcRn}3MjoXC>^buIDwHIfCk@}CM4rXxERQWvfebA;6% z_I2%s`ujJ%FL41~_TEWtanQ93Iu}y>D<)R@?hRfdm%-)ABkMpDrJu?)2-gwRwSfIyQJ zyL*H()$_Ea{;75hWuCJVQ_nIz_tdvkNvPxp@zttSMM%#$)*Feao$CsNc7;K^!k|A` zVbG``_`Y?8F{v-#^Lfpsmc&i9`c?tLY=pF5ojiU|AveEuj;DvQLGRIH>fy!yGhNdqqus6!x z)8t-zk&PyiJxL-vbRSt?y2GTzc@jR!g3x_}ZmoD;z1nNdJztu1CNx}Xf| zr=KZx_<$FAI_dR|f*5@Zs{7Kk<~Vn+k=yiC+ccTHquRn#v&E{HcYcekP2nH*@ovM= zIkC`Jahyxm$uC1M&<^b@NG!S}$aQtFIs$$^Vqw;{+v4fC%29|O>cTnZ>}~y&xY!7n zR50m#WF8SGe3=`e6XRNk!0k<1SA2@(cWR5Z*{ndnMh^E34TSEssK_CH7eUT%qX~ z^xLxfKC@l1%VMinHA62<(CZYow!$78S-UEw3cj_h3u?mjn3Pi4IE`%gpMSJG)r`|= zteh#fc5q6wBQqpQh;?kGx0CG#vfaztl;{ZnW6-R*8!<{DZ(567zcrcLwd#YJyJpxv z{2=nIN=UtEqb-^D8O}FIKIdL~kcGasmd2GHlnPT(?RYfnO~&Kt0h$ergQ0bd4yFTS z9!%h@vb;Sn5by7u|%La9oAv~<|lwNLP?f2P0qeG18SG{FWEemh9>_~_8}N=fvs zZPUjan!Z&vDZ-}{2{@->-pQqpfNNEtIP8P!uHU07&3S7Psg?A|SeBWf%kNXA;V{nq zEHm<$&XyF|Q@DaAW*d}PHDm74wzxr{@W*~EYbMDlE?424N! z#JRZHtmFyb;e^Kv{SG3}UqZIH5mWwGU+z?J;f}Yc%PBC_eJLMO&;I z-0g+twlZ;yi^0~I9}EXaljFg7FdAjqT}Svlk`g@3gx$doggC3(#*(@|-5va{M8En4I6$Tv!_S#~E#?F_t!Sv4a( zU~=fH1>_E>v<%xN&^lAa-YG_R0C_PyKFTVsA>rTyCRTHR45<|7 z2zVHoH7y*Wu_6_1uM&_2~1^Q(<_qRt z4|b5bxj*5eENm}Wr|nYix|P}eOu5@r@EvDujFkgkzY==*eqIe&4{+{+8QvK(?Gm_K zP!c_dcpU)Ft&QGFHCQF986{z}o-G4&r4TMNC?zV$CZaYc{jJoD-I=@hqJ68ek+nz7 z6YQq@U9vX2q!e6YZyC+b-u9wUZErtK9i8?#-+@vGJ7V&*xx%)YvTCfou^@wQR*)^U z0u@bI$d{%Dz5JbDd^X)s3+~%lf~mh`&3R~PvD)j-&X%dWHIpA?&E)&(Mz@H4F&y{v z_Y__s4k*7MXtPE;3!`+(W%_u(Wa1^t5~nkYqxC;HQTn%;t=K{w8(>3rQIvF$1Qt0|>rg4rHB zY59yzC!5Uv1q5I07lc2%qx zm8O&TBum*|VZ2#}Y}=K`jZ+H&MtNW49SR=Bqb|6*JZ-UlP*+K7_qs63*t#Kw;a_xG zFM~6DJ$t!qy~ftz=g+~~uEf~j%{*5kBww(0R?tSJ*;TAhTU$sg;8?k?R{TyG?*z@p z)?@PjS)g9QaidRAJj0s92f0)WQ==LXdH}sQ|n-O z1dk4;rZGN%GvjF1Gy5ZSWW_Tjb12?G_nxB#g7%vS;|5Fs*W-Z27{r5;c3H zXr?Cr^*v>>s*)W7X()dr%YJq)5aw^%j5jVvHukq0Vo~NLRl%JRXh*qv2Rw zynci$?WETqkB1YZHy)3T;Bxx;)637Ub}}03+DGx%7Y%;A{0w@7!LfFi;KetT(6Uzk z$zX^_NApS7`Uwtt#_`~I*c<96gt8j-FjMkM~D5$NM9jlYNoR zCp`dDZ_3eY7fe%^b_=Fuo8LB=mgOTCOrMdJB$z%UEA4@4McHf{OsmW0cEGgOS4e{C zGqREd(`REP4W|7DV46bn-Fl`Cny(I~qnfA3n0$Zsehc9(6Z z!F6|Sr(M(CwVn1wch`0jBzM_%5+`@rb{Zjf*LK>~++Evg-*Q)NN02UD4{UjI{@q79 z$HvjX7!5|_-2{`wcUGX^$msPaN5g(^7MN zgW+-8(WHQxF3$Pfl9|NHXOzqobUvSCDzUW5++4v_hC916FfHAFtF!YajO52U!|6@d zw5Q!!MsBz>YZ4Z_zBO*zgVm}++BUA%5YiUr=B){7$`gH7Ax#48a|&q$Vb{d<3Ql#7 z>T|mTouk@0s-2_y9XYB`97*33IJLvfL@&MS6ZRVMe!{Qf=f~ArCQ})@b}IfB(S!WF z-zpWXJ(^|mK?BB>X0sz7)g{1%h diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 7049571e9b281b3093f19f69217fe8509271ded9..1bb3fa8f191938fdd300ce4a814a99cf2d360567 100644 GIT binary patch delta 2919 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 R{|^8F|Nm#&edH*~005Ka%2@ya delta 2921 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 TJ^z0I00960CiM*tD9Hc-oMYAc diff --git a/cmd/lotus-miner/index_provider.go b/cmd/lotus-miner/index_provider.go index fa9574460e2..cf97e35bf15 100644 --- a/cmd/lotus-miner/index_provider.go +++ b/cmd/lotus-miner/index_provider.go @@ -16,6 +16,7 @@ var indexProvCmd = &cli.Command{ Usage: "Manage the index provider on the markets subsystem", Subcommands: []*cli.Command{ indexProvAnnounceCmd, + indexProvAnnounceAllCmd, }, } @@ -56,3 +57,30 @@ var indexProvAnnounceCmd = &cli.Command{ return marketsApi.IndexerAnnounceDeal(ctx, proposalCid) }, } + +var indexProvAnnounceAllCmd = &cli.Command{ + Name: "announce-all", + Usage: "Announce all active deals to indexers so they can download its indices", + Flags: []cli.Flag{ + &cli.BoolFlag{ + Name: "color", + Usage: "use color in display output", + DefaultText: "depends on output being a TTY", + }, + }, + Action: func(cctx *cli.Context) error { + if cctx.IsSet("color") { + color.NoColor = !cctx.Bool("color") + } + + marketsApi, closer, err := lcli.GetMarketsAPI(cctx) + if err != nil { + return err + } + defer closer() + + ctx := lcli.ReqContext(cctx) + + return marketsApi.IndexerAnnounceAllDeals(ctx) + }, +} diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 2173d364101..030c9c58ff1 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -46,6 +46,7 @@ * [I](#I) * [ID](#ID) * [Indexer](#Indexer) + * [IndexerAnnounceAllDeals](#IndexerAnnounceAllDeals) * [IndexerAnnounceDeal](#IndexerAnnounceDeal) * [Log](#Log) * [LogAlerts](#LogAlerts) @@ -810,6 +811,16 @@ Response: `"12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf"` ## Indexer +### IndexerAnnounceAllDeals +IndexerAnnounceAllDeals informs the indexer nodes aboutall active deals. + + +Perms: admin + +Inputs: `null` + +Response: `{}` + ### IndexerAnnounceDeal IndexerAnnounceDeal informs indexer nodes that a new deal was received, so they can download its index diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index 450a3dee3d9..578b73f19fb 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1168,8 +1168,9 @@ USAGE: lotus-miner index command [command options] [arguments...] COMMANDS: - announce Announce a deal to indexers so they can download its index - help, h Shows a list of commands or help for one command + announce Announce a deal to indexers so they can download its index + announce-all Announce all active deals to indexers so they can download its indices + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -1190,6 +1191,20 @@ OPTIONS: ``` +### lotus-miner index announce-all +``` +NAME: + lotus-miner index announce-all - Announce all active deals to indexers so they can download its indices + +USAGE: + lotus-miner index announce-all [command options] [arguments...] + +OPTIONS: + --color use color in display output (default: depends on output being a TTY) + --help, -h show help (default: false) + +``` + ## lotus-miner net ``` NAME: diff --git a/node/impl/storminer.go b/node/impl/storminer.go index 62eda3001a8..80f189344cc 100644 --- a/node/impl/storminer.go +++ b/node/impl/storminer.go @@ -1008,6 +1008,10 @@ func (sm *StorageMinerAPI) IndexerAnnounceDeal(ctx context.Context, proposalCid return sm.StorageProvider.AnnounceDealToIndexer(ctx, proposalCid) } +func (sm *StorageMinerAPI) IndexerAnnounceAllDeals(ctx context.Context) error { + return sm.StorageProvider.AnnounceAllDealsToIndexer(ctx) +} + func (sm *StorageMinerAPI) DagstorePieceIndexSize(ctx context.Context) (int64, error) { if sm.DAGStore == nil { return 0, fmt.Errorf("dagstore not available on this node") From b780a64ed9e182ff5a777b40caf3ffc86e90c9d7 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 13 Jan 2022 15:31:15 +0400 Subject: [PATCH 33/99] send markets multiaddrs to the engine --- node/modules/storageminer_idxprov.go | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index b0e0e97d062..be07341429a 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -48,8 +48,8 @@ type IdxProv struct { peerstore.Peerstore } -func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv) (provider.Interface, error) { - return func(args IdxProv) (provider.Interface, error) { +func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, marketHost host.Host) (provider.Interface, error) { + return func(args IdxProv, marketHost host.Host) (provider.Interface, error) { ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/indexer-provider")) pkey := args.Peerstore.PrivKey(args.PeerID) @@ -67,7 +67,12 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv) (pro return nil, err } - e, err := engine.New(cfg.Ingest, pkey, dt, h, ipds, nil) + var maddrs []string + for _, a := range marketHost.Addrs() { + maddrs = append(maddrs, a.String()) + } + + e, err := engine.New(cfg.Ingest, pkey, dt, h, ipds, maddrs) if err != nil { return nil, xerrors.Errorf("creating indexer provider engine: %w", err) } From 8459d75597df8c0e9b09d11abb80fc8637139f48 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 13 Jan 2022 16:15:43 +0400 Subject: [PATCH 34/99] update index provider config --- node/config/def.go | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/node/config/def.go b/node/config/def.go index 838418e8c31..f8c4b9ba0f6 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -233,11 +233,7 @@ func DefaultStorageMiner() *StorageMiner { // TODO: Remove hardcoded defaults once provider library exposes them. // See: https://github.com/filecoin-project/index-provider/issues/108 - cfg.IndexerProvider.Ingest = ipconfig.Ingest{ - LinkCacheSize: 1024, - LinkedChunkSize: 100, - PubSubTopic: "indexer/ingest", - } + cfg.IndexerProvider.Ingest = ipconfig.NewIngest() cfg.Common.API.ListenAddress = "/ip4/127.0.0.1/tcp/2345/http" cfg.Common.API.RemoteListenAddress = "127.0.0.1:2345" From 9e40e246ec2951378d22cfa3ca13f829da5df7c1 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 19 Jan 2022 11:36:07 +0400 Subject: [PATCH 35/99] deps update --- go.mod | 8 ++++---- go.sum | 19 ++++++++++--------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/go.mod b/go.mod index 0fabad4e1a6..6ffd35fbe10 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.5.1 + github.com/filecoin-project/dagstore v0.5.2-0.20220119071824-e45c4d71e2d1 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.12.1 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.15.0 + github.com/filecoin-project/go-fil-markets v1.15.1-0.20220119073341-c6bf7824c5ae github.com/filecoin-project/go-indexer-core v0.2.7 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.2.0 + github.com/filecoin-project/index-provider v0.2.1 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 @@ -94,7 +94,7 @@ require ( github.com/ipfs/go-ipld-cbor v0.0.6 github.com/ipfs/go-ipld-format v0.2.0 github.com/ipfs/go-ipld-legacy v0.1.1 // indirect - github.com/ipfs/go-log/v2 v2.4.0 + github.com/ipfs/go-log/v2 v2.5.0 github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 diff --git a/go.sum b/go.sum index 2771e6e23e1..9b598cac668 100644 --- a/go.sum +++ b/go.sum @@ -297,8 +297,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.5.1 h1:ojzW/8z4PiquPDSA3EJ+Y4JcL+SWuloLaisy/hYcKMA= -github.com/filecoin-project/dagstore v0.5.1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= +github.com/filecoin-project/dagstore v0.5.2-0.20220119071824-e45c4d71e2d1 h1:/gyP12PCKJ/d+JkP+Jza4YE/9tpSiCPO3OBQ5YeK63w= +github.com/filecoin-project/dagstore v0.5.2-0.20220119071824-e45c4d71e2d1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -334,8 +334,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.15.0 h1:PjoALE+brZTdZCteaj05KXt4lP5eWVWDeZmfwVAXa4w= -github.com/filecoin-project/go-fil-markets v1.15.0/go.mod h1:d6oFs7L6NCIcjY0p31KjbKAEhc0WIn8dguxGGIdTiXo= +github.com/filecoin-project/go-fil-markets v1.15.1-0.20220119073341-c6bf7824c5ae h1:b6ZZPcz6kl2U6K1QBTd9PeNvPKLX5ZZTp12oHweA48w= +github.com/filecoin-project/go-fil-markets v1.15.1-0.20220119073341-c6bf7824c5ae/go.mod h1:VbEWyZhep61wguSaEhXAPX2xLXgSJlcEId4NySjxjaU= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -372,8 +372,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.2.0 h1:r1VPVhtWrU5+6Mo6g2Ozr5NXWMFz1qHt0NKJzV5ELZ8= -github.com/filecoin-project/index-provider v0.2.0/go.mod h1:eYiwZfJNadwn/8Grwn2e4nX2cH4PYl2k8SZqm9k+eCA= +github.com/filecoin-project/index-provider v0.2.1 h1:jM0ZxEsJhx4WmGgFBtC2ctk2pvu50Rd/LBNNNOcWbQQ= +github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -397,8 +397,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a h github.com/filecoin-project/specs-actors/v7 v7.0.0-20211230214648-aeae366b083a/go.mod h1:p6LIOFezA1rgRLMewbvdi3Pp6SAu+q9FtJ9CAleSjrE= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.2.1 h1:jhsMh5O52bBU/NrnjJs2iLPI92T38kjlU9bk/dP0sts= -github.com/filecoin-project/storetheindex v0.2.1/go.mod h1:Tc5mYdAnGUzly40cuo35yITDD3XhF9EX5BO7evGsJ5M= +github.com/filecoin-project/storetheindex v0.2.2 h1:2zQlAtHKOVAfBpqIuQ8Njas3kM0VwgpicUCKC+epPG4= +github.com/filecoin-project/storetheindex v0.2.2/go.mod h1:05vxs5u3vTQFAwGW9+pgWSMc3BgFOK513nPyIQyLwyQ= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -860,8 +860,9 @@ github.com/ipfs/go-log/v2 v2.1.2-0.20200626104915-0016c0b4b3e4/go.mod h1:2v2nsGf github.com/ipfs/go-log/v2 v2.1.2/go.mod h1:2v2nsGfZsvvAJz13SyFzf9ObaqwHiHxsPLEHntrv9KM= github.com/ipfs/go-log/v2 v2.1.3/go.mod h1:/8d0SH3Su5Ooc31QlL1WysJhvyOTDCjcCZ9Axpmri6g= github.com/ipfs/go-log/v2 v2.3.0/go.mod h1:QqGoj30OTpnKaG/LKTGTxoP2mmQtjVMEnK72gynbe/g= -github.com/ipfs/go-log/v2 v2.4.0 h1:iR/2o9PGWanVJrBgIH5Ff8mPGOwpqLaPIAFqSnsdlzk= github.com/ipfs/go-log/v2 v2.4.0/go.mod h1:nPZnh7Cj7lwS3LpRU5Mwr2ol1c2gXIEXuF6aywqrtmo= +github.com/ipfs/go-log/v2 v2.5.0 h1:+MhAooFd9XZNvR0i9FriKW6HB0ql7HNXUuflWtc0dd4= +github.com/ipfs/go-log/v2 v2.5.0/go.mod h1:prSpmC1Gpllc9UYWxDiZDreBYw7zp4Iqp1kOLU9U5UI= github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKys/4GQQfto= github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= From b8bf2af3e336d5150a4ed701a547e20395610349 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 20 Jan 2022 16:34:13 +0400 Subject: [PATCH 36/99] upgrade on master --- build/openrpc/full.json.gz | Bin 26594 -> 26596 bytes build/openrpc/miner.json.gz | Bin 12784 -> 13091 bytes build/openrpc/worker.json.gz | Bin 3918 -> 3915 bytes documentation/en/cli-lotus-miner.md | 36 ++-- documentation/en/cli-lotus.md | 36 ++-- .../en/default-lotus-miner-config.toml | 2 +- go.mod | 21 ++- go.sum | 172 ++++++++++++++++-- node/modules/storageminer_idxprov.go | 4 +- 9 files changed, 201 insertions(+), 70 deletions(-) diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index ae8f0b86655688ef335478f8abf47bf58d1ca299..7dec77e7cdd932d36240e255426f41fbff01e78e 100644 GIT binary patch delta 25704 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 z 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 delta 25743 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 diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 2cb9ab35a596996089916305611753f621b0d112..111e3892245aaf4e14f3ef40fef994df4cda5e28 100644 GIT binary patch literal 13091 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 literal 12784 zcmVT0geaKBuwg z6e1xB#}ufNkZmR7|NagD-U*W6MY7`XoK9#n4U65yH_cul;;anqSnD444o6x? z!(?V_$KN!HsfDy-?cAno7hGPPfVUTCT1UG_j*D%=zvvDR^#c>#Yfl|*iRi*MUG4bG zH;uq0`}700kYQtT_|~Ad^VT#SRtCbE6n^5#f4^PB@UxQarygc+8bpUc4+j$MX-H;oKXTUu?BNRCV zS}|BV4X5#QM=@dbigfXty2qIY$Fp7mmF`4#lj+3|cPgXmqne zthqh?FEXfh`^513XN?_XYRA-BBZkb%K?bDk3IFOz@~oqwM=@omw&5~l;$!%T>0&(v z4qDn20Sl8mt)s0SOFPyUl&;+4H*e;=$)RB{-^@IEJ6Jh3!|RR3X!p(3vZrsB(51+E z16TOX%CR3e|Cu9lIJf`bdH<-})t;U@`BZyilNp}ZrdPQkGzs`M*b=TLF1U1b^$ z@ZJg~=g)ESZ7~&p(=HrzVlS7NvgvhfD^A)uudb1^!~{|#eS3oqV;4>> z^!o!r&If2&Q)t}z{NTO&({}EXFQ1CoZ54U+Es6d&4O6t_ZxndeXW6IV0dyR=VZUXg zYYw<{YQFjHrnYS%NFpth6D4b!UgpN|O%p;xpr2lt^z8L=q~{gl|HfZYbPxu(VhL|u z>R^&<8^zGdVdfn0r8qk|4Q$wKcx))!I50tZ18ShjJeF$7nTG6``JBaXwLB4(`D;fu2e2ZIciV=q^0ihL&xtvNh|ht9SKo0~XpqHh_c} z+}X6;R0ft2u#H@o0!M}bb)}oLI%?_ zCScPK*d!i;>jk%y;xIqJY}KwU-F2AYF6-Bqs0chOo}q zvj~z83q*hcEsOOS8zy!+2AFUh8AI@IZ%9LSQHlM8*B0DEYmKxByLm9G%fR2(mL(Cx z{9#0F2O`(9zH{atjpWRI3g<4h9rW>}5^IN_%a889-1;r97SJ&-`8won3_^gp+X4yH zQX7L9-g4fLVB)Na3+B+7!Z`wlZCS`*a|CR`Bd2da0^ann6qCqxvt(ov?JRGlq@TH= ztWDt@ju0HU2>yeNCH;DY;a$IPx-)lyN4+CB{W`#d(P(JS)?c0eKQnhQT|#qYKK3!5 zoBwDX?P_fp%rf<<{5@M#?O3~6>w4edOU(a7HPpNZGvyoTXuiFlGUa;{wgS^7SAVORo3ho@aii0Y&5g=eHJP>`0WBnz?y^)OyII6hd1Pg1fM}J z9t@kf*rhJ8XJCe?v0%E4+Y0Q9|8ao{DFm-f1TCSXB!?q8DM5R0No>J!zTBiH3BP)3gAY1?)1c*&R zbaC*K8~YSl8-^*ox3PIc&VC2bp!gos4M!f)!0=i*_B|%^LvTi1ilFI1=fER?ZwR-b zX4r8lfL!Dtli`D1;2C@~n@wMIMts7sXTi9qn;RlNXBc40S2K#VgDeESmmYlVg0+ig zYm1HO0Xj>tUI~NIfW`uW__8zdLI14T;w09dHS{P7g=B+VPB;NYEYLEb32P&xh8e_` z3-BzYZHA&)3BVcXied5_dH^o_gXK1loLp`;Kwu=B`Z|;yo+tn5Ujc_%3xQrL}O#f*G>_<1Ux2KnRIK((#hD6pnX+ysKf z_H7IaNGV#bsLLdTBVGW=m3qv$t)}!jMKd@Vir?#S6RLc0Hj6yvSag_S2vY_k?YpOyvANn^~BkOW$eMB7*O zCg#SHx4zBikV2Djjubk_ZaSz-S^luEv(7m`@zXlitWYg7FuCWNA*^x-nh_kgqVuAd zNzM&pFV!N}9eZWFkXJIez{o%iCeU;QM4qO7+|~QNj^^7397T_?Pb`cG)sFo{a~`pN z&#Z~)vvW8_R>0C8oANV2hl(_cW1jEO(cTj?{=lQA3kMtM0y*AGO^@_+Vp}{!h+)NF z2&58^qi2p@3VOQxbLi5~E0Zy00u2kgi|C^o8Aj1%D^n!Io9eQ~D$=u27DBivDk%%z zVoT0^qcmDB-zh?iidhpL4VE3MjHb%Mh|-l(3YnC|%k~=Q&YU39IHrOjN|0fiMby&d zk{qY>RfOxRBvrrsV1kLB6{*CunP50E<$kZ;-J<*>&fFWM(c z35~{16aa3DL6k!%YH)}g{gy>u4vP%)VvACw(7Xas3Dl_09$Qr(GSpkvcsZ;w%8Oo# z5JJ=OAcdeCVv#aoA=TL=a|kV~yc||J%8Q$d5JR((Ck22TViWZMlE1Yjfx~K0D=Mb1Q_LL;iQaNX=$-TUVy!45zr5c_vZ@ zf5do#SAX%xA5?t`1RMn{(X;r`9He)IC|?kpa1pF`1A3XcOR~Lzqs%1kJpdRr}O(?|Bucp$HDDs zLGT|;_6>ABBNWdI6pJwDDTZ@myA&JM_7b@ev!tL$z^}oppCn)9o&V={CzpN%TV;;^ ziw2Z!TIJ*BR~>SJiKgrMoR>FBl`t{Zj>AlZn4ok4FHkUd;A-J+h|!oh++RT=<6;@D zq=uByNTrbfB{C4c$7Jq<@E`xPMlL-&)s6=p|Ce7UB@vc*=AMWJJXt_Okma=wLLS9a z5ymDer%_%|rPACoWZV@m$66f(!=?WepcaI6MU>-lUxa(DUG2Er(cVF~*=W%-H!>As zqR!kaB*rCv|6#9<1s`T&!apI`g>%VD{LYMr3sh%n{3+msI_U99n0uApy}!PE(|!}g zndtsh5|19d6t!o~Ys|mYb-jDQ|GC!nWB$)yT1WE&m=I z6%8d%Fi{DFBV1K3^gG5qvMVD)UXr~H7)Ubw2oK3ClzH4x=Jt@_qe|2eWt_4B;4zkz zj7RWNHN-gkNnpk}upGiN`bu8eDP+&C`^}1!U%P5N7ga4~+H*Oq@5uXjEFJg15_(in@UcQi}b9Tkb zDCvrDm6bF_oWkmB${694SYSa~l`fI%Xr=EZ&dtI7p0&gvBjG3zn?bTbZFLcal%Y3* zn=w4esH!ZYpqtei38c59J|x3V>kN4#6-D8v;=kKaUnzVhF25KyR1+6)vqXgQ8Mud* zaG@q1o)N=A&_!J4my_Tr@JfXbvbtBRnh+gzSqU1Opo&uNg@}kzMn;L?5wFG-f>z~n zUNS(9)bx@8ZYCTlg=|~htF7+UR`=SmWID=7=n*`6j@?+~OPye%6s+tUj>1Nsm!sH% zNkK2T=qS}isX`*zBid3W5edT5i-u&almfZi)9)YX^t*DQvi88BJuqkw40d*4@KTGE z4fJtFa%4oYR?dS=z^GSXGy!ZIWk%EZw#7!e3FsD9qP0* zBJNbDH7XlqLd(+a@xx&bOI^_?`p8xJ868#B|LM_f$r8vwTVfVuw`^^ME!YU+dC5qC zPB6_U*lccg-y1hR49#LpQ3iDf~jIECL0lMKarcYRzz9>Fxm&irVJ(Jda!7tHFizJy` zM@@|2!%N$y4Rc3y@uJ+)8+5cw_`s`6h-W+oCAb#+gYBdS%(#lN?{L6)jk`IpP4Ycf z33ucfr_cRL1QN!9$obZeCmrpKOzkx>Pu^Z8m#Dhc9b=}l_GiYb$UJ4CnVy0okuCcl zERv+N^8Pevsk(3yTrQj51Z$VYCQ4b770PpS#$}hRfgc_v-@asi*X{?~{osD=2NPCI z$u)_XCS||%lyey;N}yY}OgnKMt@MRwM3h4-ZkQ;=e#iA@^Bd}jgFxN=9w!Y#IL8@$U(2(@iOyk#f8`uT36iI zWh>)t0XS5Dcc1AB@RGISba9U6(AZo!Hnk1g+g(@RS$=2Ps>uma+L*`K$9x%976G~(!AlUh8JebuIlU7`crf zX~E=Fu{|FJnPbT(;8w8O6S!~1UQb||n(6d=l@zGZE^805`Z9#i&!A^wXFtsrLf%k#ZGP6gJ&#z&`fToGeV6WQ&tD)?9p(MG=sm51Uegs2} zT0{(EhTT@BNOacJ^u4YXIiIR+FY^qNeZ(?tf5ZuHYc?NuXEtE>4Wt7|u)!8b(eE`d zh~alTh*pK154uOWRkW@eE3|i2SZI$c6d%$$HD}Y`8&4ymE=tDc}5jaVZ&VG)fJ+-r`G|XW@>gu@!C$I&gjU}QYGq z)Ab`Wd8mBw>lcLQ3#uI#pMbuoGmc3{Z53|exE~QcIXjic1*lMN5=fzo<<(Cs{t2}m zbm)DQN72a+8lh_m)~(CsM{~JI2r(^yq-~VMP~$N$T$r8P2G4%vX z6tr$u6Gd@vbt$q%gcL3Qs>#OUuSS?y{Ix|E4sdN5xMkqIXW)KDIQ4~v%sCSFPc`O^0FW~-oZ>^@ zz{=&_2&5doje;x3x^Yb9YS#+$BEOPb)~hOs*-)RnV?cVx3Nvc3&mvAa4CBP!oewBXPa3` zq>b39p<728$p%6fd_a^3TUJ%9{QFW`wUQ3y-87>>eT;Wgcmx9epN1aOP`LoAtJ(&3dgiYqi-PYqJPHsnrB~_rTPb zEIz$V`KMH|r&i;&8gGjlua}V;C&cz8g0(}70~n>W+tjwL>Uu2bvl;Cb9YU+KTAj5w zI%_vIsasvr>Jk-Q($C1w^o6K}po>IdI+RW*ETd6kkhXualjyK1rIH*)d&1MImAz0a ztxRuax+l{I840_-42$fQYf1D7ocdm{-`BLx-XQ|1DN!FEUb}~Ah5gT4MtFos?Z__h+pxSJ367+$sW$;7{!364N?S8WAX! z^tktJEe#&Qp&9)hA5^QoTkXAf+B@W%_Oz+}aH>VO@7S76PiI(}XNK!Dfv-uQ(c8P-yMutW{`xsnA01QKXWl z&+gdVKjT?o)q}wH6tLCXd#JYudT!kf@7~~=G5--L+mFtSbk>Ysj$_|OWwr`=FBEbs z!&@2d$?$Gg-HkP&c!{poQ+MNX)~O`JlThRrs)%obMtOItq#)*8tdam*>TVSo=5o26 z#z;VO0bL;AhL7n2QUDzU5P?&R^^OUk3+w_+TndSS4r^b`k{EJo(bDf#YAcAl*)?H4 z`+qT+8P?VM1f4rX-DK5;=kz}9DaZ9PDg$_P`*vzO>D%d5m@NuG)mF+eiK5`@T0;rc zwtnesYXr4MP^;mEyy<7;WqUk%Wh{_+is8JD%n5*G$(^ZfTd%<@%mf1C%WqG4N3kkdVUuHuN1>Lo!{vi6KHhk1nt)$n4yX+v0rmGa!k4Th8LolNiz^&*su9mU)D;yLxYME3wrZJ1g*tv)7g} z^&Q?Z22nI5FV<5FyNeTSYRAlk=p^o~KScsl+l7{Pyp0?4LlW?Acl!f5c!rV5y7p({ z#KMSB?O2=X-Clp7b+ik|zQ-oB)52%xaEh#?pQoc;QRvY3E8F0g?05BUM|)4q_ybRj zT{zf47s&BmYI>xn6Wg*NMGnJ?zYs_z9zTgWyYkd6KTRp@|EZ(>iqI-NKH&sW&MYr; znSXLs%lN^(l_>ZqVHe9Lt1N_Y&Qylz(L%}x*Qs%RUxZXuPzXu1>`-MSR~AN;>Qu0m zb3oZ%#@{gM zXx?{RSeF!0{-;W773}hVu#1le!;JC+UQhy$ocUm_-D+1frl4e9`Oi0w!ZXDizk}3R zT%uf`cM5opp`G1B1+zOoo~)g65;?qFA`?T3tPOAxF1^oeH z3z@;2Z(6t4*N!y~;)y`*tZs7&s?uoH-*jO^_wD_9g<t+dW8lxvV_SNMjZ2`4Q3gk1J$QCcB|^x^|#P zF;$s51EQS0DPE#OzezE7XTZ+k^H>KJ*gShQc?_S0=NwUS=8wF$fZ@k&8tA(Ysm+fL zYBP0g zBckU!8~@Q_M~2;u2!Ee?sj=`jKHQ1#UfaK~5b<~Fb$B@!vQ%3ZvTrWPruexC@7j#r z(&hPJ*vp7o7V{irLe}-?#sL+(bc6QlUfp;XijLh>KNYOF)Y$UuxCE9m4{y*!?&O^^ zOg#^8(DWIcys4?n_4CSFS9bM2hvT;Ov_7kx>SxA!$GED#vo#5-8GmaM>NZ`jk`X9L zq+-WwD47a;uUtm8e%IFTTFlsk%%Ezvo|kB8-`Cm83IM8m*h1S^fNRFY4N%Jqo{n_t z@c($pP{Ij1bL?dhhziaqFm1%OJw?tE6G*v}$0i5H0%Fnu4-0H8fC0%3nId4?#Ir3# zKiB?8hk$p}-FMPfcJ3m9(B+YQC}U^vW; z-M(u493=x{7RSe3wnglo0lXRh&&Iq+AY`HCZt2`4k1f9&r*6xg=Y!!WH+Ji)nd6wN z{NtEvd{}TEQ-S%SI4W>lh=98f$1g2Uz7(Du=LQk+nBXv5yfRNlz%*tJM}aoPmT@!- z*)ocNpAQ5r3z@(sfr*LXC&cuWb0JSNbZ-c?0d??vj+`JD5kbe=w1(@C z#fFpI0H9!RRD%Zt7>zMt0I?bFiy~OWdSTbWUNg2e^*5d1726h)Ia7Dk1~A-7+Qjn{ z&9LLr*B$mXxgl^(?Iom`@$n|u^kN#@?6%DLLow$_&kZ9AXtC}wRUDAq_4|{7&BGIH z7CU|8&>Bj;m!he}sM#k@p|_~;#3{nPJ34dn=Q~|{D|}JFveLtvIIt6J0*8@4!`bEA zWovdI+Dy51;lY5W=^)odCcptS?s~)A&R-%EOg8|6Kak_{SThJtY!eyam2kdcVq${} zO9+;0i(-SlJy=2G4w*qOjCEgg=Nkl{SgQqe7l(0)!X`Z;RJ>EC@0-uNxe-nQDc3*d zNrGzTm?sH!o5wto5h#g);$t4)Qxvj#d(hJ!^weeTUTy@Gdyd_z#kzv;i<#IDRV-p; z4o;DKJzKpz2m3h7*_LAfEsJeb=YdPfZIsD=liRY=CJM~vM`*N_>k4?GpBr_>>EeuB zaR)_Rp77yh?K!{P2Cfu}>TrwS(N4G~GOFy2D(9ex6KDk;ijB1eoxu6i&@M7IiHfBl zc?|_-u*JD0Y0Xun{Fd|glk*3;aZK(dn$_ZX_PtySF5&8nAgWtNthBCQKIjn1Ow}4O~A;+s4cSdHm0>_JP3Tx2u zGItgDJQziOiq1zwg+EzfW6uBtb9^5Zp99kkI6M7;9Km~<$`cYpMj@XP)!sr$G~v~d zDC@vClsejpyBjcrT;_RR(h=cn^^i^SML@E`PTyd@6SJLqIwg9J{r1XB#H3k#XN zd-m*i!jKN(L&w_qQ(3N#R}@(b^-!Ul4SRAW~yds3;vU33}xQ45@S!5k$dc`R1zw=AU<0uRfP1EW3`!x z>bbTsXj>SxEe!gD6$XtGf^S=wn3L-CUEL?4B0=L;Txs4DM$|Wr$6c^LrkFry^PU(s zKg4E6y^BVJNY~-lfpMtj$O&w=E%<#ri?*^*%KhLUH6gmrCUrC?vwCA7P#&ca4Y%q0^GA5dEPI8 z$;<}!tg*vv$q=MY{d60p%LhEq({Z<_7x?HKVBMF-HAlI*MsD3(ZPQ@#u4)T!&E}_G z-u*42HiduL$GZ(hXT(I0{5qGcn_mW=qa9k8keK$8AlL1H)e!jch=ozxZiBbuN@pQ@ zsSCrHp||y0;$kzb$Y8?u$h;zs+cMXjC&ra7f!mv~uJ{(oAJi6W#~0lUlR^1gyyj-0 z_s31#bd$bU=DWPGXOM9M6%{K=TqIo2`xAH(4sqCqY&RIP-R6Ou4@Q&RTuJxy%B+{7 z%3 zHxb*l>VcWNrr0|Cz~ihGsGj%H6wUhx=PM*1b1yu|M30Syaiu4v#8y;08qK>1^X&)H}6FBM}%?49Agk!CveZD-GvXbvD9rQZdC-~^!>CbI`(=c1^U*q?1yVR{iQ-=AZqkXuF|Gq>na_$)}6F!;z zzn@+Hpez-IfR!R^0wh&h$M9D9fR9C`VK@Uy^y8|vY;V)Ap*?$9slI~K-yxSWk!93T zpaGCP9V%R5LK!hEt~V=j!*{sh@m#genkNczXR=lKX(pB6qc(tdR+$zY(T2?;1 znlbmCT60ws(p$rBYlhv+N15~hmJv&Y4TK=G)r~*G-A)=va2T>1kzjE2DQRqgw%aJ~$d?mDUjA z-~%RReE}IlDUK2FWMqyd+fVzLeB(Ca`tc5~%lMW;G?ko7$sVe>m|`=tQ?t00Wa<%r z`!2}}1O2``PuxBk&Dk8E<9(AfeHI^FfzR#2!2&0q%U{`>R>Lut;p7SslYP^Av})=6 zQC7(vL9QPWJ-3a!ibZ$gFyy&8Ny*BaDkx|lYL0rAg07;OBO};KaV;sLg*wP@rJ}Ay z+pt1RX4XKr*Jmu^V9H2b@93RwNAKvj9qkf9Q#=0B>-5=!j(+=8Hh{uIqFQde=)UP( zza@M;699)DZHY+5HT;+f(5?&Pt3G6JEU%diZ@_4Oma$ z+y*nc& zdt*Wh->e{AXay{q(2y^U4Z8W6Uu-vBlMC*eIfAKvWX*7B=&;%w&d!dh+cT3Nb zM(TzjhJV@9Y7v~_=h??)>oqnHKYtF+c7==$zRWWvLhuD=X9azf+FixQw6%k@0*s~S zYQ^8ESSM&UHYXFLF>)E{)X`szaiuevp+7^ zwAi1l?6Kl)S!MP%YF_nAm(q{%yyQLk+lgaI-q!oWH;XkCaG{~ z*-P79A7x}I2-$c=A+4j|`1dLbE-94xhs6qxH&fPd(oQO9IDb?-P;pX}3shXzH_fTI zZ<>FXUQ$VPw6i&}9dwCYd+itzxe$5sP5XqF7mJOH4QOe{y(3136MZxp3_9$U@O1UM zgQLN?KN^hr!>b3l(vG{m@pv%NyW{a#4<4u6pIm%)wd2vCqkZImebL~@i_f6j?;mNm z30!!P&#vgpV`23k-3xD-)iqv_V3+O=0LKb$H+Hp7e z=;Os_-tZlCQKE;Zj@C_dJnoOjBR$@C@T|e^J(y1&t(U-{s~`1`2HkOQ5JMvRxIsKZ zuumPWpFm~Mn+ztSquyi`LnZonTc`|@>oOcqCjG&1(u*%m^m)7ch`5?G~Hd_XFUr`cUbuDdg96Bc{EHEfy_t7VC_X}MZ~NE_IjH%6o>OY~WZG$~-8 zlSpF{*1ks$T3OhDYksA4d#1E69_sc?sXbGwC|}z%rRP3Vk_guJd})6i_wD&od%o13 zFTI@eB?rwBad`y&9on>x*L?}&YeP)8Yr%f^uGcoibYDYEW5#PMQTK&vTZ!6A)K;Q? zmlAbNT(7!+D@vdH?6r*wXrlrO1Zf);uuo9|PfU`&Cva+oY2aQi>nH4W;{Ak={O8Bj zT4b*39qokw%|o^Fi!7A6F3^Lil6)T^F1@?ONAz3zLq8F?v6>Ib^kEr7vDam0geL>5 z%*RKsrTU#Qv6N<|GJ$?hbBV^PH2@=N)QW`&!}-i1zGmn$!9t455#v}1Ax5}eu}EW# z;md!+C4$mtWyY#fxTD&Wxcn(WLtK3AvUKmh*2)-`3s8>PriaJ-RJKRwY76ogQ4VPHbdiJ3F$J~s{E zGV&fKlo@9aTa(i;&)6i>P}v9t$S_>&dDsBvy0#X$pv-@yPi%LN4KQ8+1pWy3pCy36 zxouz_yt$v5`V5%FFj*5Bjk#}8Q)gdK9i-o4V@-v1)(Jqw00?|$xn{_lwUX-qkFd?8 z98DI=_y^K4Qtv%u)?27Z?a{I7-Qv0Pm;La!<1g&F^VfJj!HbEiO-$8a^n4#{%AE$6 zVu~!hx$uAHp*Qa<`QH43Ol(fa&5Go2!=z6=u$CNF;C!O?hbQNTLk35{Bu#{jYMR=eN z20b}Rd!1Gx`KZpN1eFvA9l5Xewa$Regkwy^lPlz7Q|(fMYKj$28EV5`Um5liti+S+ zVnu&Tk4twj9I9G(s3eCbmRuJr-DAmS@947GZ;osZnj@RTrpV?}S{qZ{p3hC%?o?|` zGf9Uvre(?3ZA{DZvDKI!k(IPDJt8aB8BRTZV9C|#|u$OX*Eaw&FB^ZDsz z_)#^rJM60iwKvEysXa|ow5~kVG&wCDaz`F&y>72!etLs`XQ=gieYLl{UENSsQfwy_E5f(kit4a*l~TB<-wmJsf}S zEHphF?JO2O9PPA`JS6S3ojfG%tc5%r?JU$h9PKQ&JQVGirE^?d&*c2suXGONt}6G` z-rz8cNx?YhSihd!QHEVj>1av75c6DhaFS~b6F&sYgr`;8j@Erbw-@sKTNOi~1}rs!!No!jv{)?^T=%5T^p3 zFr?yCK$A`dESH?O*EbhrA6J*Rqg(#VoIA4XJgb1H%hWYi4$9#L*)liKKSnv%ckDBa zrticjF7B2gvA)a8kvY8UTe5#Z`OJy_bP%Q3C8I>owSIcy6UQi|B&pL?XEcOZ$!dZMb4D_X(XT6Z zQL>35T2Z3{l{6t*(esHDEJFK;&^|BCrwz4ypEg2t=5cznpiF*npD=$GDE3;BD_~i- zIi{ehEiNgqJ}$Sk;S00V&0Itbdkz>OU{An(&}!g?#<$JCz&xWiUof)3^ml6U0OCf|>9tnHe=f4a!>+}lM><)i_4R=bff}PUrT;)k! zOV_YdfZO1$na$tYj)8A;*r{vUnBQ{o+)N`uaTBJIBIxZAgWhg^K}U>CGe#!+jF1=^ z5hz-$CW+Og%8;7jXHNyMBKGm!HAN2)NwTk?9uto;=50ZchdNhgkA|FW=8}@~;{G?d@Bb-15lq zEFOCks9&J|0QIW{Z}or07DgVv3Qo3jzuBKEeaJUdQ>5zx?%5WK<57)L)FuFR@rtT& ztirLrPRFVZiyUk4ia)PEWrd2|C>ooQL%8^G61v8G&&ZSi3O#=_SFT>cyZ?!mRBj!M zmE}dOOf*L()^YGuAunQ$5v~ufCR-=aY7=z7VQ4iW#bwdz3ZJTq1cSooVJBCy;Iup9 zjdQYfX)kjMRp4KNe+B;C+eP;~`7ZhrBkMef{mpxzGFFn$J%_jvSzm**zXW?;u#?P^ z1OJG0YTn^Y4lRG}*Ax59A&GO-;N4x0HKQ(PpX@2In=IV^7Pp_(j&f(y-`~G|ThH0^ zoz9nU+m_v`>Ce2i*{x22Mk+;nFP|ntv9QJML=D{133KFUTH@Qe6cB@GsONeJ>X$VO)|YEbF_Z|6y0Kgzy#j|59>BDJV0&0%sZMQ zirEi}yj#G;-SDjnuQIS+Eu~aULSv|56=GG~6)3GUYC&9^=$6Vm!w90%@+wZUbn!IH zHOX|F{v_+!TZuAk6>CyubE05XsFa6D#4WBe_|~hFYOUbj_V38M{SewdPKl0{ER<%9 zEM_JUy?{*kW<{Z7$LiZxs*|kMFVUH1mXz-3IXFF-Y_=64;rmE zd&@?|c@$yM#XhCjr>qQY4hyc#M7qp>2{fZp`IEG@c_;>YQI;(rFUrA%?KWK1@}yo- zS8dX3@}p{}y9Xd>ra-E4!O8YNkx75^O-wmOa$PQ0C<~Xr*2VT+{fg7i7rzauv1RMG z9`Fe@EkI}3#Q?b&kZ_;Q1FlakXM)BSHaL+;R4NCEoPalD+qSmhgQ##mJP3P? z0}X6g$#?!7UOrFnSz|Jt6D2;a-%Ltkc9E6Ch&*#q8uar;=@(4(8K)oxW%%&y#?Xf8 zj6Q=D0ifM{93eW3lC@a!J3Z+3&$fX%VQs)_U6^*&59I)@K(2qU5V;n~eSM&=0z{Vu zrdbUwC3Vol$TGCbNGc)#~9A9($4)4sAK$-$+zBHsc92CF)~^?x@ok|O@q_L780+^+iq*EaJ-FDHD7Y{%q2|QQnRK6< z25=d94-?9avxlw8X_#khl4+=HgaTw3F7`ZZ0CQbi3tWFtX3{6NJI4kXF8~66g!|7D zK;Yaqunykb&rE#=Ok$XuZ?Una!aC~&AYuRnKC@giib%00M zW>StO3uXKR=@_Z^o-yk!RHXLkSoLo4-1*CX_}lRp_T2evJfGmjMAasy>Mwe}k2U2^ zgG(_*7T$kcc=OPkD{{U!zaSHv({ZyR`P(q*Qx7cXHZRP+mvXq9>bRV4#Az+NG_)BJ#rF1Heb(2S6=wn$KbDTNd|6Gq&$C&toEJUMuy=8CydS>p&V)IXFRuA zI~7?QNboayNG5z7U0qSrGJl}3zvLj#2)W3zuw{C4c-BcLeH>i{8Q&uhrzk8X*hvu{ zsDnXIPSRedRY*Rnb16Y3#X(2zt9`9AU^C$u6Y=B<`Pfvul%SeoMN@{_u-8|Hy#y=q zBve`SjZ1$TYn}g=a=CCQUxs=w%RJZ4IleRn6 z8q-YDVU1~7@^u^2vV3ecrblEYZA_2IN_EDRQ#PwMru?#5k1^e86w=1@h^(ZI>Csrp z8dGHtW16w%hef7)kmon1y^h@LD19}@=_pE9>nm~rGqPNYozr}N zdKrFHP3;c*>Ok!ca!hJZ(-f^M4>e6rONZQ%hgz@OtC*kOpx+s4{a#<~?QU217t_7$ zY9(S?)~+5xOw)$-*kYQtuE!PAn2DVP2QhQ(Ye&`w-F`1+{G+rAEx(*&Vh>3>Yg~U1 zM>`8m4@WzTMGr?iZ6ps#J8dTqNjqyH4@Wx-H4jHSi!BdDJ7(z|7uPd6fA%Y#1G%fp zJ+(JD%wke7&N8bd`^xqW57e(6;lF>UG*(*$@G7PTo-D=ez8sKTN?ON;6g_LnfFP1t)Crvk*O zfF}&8I2F*OQvu5*=k4{)1=+{d^jdXAnG!8jg^CPctN(z4fKyu&h;Jp z45R5g@rjGOWk{^=@^WMj@A`k1EKojkqCXu(DR#*y(Q~bzp7_Ku3Mok{IUEVWeava_ zM(9iRPfG6j%LIy1su)jOw*)lUE#-xTK~OvSVGusscla`lki!`bAy%@Qpu(JyjAHcb zid~d!qKH=1s6Zu6h*tD`;slG(J|eWwOY>=(lJC<-h|WAtZx)ov5AJ^x#sbA&D{=)a z>o&&}RJFw=<<-aKmR7vh65c0|yMpkjnM|c(qz0@R?dO{dWL4_*sJSm^X5<+ zB6(j!GnAS1#M+Sab=7~`gGO*|s&aSL0_ApX9eds-_PkJl zYv~$x3UC{|HM99!+cEHM4m)*C8}nN(o||bTC~m?uQUtv{V$j>IFX)JoX~xK8pAixx zBLYQ>)g-Z+R2dTPcgrH-tOMso!b+t`SOQLWT{5Ec2O_3rp#a->dqZXAa8Oyvfy%6b z0xmZ~>jhkX<*t8Uz~yH!G6F6)b!57Qz9-Ldm)lc;{~?zA-^=$io&0Nte|!5DCbv8? zJd4NP1nL*4KS2G1g17p=VhbY=Uj--Ix!>$hl|JMfswvWS0rzYR#qp>{DQXjdx_CuZ zI9B0UU#DXo_KO^A@QOdLKV^lA+$b8Gkwduna1y%4e9x2p3O;}HR<4d*@a}(NC6!yp zVr6*|D-+F;iFF)2Rmh82V}$F&tI5_0wAuvSZx~ulNO4)Ty27WbBEg{WdDzKSEI93s zc;lRGUE0f>LKXN|;9r4%_jb{pVZMvL#K<}iVt?}@UHd7wjan z=b4cRcG?RAhzs2omwWHkG^!N8~-_~>X ze5do}+qPx5YWg#8ZFZ|u;J9PqxKjI^8^=-7EUx!pDjE!igQ~2L(-v=t^NnY`8+b}q zxzHj&xd7$Q8I-H?Q=pvpY-g+_e-sRs8sXGmeY!J_uI+zxX0mZ&$*fVj*#zvI72@ZJ zCWWUHp6;c2I;|ky6Eo=}7w^6TwJBW5BGi6cM@fe2bc2az$5)huH*AFdHo+Udf|Vq( zwj%b(1V|Aer5cdZEePP1aJak7$Tx*|o0M<7{ciK}4gG^)5-~e(oT@efkK{`8bA%+q z_X*$k(tLkkuOPnNZh`Igk7!p{D7&X(*nKi@aVjpK1jarE>)>`II?^4BSjV)$Fg-N3 z7;O=)?v+HV>+}nv)m>uxGYO=DTW?kci-6+TwyiCf3N{t&d$AzF%9hIo8-jD>-gUBv!rxK&%x=zWV5XZ3ExA)6}gk#4I2TcllTo( zf3la36s6#5QFuZ)*wy6Jo><9U-}1U54l)dEykAg!K@9w`zGJld5>$U_{=mWAqTKT! z-5rCw$M~;n!zI~8;!cs+c`5ZSSVk@Cdm2pEWObnJ`asx|7l<-yTw_a=Dw>hK8T8@~ z=wxr%h&YcTEV|gI6#JBwflaO8%1orof1E%wDwRJ;TbqYspciG?0`j69T-a{IRV`2I z6?N4ny(T}ZcDj22f`$rYx8P*^pU9-Y`6i~EBDpS?E0l%HU+ZG~u71Vo=ZoKl)Y!81 zTMzhzniill>|%gi3`n?7=K -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - all -- reports the resource usage for all currently active scopes. - + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. OPTIONS: --help, -h show help (default: false) @@ -1524,16 +1523,15 @@ USAGE: DESCRIPTION: Get or set resource limits for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - The limit is json-formatted, with the same structure as the limits file. - + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. OPTIONS: --set set the limit for a scope (default: false) diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index f230e61894c..3dd7043bddc 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2869,15 +2869,14 @@ USAGE: DESCRIPTION: Report resource usage for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - all -- reports the resource usage for all currently active scopes. - + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + - all -- reports the resource usage for all currently active scopes. OPTIONS: --help, -h show help (default: false) @@ -2894,16 +2893,15 @@ USAGE: DESCRIPTION: Get or set resource limits for a scope. - - The scope can be one of the following: - - system -- reports the system aggregate resource usage. - - transient -- reports the transient resource usage. - - svc: -- reports the resource usage of a specific service. - - proto: -- reports the resource usage of a specific protocol. - - peer: -- reports the resource usage of a specific peer. - - The limit is json-formatted, with the same structure as the limits file. - + + The scope can be one of the following: + - system -- reports the system aggregate resource usage. + - transient -- reports the transient resource usage. + - svc: -- reports the resource usage of a specific service. + - proto: -- reports the resource usage of a specific protocol. + - peer: -- reports the resource usage of a specific peer. + + The limit is json-formatted, with the same structure as the limits file. OPTIONS: --set set the limit for a scope (default: false) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index e1fbd29b4cb..2e9638fabb3 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -262,7 +262,7 @@ #LinkCacheSize = 1024 # env var: LOTUS_INDEXERPROVIDER_LINKEDCHUNKSIZE - #LinkedChunkSize = 100 + #LinkedChunkSize = 16384 # env var: LOTUS_INDEXERPROVIDER_PUBSUBTOPIC #PubSubTopic = "indexer/ingest" diff --git a/go.mod b/go.mod index 1761efe1483..5806599737a 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.4.4 + github.com/filecoin-project/dagstore v0.5.2-0.20220120115845-e07b050f48d3 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 @@ -36,7 +36,8 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.0 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220120121729-eb2fe1f4df58 + github.com/filecoin-project/go-indexer-core v0.2.7 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 @@ -44,6 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 + github.com/filecoin-project/index-provider v0.2.1 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 @@ -77,7 +79,7 @@ require ( github.com/ipfs/go-ds-badger2 v0.1.2 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 - github.com/ipfs/go-fs-lock v0.0.6 + github.com/ipfs/go-fs-lock v0.0.7 github.com/ipfs/go-graphsync v0.12.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 github.com/ipfs/go-ipfs-blocksutil v0.0.1 @@ -96,9 +98,9 @@ require ( github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 - github.com/ipfs/go-path v0.0.7 + github.com/ipfs/go-path v0.2.1 github.com/ipfs/go-unixfs v0.3.1 - github.com/ipfs/interface-go-ipfs-core v0.4.0 + github.com/ipfs/interface-go-ipfs-core v0.5.2 github.com/ipld/go-car v0.3.3 github.com/ipld/go-car/v2 v2.1.1 github.com/ipld/go-codec-dagpb v1.3.0 @@ -143,9 +145,9 @@ require ( github.com/stretchr/testify v1.7.0 github.com/syndtr/goleveldb v1.0.0 github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect - github.com/urfave/cli/v2 v2.2.0 + github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 + github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 @@ -155,8 +157,7 @@ require ( go.opentelemetry.io/otel/bridge/opencensus v0.25.0 go.opentelemetry.io/otel/exporters/jaeger v1.2.0 go.opentelemetry.io/otel/sdk v1.2.0 - go.uber.org/dig v1.10.0 // indirect - go.uber.org/fx v1.9.0 + go.uber.org/fx v1.15.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect @@ -174,3 +175,5 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors + +replace github.com/ipfs/go-path => github.com/ipfs/go-path v0.0.7 diff --git a/go.sum b/go.sum index 5615223b234..aec106a7694 100644 --- a/go.sum +++ b/go.sum @@ -1,3 +1,4 @@ +bazil.org/fuse v0.0.0-20200117225306-7b5117fecadc/go.mod h1:FbcW6z/2VytnFDhZfumh8Ss8zxHE6qpMP5sHTRe0EaM= cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.31.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= @@ -87,6 +88,7 @@ github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/akavel/rsrc v0.8.0 h1:zjWn7ukO9Kc5Q62DOJCcxGpXC18RawVtYAGdz2aLlfw= github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= +github.com/akrylysov/pogreb v0.10.1/go.mod h1:pNs6QmpQ1UlTJKDezuRWmaqkgUE2TuU0YTWyqJZ7+lI= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921 h1:T3+cD5fYvuH36h7EZq+TDpm+d8a6FSD4pQsbmuGGQ8o= github.com/alecthomas/jsonschema v0.0.0-20200530073317-71f438968921/go.mod h1:/n6+1/DWPltRLWL/VKyUxg6tzsl5kHUCcraimt4vr60= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -96,6 +98,7 @@ github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRF github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a h1:E/8AP5dFtMhl5KPJz66Kt9G0n+7Sn41Fy1wv9/jHOrc= github.com/alecthomas/units v0.0.0-20210927113745-59d0afb8317a/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexbrainman/goissue34681 v0.0.0-20191006012335-3fc7a47baff5/go.mod h1:Y2QMoi1vgtOIfc+6DhrMOGkLoGzqSV2rKp4Sm+opsyA= github.com/anmitsu/go-shlex v0.0.0-20161002113705-648efa622239/go.mod h1:2FmKhYUyUczH0OGQWaF5ceTx0UBShxjsH6f8oGKYe2c= github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY= github.com/apache/thrift v0.12.0/go.mod h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ= @@ -129,6 +132,7 @@ github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6r github.com/bep/debounce v1.2.0 h1:wXds8Kq8qRfwAOpAxHrJDbCXgC5aHSzgQb/0gKsHQqo= github.com/bep/debounce v1.2.0/go.mod h1:H8yggRPQKLUhUoqrJC1bO2xNya7vanpDl7xR3ISbCJ0= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= +github.com/blang/semver/v4 v4.0.0/go.mod h1:IbckMUScFkM3pff0VJDNKRiT6TG/YpiHIM2yvyW5YoQ= github.com/bradfitz/go-smtpd v0.0.0-20170404230938-deb6d6237625/go.mod h1:HYsPBTaaSFSlLx/70C2HPIMNZpVV8+vt/A+FMnYP11g= github.com/briandowns/spinner v1.11.1/go.mod h1:QOuQk7x+EaDASo80FEXwlwiA+j/PPIcX3FScO+3/ZPQ= github.com/btcsuite/btcd v0.0.0-20190213025234-306aecffea32/go.mod h1:DrZx5ec/dmnfpw9KyYoQyYo7d0KEvTkk/5M/vbZjAr8= @@ -159,6 +163,7 @@ github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRt github.com/cenkalti/backoff v2.2.1+incompatible/go.mod h1:90ReRw6GdpyfrHakVjL/QHaoyV4aDUVVkXQJJJ3NXXM= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/ceramicnetwork/go-dag-jose v0.1.0/go.mod h1:qYA1nYt0X8u4XoMAVoOV3upUVKtrxy/I670Dg5F0wjI= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -166,6 +171,7 @@ github.com/cespare/xxhash/v2 v2.1.2 h1:YRXhKfTDauu4ajMg1TPgFO5jnlC2HCbmLXMcTG5cb github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= github.com/cheekybits/genny v1.0.0 h1:uGGa4nei+j20rOSeDeP5Of12XVm7TGUd4dJA9RDitfE= github.com/cheekybits/genny v1.0.0/go.mod h1:+tQajlRqAUrPI7DOSpB0XAqZYtQakVtB7wXkRAgjxjQ= +github.com/cheggaaa/pb v1.0.29/go.mod h1:W40334L7FMC5JKWldsTWbdGjLo0RxUKK73K+TuPxX30= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= @@ -198,6 +204,7 @@ github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7 github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf h1:iW4rZ826su+pqaw19uhpSCzhj44qo35pNgKFGqzDKkU= github.com/coreos/go-systemd v0.0.0-20191104093116-d3cd4ed1dbcf/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= +github.com/coreos/go-systemd/v22 v22.0.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.1.0/go.mod h1:xO0FLkIi5MaZafQlIrOotqXZ90ih+1atmu1JpKERPPk= github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= @@ -269,6 +276,7 @@ github.com/elastic/go-windows v1.0.0/go.mod h1:TsU0Nrp7/y3+VwE82FoZF8gC/XFg/Elz6 github.com/elastic/gosigar v0.12.0/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= github.com/elastic/gosigar v0.14.1 h1:T0aQ7n/n2ZA9W7DmAnj60v+qzqKERdBgJBO1CG2W6rc= github.com/elastic/gosigar v0.14.1/go.mod h1:iXRIGg2tLnu7LBdpqzyQfGDEidKCfWcCMS0WKyPWoMs= +github.com/elgris/jsondiff v0.0.0-20160530203242-765b5c24c302/go.mod h1:qBlWZqWeVx9BjvqBsnC/8RUlAYpIFmPvgROcw0n1scE= github.com/ema/qdisc v0.0.0-20190904071900-b82c76788043/go.mod h1:ix4kG2zvdUd8kEKSW0ZTr1XLks0epFpI4j745DXxlNE= github.com/envoyproxy/go-control-plane v0.6.9/go.mod h1:SBwIajubJHhxtWwsL9s8ss4safvEdbitLhGGK48rN6g= github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= @@ -290,9 +298,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.4.3-0.20211211192320-72b849e131d2/go.mod h1:tlV8C11UljvFq3WWlMh2oMViEaVaPb6uT8eL/YQgDfk= -github.com/filecoin-project/dagstore v0.4.4 h1:luolWahhzp3ulRsapGKE7raoLE3n2cFkQUJjPyqUmF4= -github.com/filecoin-project/dagstore v0.4.4/go.mod h1:7BlOvaTJrFJ1Qemt5jHlLJ4VhDIuSIzGS0IwO/0AXPA= +github.com/filecoin-project/dagstore v0.5.2-0.20220120115845-e07b050f48d3 h1:kuZsRFDjyrDAgoHNolJBnO7xX1EETHdJ090sgD3Al5E= +github.com/filecoin-project/dagstore v0.5.2-0.20220120115845-e07b050f48d3/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -316,9 +323,14 @@ github.com/filecoin-project/go-commp-utils v0.1.3/go.mod h1:3ENlD1pZySaUout0p9AN github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= +github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= +github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= +github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= +github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= +github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -327,8 +339,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.0 h1:kap2q2wTM6tfkVO5gMA5DD9GUeTvkDhMfhjCtEwMDM8= -github.com/filecoin-project/go-fil-markets v1.19.0/go.mod h1:qsb3apmo4RSJYCEq40QxVdU7UZospN6nFJLOBHuaIbc= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220120121729-eb2fe1f4df58 h1:NHX4FXQQQ9dVhQBBM1BThVbYmN3EnM4Dxzvz0DYTOTk= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220120121729-eb2fe1f4df58/go.mod h1:SmDIzoUwFlej6Ac5ilBMyBImTj/TrmJmZ6wh/ILMfuI= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -336,8 +348,14 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= +github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= +github.com/filecoin-project/go-indexer-core v0.2.7 h1:D0egR6Q3Jkp5r4klxkdDQvjXeLx3cwZMKE55qop2xCI= +github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitviL7h1fksIU6a4j52yPnA/E1PU= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= +github.com/filecoin-project/go-legs v0.2.1/go.mod h1:iHDfdqieReblkLoHneB68wvthFtNKB+wkeEWKtiJESk= +github.com/filecoin-project/go-legs v0.2.2 h1:tCCqiXpXw8219/l191phtp7BZbssm7hJcnFFTESs2NI= +github.com/filecoin-project/go-legs v0.2.2/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -361,6 +379,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= +github.com/filecoin-project/index-provider v0.2.1 h1:jM0ZxEsJhx4WmGgFBtC2ctk2pvu50Rd/LBNNNOcWbQQ= +github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -384,9 +404,13 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsG github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= +github.com/filecoin-project/storetheindex v0.2.2/go.mod h1:05vxs5u3vTQFAwGW9+pgWSMc3BgFOK513nPyIQyLwyQ= +github.com/filecoin-project/storetheindex v0.2.3 h1:YXA1qWQv/tRzvuqcPUt4kQbIgxFdKP32SPjWTefhOGw= +github.com/filecoin-project/storetheindex v0.2.3/go.mod h1:US7ddOKCI+KQFcC3ipKuhK3i46EYlSCt5EvPhxBLfWI= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= +github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= github.com/flynn/noise v1.0.0 h1:DlTHqmzmvcEiKj+4RYo/imoswx/4r6iBlCMfVtrMXpQ= github.com/flynn/noise v1.0.0/go.mod h1:xbMo+0i6+IGbYdJhF31t2eR1BIU0CYc12+BNAKwUTag= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= @@ -399,8 +423,14 @@ github.com/frankban/quicktest v1.11.3/go.mod h1:wRf/ReqHper53s+kmmSZizM8NamnL3IM github.com/frankban/quicktest v1.14.0 h1:+cqqvzZV87b4adx/5ayVOaYZ2CrvM4ejQvUdBzPPUss= github.com/frankban/quicktest v1.14.0/go.mod h1:NeW+ay9A/U67EYXNFA1nPE8e/tnQv/09mUdL/ijj8og= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= -github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.1 h1:mZcQUHVQUQWoPXXtuf9yuEXKudkV2sx1E06UadKWpgI= +github.com/fsnotify/fsnotify v1.5.1/go.mod h1:T3375wBYaZdLLcVNkcVbzGHY7f1l/uK5T5Ai1i3InKU= +github.com/gabriel-vasile/mimetype v1.4.0/go.mod h1:fA8fi6KUiG7MgQQ+mEWotXoEOvmxRtOJlERCzSmRvr8= +github.com/gammazero/keymutex v0.0.2 h1:cmpLBJHdEwn+WlR5Z/o9/BN92znSZTp5AKPQDpu1QcI= +github.com/gammazero/keymutex v0.0.2/go.mod h1:qtzWCCLMisQUmVa4dvqHVgwfh4BP2YB7JxNDGXnsKrs= +github.com/gammazero/radixtree v0.2.5 h1:muPQ4eEgCkUymFWPiVQRuXOQv4IhWg8YXH2r71MoqPM= +github.com/gammazero/radixtree v0.2.5/go.mod h1:VPqqCDZ3YZZxAzUUsIF/ytFBigVWV7JIV1Stld8hri0= github.com/gbrlsnchs/jwt/v3 v3.0.1 h1:lbUmgAKpxnClrKloyIwpxm4OuWeDl5wLk52G91ODPw4= github.com/gbrlsnchs/jwt/v3 v3.0.1/go.mod h1:AncDcjXz18xetI3A6STfXq2w+LuTx8pQ8bGEwRN8zVM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= @@ -409,6 +439,7 @@ github.com/gdamore/tcell/v2 v2.2.0 h1:vSyEgKwraXPSOkvCk7IwOSyX+Pv3V2cV9CikJMXg4U github.com/gdamore/tcell/v2 v2.2.0/go.mod h1:cTTuF84Dlj/RqmaCIV5p4w8uG1zWdk0SF6oBpwHp4fU= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= github.com/gliderlabs/ssh v0.1.1/go.mod h1:U7qILu1NlMHj9FlMhZLlkCdDnU1DBEAqr0aevW3Awn0= +github.com/go-bindata/go-bindata/v3 v3.1.3/go.mod h1:1/zrpXsLD8YDIbhZRqXzm1Ghc7NhEvIN9+Z6R5/xH4I= github.com/go-check/check v0.0.0-20180628173108-788fd7840127/go.mod h1:9ES+weclKsC9YodN5RgxqK/VD9HM9JsCSh7rNhMZE98= github.com/go-errors/errors v1.0.1/go.mod h1:f4zRHt4oKfwPJE5k8C9vpYG+aDHdBFUsgrm6/TyX73Q= github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU= @@ -665,6 +696,8 @@ github.com/ipfs/go-bitfield v1.0.0/go.mod h1:N/UiujQy+K+ceU1EF5EkVd1TNqevLrCQMIc github.com/ipfs/go-bitswap v0.0.9/go.mod h1:kAPf5qgn2W2DrgAcscZ3HrM9qh4pH+X8Fkk3UPrwvis= github.com/ipfs/go-bitswap v0.1.0/go.mod h1:FFJEf18E9izuCqUtHxbWEvq+reg7o4CW5wSAE1wsxj0= github.com/ipfs/go-bitswap v0.1.2/go.mod h1:qxSWS4NXGs7jQ6zQvoPY3+NmOfHHG47mhkiLzBpJQIs= +github.com/ipfs/go-bitswap v0.1.8/go.mod h1:TOWoxllhccevbWFUR2N7B1MTSVVge1s6XSMiCSA4MzM= +github.com/ipfs/go-bitswap v0.3.4/go.mod h1:4T7fvNv/LmOys+21tnLzGKncMeeXUYUd1nUiJ2teMvI= github.com/ipfs/go-bitswap v0.5.1 h1:721YAEDBnLIrvcIMkCHCdqp34hA8jwL9yKMkyJpSpco= github.com/ipfs/go-bitswap v0.5.1/go.mod h1:P+ckC87ri1xFLvk74NlXdP0Kj9RmWAh4+H78sC6Qopo= github.com/ipfs/go-block-format v0.0.1/go.mod h1:DK/YYcsSUIVAFNwo/KZCdIIbpN0ROH/baNLgayt4pFc= @@ -673,6 +706,9 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= +github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= +github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= github.com/ipfs/go-blockservice v0.2.1/go.mod h1:k6SiwmgyYgs4M/qt+ww6amPeUH9EISLRBnvUurKJhi8= github.com/ipfs/go-cid v0.0.1/go.mod h1:GHWU/WuQdMPmIosc4Yn1bcCT7dSeX4lBafM7iqUPQvM= @@ -695,8 +731,11 @@ github.com/ipfs/go-datastore v0.1.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRV github.com/ipfs/go-datastore v0.3.1/go.mod h1:w38XXW9kVFNp57Zj5knbKWM2T+KOZCGDRVNdgPHtbHw= github.com/ipfs/go-datastore v0.4.0/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= +github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= +github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= +github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= @@ -707,11 +746,13 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= +github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= github.com/ipfs/go-ds-badger2 v0.1.2 h1:sQc2q1gaXrv8YFNeUtxil0neuyDf9hnVHfLsi7lpXfE= github.com/ipfs/go-ds-badger2 v0.1.2/go.mod h1:3FtQmDv6fMubygEfU43bsFelYpIiXX/XEYA54l9eCwg= +github.com/ipfs/go-ds-flatfs v0.5.1/go.mod h1:RWTV7oZD/yZYBKdbVIFXTX2fdY2Tbvl94NsWqmoyAX4= github.com/ipfs/go-ds-leveldb v0.0.1/go.mod h1:feO8V3kubwsEF22n0YRQCffeb79OOYIykR4L04tMOYc= github.com/ipfs/go-ds-leveldb v0.1.0/go.mod h1:hqAW8y4bwX5LWcCtku2rFNX3vjDZCy5LZCg+cSZvYb8= github.com/ipfs/go-ds-leveldb v0.4.1/go.mod h1:jpbku/YqBSsBc1qgME8BkWS4AxzF2cEu1Ii2r79Hh9s= @@ -720,15 +761,29 @@ github.com/ipfs/go-ds-leveldb v0.5.0 h1:s++MEBbD3ZKc9/8/njrn4flZLnCuY9I79v94gBUN github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82lquxrVbml/Q= github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= +github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= +github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= +github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vcWm2DJfxc8= -github.com/ipfs/go-fs-lock v0.0.6 h1:sn3TWwNVQqSeNjlWy6zQ1uUGAZrV3hPOyEA6y1/N2a0= github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= +github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= +github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= +github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= +github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= +github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= +github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= github.com/ipfs/go-ipfs-blockstore v0.0.1/go.mod h1:d3WClOmRQKFnJ0Jz/jj/zmksX0ma1gROTlovZKBmN08= github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2IsfTduLl+422H6Rqw= +github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= +github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= +github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= +github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= +github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= +github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= @@ -737,15 +792,18 @@ github.com/ipfs/go-ipfs-blocksutil v0.0.1/go.mod h1:Yq4M86uIOmxmGPUHv/uI7uKqZNtL github.com/ipfs/go-ipfs-chunker v0.0.1/go.mod h1:tWewYK0we3+rMbOh7pPFGDyypCtvGcBFymgY4rSDLAw= github.com/ipfs/go-ipfs-chunker v0.0.5 h1:ojCf7HV/m+uS2vhUGWcogIIxiO5ubl5O57Q7NapWLY8= github.com/ipfs/go-ipfs-chunker v0.0.5/go.mod h1:jhgdF8vxRHycr00k13FM8Y0E+6BoalYeobXmUyTreP8= -github.com/ipfs/go-ipfs-cmds v0.3.0 h1:mi9oYrSCox5aBhutqAYqw6/9crlyGbw4E/aJtwS4zI4= github.com/ipfs/go-ipfs-cmds v0.3.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= -github.com/ipfs/go-ipfs-config v0.5.3 h1:3GpI/xR9FoJNTjU6YvCMRbYyEi0dBVY5UtlUTcNRlSA= +github.com/ipfs/go-ipfs-cmds v0.6.0 h1:yAxdowQZzoFKjcLI08sXVNnqVj3jnABbf9smrPQmBsw= +github.com/ipfs/go-ipfs-cmds v0.6.0/go.mod h1:ZgYiWVnCk43ChwoH8hAmI1IRbuVtq3GSTHwtRB/Kqhk= github.com/ipfs/go-ipfs-config v0.5.3/go.mod h1:nSLCFtlaL+2rbl3F+9D4gQZQbT1LjRKx7TJg/IHz6oM= +github.com/ipfs/go-ipfs-config v0.18.0 h1:Ta1aNGNEq6RIvzbw7dqzCVZJKb7j+Dd35JFnAOCpT8g= +github.com/ipfs/go-ipfs-config v0.18.0/go.mod h1:wz2lKzOjgJeYJa6zx8W9VT7mz+iSd0laBMqS/9wmX6A= github.com/ipfs/go-ipfs-delay v0.0.0-20181109222059-70721b86a9a8/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-delay v0.0.1 h1:r/UXYyRcddO6thwOnhiznIAiSvxMECGgtv35Xs1IeRQ= github.com/ipfs/go-ipfs-delay v0.0.1/go.mod h1:8SP1YXK1M1kXuc4KJZINY3TQQ03J2rwBG9QfXmbRPrw= github.com/ipfs/go-ipfs-ds-help v0.0.1/go.mod h1:gtP9xRaZXqIQRh1HRpp595KbBEdgqWFxefeVKOV8sxo= github.com/ipfs/go-ipfs-ds-help v0.1.1/go.mod h1:SbBafGJuGsPI/QL3j9Fc5YPLeAu+SzOkI0gFwAg+mOs= +github.com/ipfs/go-ipfs-ds-help v1.0.0/go.mod h1:ujAbkeIgkKAWtxxNkoZHWLCyk5JpPoKnGyCcsoF6ueE= github.com/ipfs/go-ipfs-ds-help v1.1.0 h1:yLE2w9RAsl31LtfMt91tRZcrx+e61O5mDxFRR994w4Q= github.com/ipfs/go-ipfs-ds-help v1.1.0/go.mod h1:YR5+6EaebOhfcqVCyqemItCLthrpVNot+rsOU/5IatU= github.com/ipfs/go-ipfs-exchange-interface v0.0.1/go.mod h1:c8MwfHjtQjPoDyiy9cFquVtVHkO9b9Ob3FG91qJnWCM= @@ -761,11 +819,14 @@ github.com/ipfs/go-ipfs-files v0.0.9 h1:OFyOfmuVDu9c5YtjSDORmwXzE6fmZikzZpzsnNkg github.com/ipfs/go-ipfs-files v0.0.9/go.mod h1:aFv2uQ/qxWpL/6lidWvnSQmaVqCrf0TBGoUr+C1Fo84= github.com/ipfs/go-ipfs-http-client v0.0.6 h1:k2QllZyP7Fz5hMgsX5hvHfn1WPG9Ngdy5WknQ7JNhBM= github.com/ipfs/go-ipfs-http-client v0.0.6/go.mod h1:8e2dQbntMZKxLfny+tyXJ7bJHZFERp/2vyzZdvkeLMc= +github.com/ipfs/go-ipfs-keystore v0.0.2/go.mod h1:H49tRmibOEs7gLMgbOsjC4dqh1u5e0R/SWuc2ScfgSo= +github.com/ipfs/go-ipfs-pinner v0.2.1/go.mod h1:l1AtLL5bovb7opnG77sh4Y10waINz3Y1ni6CvTzx7oo= github.com/ipfs/go-ipfs-posinfo v0.0.1 h1:Esoxj+1JgSjX0+ylc0hUmJCOv6V2vFoZiETLR6OtpRs= github.com/ipfs/go-ipfs-posinfo v0.0.1/go.mod h1:SwyeVP+jCwiDu0C313l/8jg6ZxM0qqtlt2a0vILTc1A= github.com/ipfs/go-ipfs-pq v0.0.1/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= github.com/ipfs/go-ipfs-pq v0.0.2 h1:e1vOOW6MuOwG2lqxcLA+wEn93i/9laCY8sXAw76jFOY= github.com/ipfs/go-ipfs-pq v0.0.2/go.mod h1:LWIqQpqfRG3fNc5XsnIhz/wQ2XXGyugQwls7BgUmUfY= +github.com/ipfs/go-ipfs-provider v0.7.1/go.mod h1:QwdDYRYnC5sYGLlOwVDY/0ZB6T3zcMtu+5+GdGeUuw8= github.com/ipfs/go-ipfs-routing v0.0.1/go.mod h1:k76lf20iKFxQTjcJokbPM9iBXVXVZhcOwc360N4nuKs= github.com/ipfs/go-ipfs-routing v0.1.0/go.mod h1:hYoUkJLyAUKhF58tysKpids8RNDPO42BVMgK5dNsoqY= github.com/ipfs/go-ipfs-routing v0.2.1 h1:E+whHWhJkdN9YeoHZNj5itzc+OR292AJ2uE9FFiW0BY= @@ -784,6 +845,7 @@ github.com/ipfs/go-ipld-format v0.0.1/go.mod h1:kyJtbkDALmFHv3QR6et67i35QzO3S0dC github.com/ipfs/go-ipld-format v0.0.2/go.mod h1:4B6+FM2u9OJ9zCV+kSbgFAZlOrv1Hqbf0INGQgiKf9k= github.com/ipfs/go-ipld-format v0.2.0 h1:xGlJKkArkmBvowr+GMCX0FEZtkro71K1AwiKnL37mwA= github.com/ipfs/go-ipld-format v0.2.0/go.mod h1:3l3C1uKoadTPbeNfrDi+xMInYKlx2Cvg1BuydPSdzQs= +github.com/ipfs/go-ipld-git v0.1.1/go.mod h1:+VyMqF5lMcJh4rwEppV0e6g4nCCHXThLYYDpKUkJubI= github.com/ipfs/go-ipld-legacy v0.1.0/go.mod h1:86f5P/srAmh9GcIcWQR9lfFLZPrIyyXQeVlOWeeWEuI= github.com/ipfs/go-ipld-legacy v0.1.1 h1:BvD8PEuqwBHLTKqlGFTHSwrwFOMkVESEvwIYwR2cdcc= github.com/ipfs/go-ipld-legacy v0.1.1/go.mod h1:8AyKFCjgRPsQFf15ZQgDB8Din4DML/fOmKZkkFkrIEg= @@ -814,39 +876,49 @@ github.com/ipfs/go-merkledag v0.0.6/go.mod h1:QYPdnlvkOg7GnQRofu9XZimC5ZW5Wi3bKy github.com/ipfs/go-merkledag v0.2.3/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.2.4/go.mod h1:SQiXrtSts3KGNmgOzMICy5c0POOpUNQLvB3ClKnBAlk= github.com/ipfs/go-merkledag v0.3.2/go.mod h1:fvkZNNZixVW6cKSZ/JfLlON5OlgTXNdRLz0p6QG/I2M= +github.com/ipfs/go-merkledag v0.4.0/go.mod h1:XshXBkhyeS63YNGisLL1uDSfuTyrQIxVUOg3ojR5MOE= github.com/ipfs/go-merkledag v0.5.1 h1:tr17GPP5XtPhvPPiWtu20tSGZiZDuTaJRXBLcr79Umk= github.com/ipfs/go-merkledag v0.5.1/go.mod h1:cLMZXx8J08idkp5+id62iVftUQV+HlYJ3PIhDfZsjA4= github.com/ipfs/go-metrics-interface v0.0.1 h1:j+cpbjYvu4R8zbleSs36gvB7jR+wsL2fGD6n0jO4kdg= github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j/b/tL7HTWtJ4VPgWY= github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZaGVF1CUVdE+s= github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= +github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= +github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= +github.com/ipfs/go-peertaskqueue v0.2.0/go.mod h1:5/eNrBEbtSKWCG+kQK8K8fGNixoYUnr+P7jivavs9lY= github.com/ipfs/go-peertaskqueue v0.7.0/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= github.com/ipfs/go-peertaskqueue v0.7.1 h1:7PLjon3RZwRQMgOTvYccZ+mjzkmds/7YzSWKFlBAypE= github.com/ipfs/go-peertaskqueue v0.7.1/go.mod h1:M/akTIE/z1jGNXMU7kFB4TeSEFvj68ow0Rrb04donIU= +github.com/ipfs/go-pinning-service-http-client v0.1.0/go.mod h1:tcCKmlkWWH9JUUkKs8CrOZBanacNc1dmKLfjlyXAMu4= github.com/ipfs/go-todocounter v0.0.1/go.mod h1:l5aErvQc8qKE2r7NDMjmq5UNAvuZy0rC8BHOplkWvZ4= github.com/ipfs/go-unixfs v0.2.2-0.20190827150610-868af2e9e5cb/go.mod h1:IwAAgul1UQIcNZzKPYZWOCijryFBeCV79cNubPzol+k= github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMUdqcbYw= +github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= +github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-unixfsnode v1.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= github.com/ipfs/go-verifcid v0.0.1 h1:m2HI7zIuR5TFyQ1b79Da5N9dnnCP1vcu2QqawmWlK2E= github.com/ipfs/go-verifcid v0.0.1/go.mod h1:5Hrva5KBeIog4A+UpqlaIU+DEstipcJYQQZc0g37pY0= -github.com/ipfs/interface-go-ipfs-core v0.4.0 h1:+mUiamyHIwedqP8ZgbCIwpy40oX7QcXUbo4CZOeJVJg= github.com/ipfs/interface-go-ipfs-core v0.4.0/go.mod h1:UJBcU6iNennuI05amq3FQ7g0JHUkibHFAfhfUIy927o= +github.com/ipfs/interface-go-ipfs-core v0.5.2 h1:m1/5U+WpOK2ZE7Qzs5iIu80QM1ZA3aWYi2Ilwpi+tdg= +github.com/ipfs/interface-go-ipfs-core v0.5.2/go.mod h1:lNBJrdXHtWS46evMPBdWtDQMDsrKcGbxCOGoKLkztOE= github.com/ipfs/iptb v1.4.0 h1:YFYTrCkLMRwk/35IMyC6+yjoQSHTEcNcefBStLJzgvo= github.com/ipfs/iptb v1.4.0/go.mod h1:1rzHpCYtNp87/+hTxG5TfCVn/yMY3dKnLn8tBiMfdmg= github.com/ipfs/iptb-plugins v0.3.0 h1:C1rpq1o5lUZtaAOkLIox5akh6ba4uk/3RwWc6ttVxw0= github.com/ipfs/iptb-plugins v0.3.0/go.mod h1:5QtOvckeIw4bY86gSH4fgh3p3gCSMn3FmIKr4gaBncA= +github.com/ipfs/tar-utils v0.0.2/go.mod h1:4qlnRWgTVljIMhSG2SqRYn66NT+3wrv/kZt9V+eqxDM= github.com/ipld/go-car v0.1.0/go.mod h1:RCWzaUh2i4mOEkB3W45Vc+9jnS/M6Qay5ooytiBHl3g= +github.com/ipld/go-car v0.3.2/go.mod h1:WEjynkVt04dr0GwJhry0KlaTeSDEiEYyMPOxDBQ17KE= github.com/ipld/go-car v0.3.3-0.20211210032800-e6f244225a16/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= github.com/ipld/go-car v0.3.3 h1:D6y+jvg9h2ZSv7GLUMWUwg5VTLy1E7Ak+uQw5orOg3I= github.com/ipld/go-car v0.3.3/go.mod h1:/wkKF4908ULT4dFIFIUZYcfjAnj+KFnJvlh8Hsz1FbQ= -github.com/ipld/go-car/v2 v2.1.1-0.20211211000942-be2525f6bf2d/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-car/v2 v2.1.1 h1:saaKz4nC0AdfCGHLYKeXLGn8ivoPC54fyS55uyOLKwA= github.com/ipld/go-car/v2 v2.1.1/go.mod h1:+2Yvf0Z3wzkv7NeI69i8tuZ+ft7jyjPYIWZzeVNeFcI= github.com/ipld/go-codec-dagpb v1.2.0/go.mod h1:6nBN7X7h8EOsEejZGqC7tej5drsdBAXbMHyBT+Fne5s= @@ -857,8 +929,12 @@ github.com/ipld/go-ipld-prime v0.9.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/j github.com/ipld/go-ipld-prime v0.9.1-0.20210324083106-dc342a9917db/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.10.0/go.mod h1:KvBLMr4PX1gWptgkzRjVZCrLmSGcZCb/jioOQwCqZN8= github.com/ipld/go-ipld-prime v0.11.0/go.mod h1:+WIAkokurHmZ/KwzDOMUuoeJgaRQktHtEaLglS3ZeV8= +github.com/ipld/go-ipld-prime v0.12.3/go.mod h1:PaeLYq8k6dJLmDUSLrzkEpoGV4PEfe/1OtFN/eALOc8= github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD0IJtrDJe6ZM= +github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= +github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= @@ -866,6 +942,9 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= +github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= +github.com/ipld/go-storethehash v0.0.1 h1:U9E9n3dE0IaImSNbRcUmm5Dk9UPiS9H0i+LmCFFGJBI= +github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= github.com/jackpal/gateway v1.0.5/go.mod h1:lTpwd4ACLXmpyiCTRtfiNyVnUmqT9RivzCDQetPfnjA= @@ -973,6 +1052,7 @@ github.com/libp2p/go-conn-security-multistream v0.2.0/go.mod h1:hZN4MjlNetKD3Rq5 github.com/libp2p/go-conn-security-multistream v0.2.1/go.mod h1:cR1d8gA0Hr59Fj6NhaTpFhJZrjSYuNmhpT2r25zYR70= github.com/libp2p/go-conn-security-multistream v0.3.0 h1:9UCIKlBL1hC9u7nkMXpD1nkc/T53PKMAn3/k9ivBAVc= github.com/libp2p/go-conn-security-multistream v0.3.0/go.mod h1:EEP47t4fw/bTelVmEzIDqSe69hO/ip52xBEhZMLWAHM= +github.com/libp2p/go-doh-resolver v0.3.1/go.mod h1:y5go1ZppAq9N2eppbX0xON01CyPBeUg2yS6BTssssog= github.com/libp2p/go-eventbus v0.0.2/go.mod h1:Hr/yGlwxA/stuLnpMiu82lpNKpvRy3EaJxPu40XYOwk= github.com/libp2p/go-eventbus v0.1.0/go.mod h1:vROgu5cs5T7cv7POWlWxBaVLxfSegC5UGQf8A2eEmx4= github.com/libp2p/go-eventbus v0.2.1 h1:VanAdErQnpTioN2TowqNcOijf6YwhuODe4pPKSDpxGc= @@ -990,8 +1070,12 @@ github.com/libp2p/go-libp2p v0.6.1/go.mod h1:CTFnWXogryAHjXAKEbOf1OWY+VeAP3lDMZk github.com/libp2p/go-libp2p v0.7.0/go.mod h1:hZJf8txWeCduQRDC/WSqBGMxaTHCOYHt2xSU1ivxn0k= github.com/libp2p/go-libp2p v0.7.4/go.mod h1:oXsBlTLF1q7pxr+9w6lqzS1ILpyHsaBPniVO7zIHGMw= github.com/libp2p/go-libp2p v0.8.1/go.mod h1:QRNH9pwdbEBpx5DTJYg+qxcVaDMAz3Ee/qDKwXujH5o= +github.com/libp2p/go-libp2p v0.12.0/go.mod h1:FpHZrfC1q7nA8jitvdjKBDF31hguaC676g/nT9PgQM0= +github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t2DTVAJxMo= +github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= +github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1 h1:CFHROLGmMwe/p8tR3sHahg/1NSaZa2EGbu7nDmdC+RY= @@ -1005,6 +1089,7 @@ github.com/libp2p/go-libp2p-autonat v0.1.1/go.mod h1:OXqkeGOY2xJVWKAGV2inNF5aKN/ github.com/libp2p/go-libp2p-autonat v0.2.0/go.mod h1:DX+9teU4pEEoZUqR1PiMlqliONQdNbfzE1C718tcViI= github.com/libp2p/go-libp2p-autonat v0.2.1/go.mod h1:MWtAhV5Ko1l6QBsHQNSuM6b1sRkXrpk0/LqCr+vCVxI= github.com/libp2p/go-libp2p-autonat v0.2.2/go.mod h1:HsM62HkqZmHR2k1xgX34WuWDzk/nBwNHoeyyT4IWV6A= +github.com/libp2p/go-libp2p-autonat v0.4.0/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.4.2/go.mod h1:YxaJlpr81FhdOv3W3BTconZPfhaYivRdf53g+S2wobk= github.com/libp2p/go-libp2p-autonat v0.6.0/go.mod h1:bFC6kY8jwzNNWoqc8iGE57vsfwyJ/lP4O4DOV1e0B2o= github.com/libp2p/go-libp2p-autonat v0.7.0/go.mod h1:uPvPn6J7cN+LCfFwW5tpOYvAz5NvPTc4iBamTV/WDMg= @@ -1075,10 +1160,15 @@ github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFT github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= +github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= +github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= +github.com/libp2p/go-libp2p-gostream v0.3.1 h1:XlwohsPn6uopGluEWs1Csv1QCEjrTXf2ZQagzZ5paAg= +github.com/libp2p/go-libp2p-gostream v0.3.1/go.mod h1:1V3b+u4Zhaq407UUY9JLCpboaeufAeVQbnvAt12LRsI= github.com/libp2p/go-libp2p-host v0.0.1/go.mod h1:qWd+H1yuU0m5CwzAkvbSjqKairayEHdR5MMl7Cwa7Go= github.com/libp2p/go-libp2p-host v0.0.3/go.mod h1:Y/qPyA6C8j2coYyos1dfRm0I8+nvd4TGrDGt4tA7JR8= +github.com/libp2p/go-libp2p-http v0.2.1/go.mod h1:9KdioZ7XqNH0eZkZG9bulZLzHv11A7/12fT97agqWhg= github.com/libp2p/go-libp2p-interface-connmgr v0.0.1/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.4/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= github.com/libp2p/go-libp2p-interface-connmgr v0.0.5/go.mod h1:GarlRLH0LdeWcLnYM/SaBykKFl9U5JFnbBGruAk/D5k= @@ -1099,6 +1189,7 @@ github.com/libp2p/go-libp2p-mplex v0.2.0/go.mod h1:Ejl9IyjvXJ0T9iqUTE1jpYATQ9NM3 github.com/libp2p/go-libp2p-mplex v0.2.1/go.mod h1:SC99Rxs8Vuzrf/6WhmH41kNn13TiYdAWNYHrwImKLnE= github.com/libp2p/go-libp2p-mplex v0.2.2/go.mod h1:74S9eum0tVQdAfFiKxAyKzNdSuLqw5oadDq7+L/FELo= github.com/libp2p/go-libp2p-mplex v0.2.3/go.mod h1:CK3p2+9qH9x+7ER/gWWDYJ3QW5ZxWDkm+dVvjfuG3ek= +github.com/libp2p/go-libp2p-mplex v0.3.0/go.mod h1:l9QWxRbbb5/hQMECEb908GbS9Sm2UAR2KFZKUJEynEs= github.com/libp2p/go-libp2p-mplex v0.4.0/go.mod h1:yCyWJE2sc6TBTnFpjvLuEJgTSw/u+MamvzILKdX7asw= github.com/libp2p/go-libp2p-mplex v0.4.1/go.mod h1:cmy+3GfqfM1PceHTLL7zQzAAYaryDu6iPSC+CIb094g= github.com/libp2p/go-libp2p-mplex v0.5.0 h1:vt3k4E4HSND9XH4Z8rUpacPJFSAgLOv6HDvG8W9Ks9E= @@ -1113,7 +1204,9 @@ github.com/libp2p/go-libp2p-net v0.0.2/go.mod h1:Yt3zgmlsHOgUWSXmt5V/Jpz9upuJBE8 github.com/libp2p/go-libp2p-netutil v0.0.1/go.mod h1:GdusFvujWZI9Vt0X5BKqwWWmZFxecf9Gt03cKxm2f/Q= github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLKcKF72EAMQ= github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= +github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= +github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= @@ -1138,9 +1231,11 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= +github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub v0.6.1 h1:wycbV+f4rreCoVY61Do6g/BUk0RIrbNRcYVbn+QkjGk= github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= +github.com/libp2p/go-libp2p-pubsub-router v0.5.0/go.mod h1:TRJKskSem3C0aSb3CmRgPwq6IleVFzds6hS09fmZbGM= github.com/libp2p/go-libp2p-quic-transport v0.1.1/go.mod h1:wqG/jzhF3Pu2NrhJEvE+IE0NTHNXslOPn9JQzyCAxzU= github.com/libp2p/go-libp2p-quic-transport v0.10.0/go.mod h1:RfJbZ8IqXIhxBRm5hqUEJqjiiY8xmEuq3HUDS993MkA= github.com/libp2p/go-libp2p-quic-transport v0.11.2/go.mod h1:wlanzKtIh6pHrq+0U3p3DY9PJfGqxMgPaGKaK5LifwQ= @@ -1174,6 +1269,8 @@ github.com/libp2p/go-libp2p-swarm v0.2.2/go.mod h1:fvmtQ0T1nErXym1/aa1uJEyN7JzaT github.com/libp2p/go-libp2p-swarm v0.2.3/go.mod h1:P2VO/EpxRyDxtChXz/VPVXyTnszHvokHKRhfkEgFKNM= github.com/libp2p/go-libp2p-swarm v0.2.8/go.mod h1:JQKMGSth4SMqonruY0a8yjlPVIkb0mdNSwckW7OYziM= github.com/libp2p/go-libp2p-swarm v0.3.0/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.3.1/go.mod h1:hdv95GWCTmzkgeJpP+GK/9D9puJegb7H57B5hWQR5Kk= +github.com/libp2p/go-libp2p-swarm v0.4.0/go.mod h1:XVFcO52VoLoo0eitSxNQWYq4D6sydGOweTOAjJNraCw= github.com/libp2p/go-libp2p-swarm v0.5.0/go.mod h1:sU9i6BoHE0Ve5SKz3y9WfKrh8dUat6JknzUehFx8xW4= github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkRnIDg0FLKbuu3i8= github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= @@ -1195,6 +1292,7 @@ github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aL github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= +github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= @@ -1204,6 +1302,7 @@ github.com/libp2p/go-libp2p-transport-upgrader v0.0.4/go.mod h1:RGq+tupk+oj7PzL2 github.com/libp2p/go-libp2p-transport-upgrader v0.1.1/go.mod h1:IEtA6or8JUbsV07qPW4r01GnTenLW4oi3lOPbUMGJJA= github.com/libp2p/go-libp2p-transport-upgrader v0.2.0/go.mod h1:mQcrHj4asu6ArfSoMuyojOdjx73Q47cYD7s5+gZOlns= github.com/libp2p/go-libp2p-transport-upgrader v0.3.0/go.mod h1:i+SKzbRnvXdVbU3D1dwydnTmKRPXiAR/fyvi1dXuL4o= +github.com/libp2p/go-libp2p-transport-upgrader v0.4.0/go.mod h1:J4ko0ObtZSmgn5BX5AmegP+dK3CSnU2lMCKsSq/EY0s= github.com/libp2p/go-libp2p-transport-upgrader v0.4.2/go.mod h1:NR8ne1VwfreD5VIWIU62Agt/J18ekORFU/j1i2y8zvk= github.com/libp2p/go-libp2p-transport-upgrader v0.4.3/go.mod h1:bpkldbOWXMrXhpZbSV1mQxTrefOg2Fi+k1ClDSA4ppw= github.com/libp2p/go-libp2p-transport-upgrader v0.4.6/go.mod h1:JE0WQuQdy+uLZ5zOaI3Nw9dWGYJIA7mywEtP2lMvnyk= @@ -1222,6 +1321,8 @@ github.com/libp2p/go-libp2p-yamux v0.2.7/go.mod h1:X28ENrBMU/nm4I3Nx4sZ4dgjZ6VhL github.com/libp2p/go-libp2p-yamux v0.2.8/go.mod h1:/t6tDqeuZf0INZMTgd0WxIRbtK2EzI2h7HbFm9eAKI4= github.com/libp2p/go-libp2p-yamux v0.4.0/go.mod h1:+DWDjtFMzoAwYLVkNZftoucn7PelNoy5nm3tZ3/Zw30= github.com/libp2p/go-libp2p-yamux v0.5.0/go.mod h1:AyR8k5EzyM2QN9Bbdg6X1SkVVuqLwTGf0L4DFq9g6po= +github.com/libp2p/go-libp2p-yamux v0.5.1/go.mod h1:dowuvDu8CRWmr0iqySMiSxK+W0iL5cMVO9S94Y6gkv4= +github.com/libp2p/go-libp2p-yamux v0.5.3/go.mod h1:Vy3TMonBAfTMXHWopsMc8iX/XGRYrRlpUaMzaeuHV/s= github.com/libp2p/go-libp2p-yamux v0.5.4/go.mod h1:tfrXbyaTqqSU654GTvK3ocnSZL3BuHoeTSqhcel1wsE= github.com/libp2p/go-libp2p-yamux v0.6.0/go.mod h1:MRhd6mAYnFRnSISp4M8i0ClV/j+mWHo2mYLifWGw33k= github.com/libp2p/go-libp2p-yamux v0.7.0/go.mod h1:fMyA0CsPfHkIuBU0wjRGrCjTBFiXTXxG0k5M4ETv+08= @@ -1277,6 +1378,7 @@ github.com/libp2p/go-reuseport-transport v0.1.0/go.mod h1:vev0C0uMkzriDY59yFHD9v github.com/libp2p/go-sockaddr v0.0.2/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.0/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= github.com/libp2p/go-sockaddr v0.1.1/go.mod h1:syPvOmNs24S3dFVGJA1/mrqdeijPxLV2Le3BRLKd68k= +github.com/libp2p/go-socket-activation v0.1.0/go.mod h1:gzda2dNkMG5Ti2OfWNNwW0FDIbj0g/aJJU320FcLfhk= github.com/libp2p/go-stream-muxer v0.0.1/go.mod h1:bAo8x7YkSpadMTbtTaxGVHWUQsR/l5MEaHbKaliuT14= github.com/libp2p/go-stream-muxer v0.1.0/go.mod h1:8JAVsjeRBCWwPoZeH0W1imLOcriqXJyFvB0mR4A04sQ= github.com/libp2p/go-stream-muxer-multistream v0.1.1/go.mod h1:zmGdfkQ1AzOECIAcccoL8L//laqawOsO03zX8Sa+eGw= @@ -1288,9 +1390,11 @@ github.com/libp2p/go-tcp-transport v0.0.4/go.mod h1:+E8HvC8ezEVOxIo3V5vCK9l1y/19 github.com/libp2p/go-tcp-transport v0.1.0/go.mod h1:oJ8I5VXryj493DEJ7OsBieu8fcg2nHGctwtInJVpipc= github.com/libp2p/go-tcp-transport v0.1.1/go.mod h1:3HzGvLbx6etZjnFlERyakbaYPdfjg2pWP97dFZworkY= github.com/libp2p/go-tcp-transport v0.2.0/go.mod h1:vX2U0CnWimU4h0SGSEsg++AzvBcroCGYw28kh94oLe0= +github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1PpPUrHIWQ8aFw7M= github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= +github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-tcp-transport v0.5.0 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= @@ -1301,6 +1405,7 @@ github.com/libp2p/go-ws-transport v0.1.0/go.mod h1:rjw1MG1LU9YDC6gzmwObkPd/Sqwhw github.com/libp2p/go-ws-transport v0.1.2/go.mod h1:dsh2Ld8F+XNmzpkaAijmg5Is+e9l6/1tK/6VFOdN69Y= github.com/libp2p/go-ws-transport v0.2.0/go.mod h1:9BHJz/4Q5A9ludYWKoGCFC5gUElzlHoKzu0yY9p/klM= github.com/libp2p/go-ws-transport v0.3.0/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= +github.com/libp2p/go-ws-transport v0.3.1/go.mod h1:bpgTJmRZAvVHrgHybCVyqoBmyLQ1fiZuEaBYusP5zsk= github.com/libp2p/go-ws-transport v0.4.0/go.mod h1:EcIEKqf/7GDjth6ksuS/6p7R49V4CBY6/E7R/iyhYUA= github.com/libp2p/go-ws-transport v0.5.0/go.mod h1:I2juo1dNTbl8BKSBYo98XY85kU2xds1iamArLvl8kNg= github.com/libp2p/go-ws-transport v0.6.0 h1:326XBL6Q+5CQ2KtjXz32+eGu02W/Kz2+Fm4SpXdr0q4= @@ -1315,11 +1420,14 @@ github.com/libp2p/go-yamux v1.3.7/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/h github.com/libp2p/go-yamux v1.4.0/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= github.com/libp2p/go-yamux v1.4.1 h1:P1Fe9vF4th5JOxxgQvfbOHkrGqIZniTLf+ddhZp8YTI= github.com/libp2p/go-yamux v1.4.1/go.mod h1:fr7aVgmdNGJK+N1g+b6DW6VxzbRCjCOejR/hkmpooHE= +github.com/libp2p/go-yamux/v2 v2.0.0/go.mod h1:NVWira5+sVUIU6tu1JWvaRn1dRnG+cawOJiflsAM+7U= +github.com/libp2p/go-yamux/v2 v2.1.1/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.2.0/go.mod h1:3So6P6TV6r75R9jiBpiIKgU/66lOarCZjqROGxzPpPQ= github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDYrXe05EyKIs= github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= github.com/libp2p/go-yamux/v3 v3.0.2 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= +github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -1379,6 +1487,7 @@ github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Ky github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-runewidth v0.0.2/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= +github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.7/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= github.com/mattn/go-runewidth v0.0.10 h1:CoZ3S2P7pvtP45xOtBw+/mDL2z0RKI576gSkzRRpdGg= github.com/mattn/go-runewidth v0.0.10/go.mod h1:RAqKPSqVFrSLVXbA8x7dzmKdmGzieGRCM46jaSJTDAk= @@ -1397,6 +1506,7 @@ github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3N github.com/miekg/dns v1.1.12/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= github.com/miekg/dns v1.1.28/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= +github.com/miekg/dns v1.1.31/go.mod h1:KNUDUusw/aVsxyTYZM1oqvCicbwhgbNgztCETuNZ7xM= github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= @@ -1464,6 +1574,7 @@ github.com/multiformats/go-multiaddr-dns v0.0.2/go.mod h1:9kWcqw/Pj6FwxAwW38n/94 github.com/multiformats/go-multiaddr-dns v0.0.3/go.mod h1:9kWcqw/Pj6FwxAwW38n/9403szc57zJPs45fmnznu3Q= github.com/multiformats/go-multiaddr-dns v0.1.0/go.mod h1:01k2RAqtoXIuPa3DCavAE9/6jc6nM0H3EgZyfUhN2oY= github.com/multiformats/go-multiaddr-dns v0.2.0/go.mod h1:TJ5pr5bBO7Y1B18djPuRsVkduhQH2YqYSbxWJzYGdK0= +github.com/multiformats/go-multiaddr-dns v0.3.0/go.mod h1:mNzQ4eTGDg0ll1N9jKPOUogZPoJ30W8a7zk66FQPpdQ= github.com/multiformats/go-multiaddr-dns v0.3.1 h1:QgQgR+LQVt3NPTjbrLLpsaT2ufAA2y0Mkk+QRVJbW3A= github.com/multiformats/go-multiaddr-dns v0.3.1/go.mod h1:G/245BRQ6FJGmryJCrOuTdB37AMA5AMOVuO6NY3JwTk= github.com/multiformats/go-multiaddr-fmt v0.0.1/go.mod h1:aBYjqL4T/7j4Qx+R73XSv/8JsgnRFlf0w2KGLCmXl3Q= @@ -1483,8 +1594,9 @@ github.com/multiformats/go-multibase v0.0.3/go.mod h1:5+1R4eQrT3PkYZ24C3W2Ue2tPw github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErhycTIftytRV+llXdyS4= github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c h1:VyANTtZ0wsx0IAZnCZhfMmAmfUyzJq/5JQi2hHOtKS0= github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multicodec v0.4.0 h1:fbqb6ky7erjdD+/zaEBJgZWu1i8D6i/wmPywGK7sdow= +github.com/multiformats/go-multicodec v0.4.0/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1493,12 +1605,14 @@ github.com/multiformats/go-multihash v0.0.10/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpK github.com/multiformats/go-multihash v0.0.13/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.14/go.mod h1:VdAWLKTwram9oKAatUcLxBNUjdtcVwxObEQBtRfuyjc= github.com/multiformats/go-multihash v0.0.15/go.mod h1:D6aZrWNLFTV/ynMpKsNtB40mJzmCl4jb1alC0OvHiHg= +github.com/multiformats/go-multihash v0.0.16/go.mod h1:zhfEIgVnB/rPMfxgFw15ZmGoNaKyNUIE4IWHG/kC+Ag= github.com/multiformats/go-multihash v0.1.0 h1:CgAgwqk3//SVEw3T+6DqI4mWMyRuDwZtOWcJT0q9+EA= github.com/multiformats/go-multihash v0.1.0/go.mod h1:RJlXsxt6vHGaia+S8We0ErjhojtKzPP2AH4+kYM7k84= github.com/multiformats/go-multistream v0.0.1/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.0.4/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.0/go.mod h1:fJTiDfXJVmItycydCnNx4+wSzZ5NwG2FEVAI30fiovg= github.com/multiformats/go-multistream v0.1.1/go.mod h1:KmHZ40hzVxiaiwlj3MEbYgK9JFk2/9UktWZAF54Du38= +github.com/multiformats/go-multistream v0.2.0/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.1/go.mod h1:5GZPQZbkWOLOn3J2y4Y99vVW7vOfsAflxARk3x14o6k= github.com/multiformats/go-multistream v0.2.2 h1:TCYu1BHTDr1F/Qm75qwYISQdzGcRdC21nFgQW7l7GBo= github.com/multiformats/go-multistream v0.2.2/go.mod h1:UIcnm7Zuo8HKG+HkWgfQsGL+/MIEhyTqbODbIUwSXKs= @@ -1781,6 +1895,7 @@ github.com/tj/go-spin v1.1.0 h1:lhdWZsvImxvZ3q1C5OIB7d72DuOwP4O2NdBg9PyzNds= github.com/tj/go-spin v1.1.0/go.mod h1:Mg1mzmePZm4dva8Qz60H2lHwmJ2loum4VIrLgVnKwh4= github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= +github.com/tv42/httpunix v0.0.0-20191220191345-2ba4b9c3382c/go.mod h1:hzIxponao9Kjc7aWznkXaL4U4TWaDSs8zcsY4Ka08nM= github.com/uber/jaeger-client-go v2.15.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.23.1+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= github.com/uber/jaeger-client-go v2.25.0+incompatible h1:IxcNZ7WRY1Y3G4poYlx24szfsn/3LvK9QHCq9oQw8+U= @@ -1794,8 +1909,9 @@ github.com/urfave/cli v1.22.1/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtX github.com/urfave/cli v1.22.2 h1:gsqYFH8bb9ekPA12kRo0hfjngWQjkJPlN9R0N78BoUo= github.com/urfave/cli v1.22.2/go.mod h1:Gos4lmkARVdJ6EkW0WaNv/tZAAMe9V7XWyB60NtXRu0= github.com/urfave/cli/v2 v2.0.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= -github.com/urfave/cli/v2 v2.2.0 h1:JTTnM6wKzdA0Jqodd966MVj4vWbbquZykeX1sKbe2C4= github.com/urfave/cli/v2 v2.2.0/go.mod h1:SE9GqnLQmjVa0iPEY0f1w3ygNIYcIJ0OKPMoW2caLfQ= +github.com/urfave/cli/v2 v2.3.0 h1:qph92Y649prgesehzOrQjdWyxFOp/QVM+6imKHad91M= +github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1 h1:tY9CJiPnMXf1ERmG2EyK7gNUd+c6RKGD0IfU8WdUSz8= @@ -1803,8 +1919,9 @@ github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPU github.com/viant/assertly v0.4.8/go.mod h1:aGifi++jvCrUaklKEKT0BU95igDNaqkvz+49uaYMPRU= github.com/viant/toolbox v0.24.0/go.mod h1:OxMCG57V0PXuIP2HNQrtJf2CjqdmbrOx5EkMILuUhzM= github.com/wangjia184/sortedset v0.0.0-20160527075905-f5d03557ba30/go.mod h1:YkocrP2K2tcw938x9gCOmT5G5eCD6jsTz0SZuyAqwIE= -github.com/warpfork/go-testmark v0.3.0 h1:Q81c4u7hT+BR5kNfNQhEF0VT2pmL7+Kk0wD+ORYl7iA= github.com/warpfork/go-testmark v0.3.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= +github.com/warpfork/go-testmark v0.9.0 h1:nc+uaCiv5lFQLYjhuC2LTYeJ7JaC+gdDmsz9r0ISy0Y= +github.com/warpfork/go-testmark v0.9.0/go.mod h1:jhEf8FVxd+F17juRubpmut64NEG6I2rgkUhlcqqXwE0= github.com/warpfork/go-wish v0.0.0-20180510122957-5ad1f5abf436/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20190328234359-8b3e70f8e830/go.mod h1:x6AKhvSSexNrVSrViXSHUEbICjmGXhtgABaHIySUSGw= github.com/warpfork/go-wish v0.0.0-20200122115046-b9ea61034e4a h1:G++j5e0OC488te356JvdhaM8YS6nMsjLAYF7JxCv07w= @@ -1832,8 +1949,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8 h1:TEv7MId88TyIqIUL4hbf9otOookIolMxlEbN0ro671Y= github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= +github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -1842,6 +1960,7 @@ github.com/whyrusleeping/go-keyspace v0.0.0-20160322163242-5b898ac5add1/go.mod h github.com/whyrusleeping/go-logging v0.0.0-20170515211332-0457bb6b88fc/go.mod h1:bopw91TMyo8J3tvftk8xmU2kPmlrt4nScJQZU2hE5EM= github.com/whyrusleeping/go-logging v0.0.1/go.mod h1:lDPYj54zutzG1XYfHAhcc7oNXEburHQBn+Iqd4yS4vE= github.com/whyrusleeping/go-notifier v0.0.0-20170827234753-097c5d47330f/go.mod h1:cZNvX9cFybI01GriPRMXDtczuvUhgbcYr9iCGaNlRv8= +github.com/whyrusleeping/go-sysinfo v0.0.0-20190219211824-4a357d4b90b1/go.mod h1:tKH72zYNt/exx6/5IQO6L9LoQ0rEjd5SbbWaDTs9Zso= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 h1:NwiwjQDB3CzQ5XH0rdMh1oQqzJH7O2PSLWxif/w3zsY= github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4/go.mod h1:K+EVq8d5QcQ2At5VECsA+SNZvWefyBXh8TnIsxo1OvQ= github.com/whyrusleeping/mafmt v1.2.8/go.mod h1:faQJFPbLSxzD9xpA02ttW/tS9vZykNvXwGvqIpk20FA= @@ -1863,6 +1982,7 @@ github.com/xorcare/golden v0.6.0/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/ github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542 h1:oWgZJmC1DorFZDpfMfWg7xk29yEOZiXmo/wZl+utTI8= github.com/xorcare/golden v0.6.1-0.20191112154924-b87f686d7542/go.mod h1:7T39/ZMvaSEZlBPoYfVFmsBLmUl3uz9IuzWj/U6FtvQ= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= +github.com/ybbus/jsonrpc/v2 v2.1.6/go.mod h1:rIuG1+ORoiqocf9xs/v+ecaAVeo3zcZHQgInyKFMeg0= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -1935,14 +2055,15 @@ go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= -go.uber.org/dig v1.10.0 h1:yLmDDj9/zuDjv3gz8GQGviXMs9TfysIUMUilCpgzUJY= -go.uber.org/dig v1.10.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= -go.uber.org/fx v1.9.0 h1:7OAz8ucp35AU8eydejpYG7QrbE8rLKzGhHbZlJi5LYY= -go.uber.org/fx v1.9.0/go.mod h1:mFdUyAUuJ3w4jAckiKSKbldsxy1ojpAMJ+dVZg5Y0Aw= +go.uber.org/dig v1.12.0 h1:l1GQeZpEbss0/M4l/ZotuBndCrkMdjnygzgcuOjAdaY= +go.uber.org/dig v1.12.0/go.mod h1:X34SnWGr8Fyla9zQNO2GSO2D+TIuqB14OS8JhYocIyw= +go.uber.org/fx v1.15.0 h1:kcfBpAm98n0ksanyyZLFE/Q3T7yPi13Ge2liu3TxR+A= +go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= -go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= +go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= @@ -1992,6 +2113,7 @@ golang.org/x/crypto v0.0.0-20200115085410-6d4e4cb37c7d/go.mod h1:LzIPMQfyMNhhGPh golang.org/x/crypto v0.0.0-20200128174031-69ecbb4d6d5d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200221231518-2aa609cf4a9d/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20200423211502-4bdfaf469ed5/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200510223506-06a226fb4e37/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200602180216-279210d13fed/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200604202706-70a84ac30bf9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= @@ -2007,6 +2129,8 @@ golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210813211128-0a44fdfbc16e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b h1:QAqMVf3pSa6eeTsuklijukjXBlj7Es2QQplab+/RbQ4= golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2054,6 +2178,7 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2113,6 +2238,7 @@ golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLd golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20210505024714-0287a6fb4125/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= @@ -2192,6 +2318,7 @@ golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7w golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191206220618-eeba5f6aabab/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191210023423-ac6580df4449/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191220142924-d4481acd189f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= @@ -2241,7 +2368,9 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20210903071746-97244b99971b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211025112917-711f33c9992c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20211209171907-798191bca915 h1:P+8mCzuEpyszAT6T42q0sxU+eveBAF/cJ2Kp0x6/8+0= golang.org/x/sys v0.0.0-20211209171907-798191bca915/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= @@ -2328,6 +2457,7 @@ golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= +golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= @@ -2466,6 +2596,7 @@ gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMy gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo= +gopkg.in/square/go-jose.v2 v2.5.1/go.mod h1:M9dMgbHiYLoDGQrXy7OpJDJWiKiU//h+vD76mk0e1AI= gopkg.in/src-d/go-cli.v0 v0.0.0-20181105080154-d492247bbc0d/go.mod h1:z+K8VcOYVYcSwSjGebuDL6176A1XskgbtNl64NSg+n8= gopkg.in/src-d/go-log.v1 v1.0.1/go.mod h1:GN34hKP0g305ysm2/hctJ0Y8nWP3zxXXJ8GFabTyABE= gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= @@ -2515,6 +2646,7 @@ modernc.org/strutil v1.1.0 h1:+1/yCzZxY2pZwwrsbH+4T7BQMoLQ9QiBshRC9eicYsc= modernc.org/strutil v1.1.0/go.mod h1:lstksw84oURvj9y3tn8lGvRxyRC1S2+g5uuIzNfIOBs= modernc.org/xc v1.0.0 h1:7ccXrupWZIS3twbUGrtKmHS2DXY6xegFua+6O3xgAFU= modernc.org/xc v1.0.0/go.mod h1:mRNCo0bvLjGhHO9WsyuKVU4q0ceiDDDoEeWDJHrNx8I= +pgregory.net/rapid v0.4.7/go.mod h1:UYpPVyjFHzYBGHIxLFoupi8vwk6rXNzRY9OMvVxFIOU= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index be07341429a..8a0d2105733 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -133,14 +133,14 @@ func newIndexerProviderDataTransfer(cfg config.IndexerProviderConfig, mctx helpe // Set up data transfer dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/transfers")) - transport := dtgstransport.NewTransport(h.ID(), gs, net) + transport := dtgstransport.NewTransport(h.ID(), gs) dtPath := filepath.Join(r.Path(), "indexer-provider", "data-transfer") err := os.MkdirAll(dtPath, 0755) //nolint: gosec if err != nil && !os.IsExist(err) { return nil, xerrors.Errorf("creating indexer provider data transfer dir %s: %w", dtPath, err) } - dt, err := dtimpl.NewDataTransfer(dtDs, dtPath, net, transport) + dt, err := dtimpl.NewDataTransfer(dtDs, net, transport) if err != nil { return nil, xerrors.Errorf("creating indexer provider data transfer module: %w", err) } From 7508d96327ebbab1eede2e453ea04fda2e3859a4 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Thu, 20 Jan 2022 16:47:15 +0400 Subject: [PATCH 37/99] fix lint --- markets/dagstore/wrapper_migration_test.go | 7 ++++++- markets/dagstore/wrapper_test.go | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/markets/dagstore/wrapper_migration_test.go b/markets/dagstore/wrapper_migration_test.go index 437032da943..a08e46e6c16 100644 --- a/markets/dagstore/wrapper_migration_test.go +++ b/markets/dagstore/wrapper_migration_test.go @@ -5,6 +5,8 @@ import ( "io" "testing" + mocknet "github.com/libp2p/go-libp2p/p2p/net/mock" + "github.com/stretchr/testify/require" "github.com/filecoin-project/dagstore" @@ -96,8 +98,11 @@ func TestShardRegistration(t *testing.T) { cfg := config.DefaultStorageMiner().DAGStore cfg.RootDir = t.TempDir() + h, err := mocknet.New().GenPeer() + require.NoError(t, err) + mapi := NewMinerAPI(ps, &wrappedSA{sa}, 10, 5) - dagst, w, err := NewDAGStore(cfg, mapi) + dagst, w, err := NewDAGStore(cfg, mapi, h) require.NoError(t, err) require.NotNil(t, dagst) require.NotNil(t, w) diff --git a/markets/dagstore/wrapper_test.go b/markets/dagstore/wrapper_test.go index 80b559aa08e..5224f000d5d 100644 --- a/markets/dagstore/wrapper_test.go +++ b/markets/dagstore/wrapper_test.go @@ -31,7 +31,7 @@ func TestWrapperAcquireRecovery(t *testing.T) { pieceCid, err := cid.Parse("bafkqaaa") require.NoError(t, err) - h, err := mocknet.New(ctx).GenPeer() + h, err := mocknet.New().GenPeer() require.NoError(t, err) // Create a DAG store wrapper dagst, w, err := NewDAGStore(config.DAGStoreConfig{ @@ -83,7 +83,7 @@ func TestWrapperAcquireRecovery(t *testing.T) { // TestWrapperBackground verifies the behaviour of the background go routine func TestWrapperBackground(t *testing.T) { ctx := context.Background() - h, err := mocknet.New(ctx).GenPeer() + h, err := mocknet.New().GenPeer() require.NoError(t, err) // Create a DAG store wrapper From 8d062bc880c697766c0e5ee8330ceafdd04671bc Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Mon, 24 Jan 2022 14:26:17 +0400 Subject: [PATCH 38/99] update index provider --- go.mod | 2 +- go.sum | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index c8312a261ee..b7f8121acde 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.2.1 + github.com/filecoin-project/index-provider v0.2.2 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 4488b876930..724391a8875 100644 --- a/go.sum +++ b/go.sum @@ -354,8 +354,9 @@ github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitvi github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.2.1/go.mod h1:iHDfdqieReblkLoHneB68wvthFtNKB+wkeEWKtiJESk= -github.com/filecoin-project/go-legs v0.2.2 h1:tCCqiXpXw8219/l191phtp7BZbssm7hJcnFFTESs2NI= github.com/filecoin-project/go-legs v0.2.2/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= +github.com/filecoin-project/go-legs v0.2.3 h1:sNEUF+Cw4mpGp8hX4oZO/lIAiZpbJy55ih2GxXhj+V0= +github.com/filecoin-project/go-legs v0.2.3/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -379,8 +380,9 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.2.1 h1:jM0ZxEsJhx4WmGgFBtC2ctk2pvu50Rd/LBNNNOcWbQQ= github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= +github.com/filecoin-project/index-provider v0.2.2 h1:t4+Q+Bu4yw9LdRAdH85rxPcoY8yKZlm2LdQxiST9UUY= +github.com/filecoin-project/index-provider v0.2.2/go.mod h1:QkOSa6WlNFTdbdGLDS4w5k3pMsz/fLZFoorAGgM7e0Y= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= From 5da2995bcdd6feb16f0ecc964d307860cae96949 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Tue, 25 Jan 2022 09:37:44 +0000 Subject: [PATCH 39/99] Upgrade to `index-provider` v0.2.3 Upgrade index provider to latest so that on engine restart the head advertisement is published. --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index b7f8121acde..bc16eddf05e 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.2.2 + github.com/filecoin-project/index-provider v0.2.3 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 724391a8875..9915e47af7e 100644 --- a/go.sum +++ b/go.sum @@ -383,6 +383,8 @@ github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYM github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= github.com/filecoin-project/index-provider v0.2.2 h1:t4+Q+Bu4yw9LdRAdH85rxPcoY8yKZlm2LdQxiST9UUY= github.com/filecoin-project/index-provider v0.2.2/go.mod h1:QkOSa6WlNFTdbdGLDS4w5k3pMsz/fLZFoorAGgM7e0Y= +github.com/filecoin-project/index-provider v0.2.3 h1:F4zM+hetYYXt0dXgUSejN9SadAHUjvzakfWFbC6HUa4= +github.com/filecoin-project/index-provider v0.2.3/go.mod h1:QkOSa6WlNFTdbdGLDS4w5k3pMsz/fLZFoorAGgM7e0Y= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= From 4dd93e5bbbfaa99fc0786f0033c12e0e2b323b4d Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 26 Jan 2022 10:58:44 +0400 Subject: [PATCH 40/99] update deps --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index bc16eddf05e..bcd7d1421a3 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220120121729-eb2fe1f4df58 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126065420-3d2e3c81e8e4 github.com/filecoin-project/go-indexer-core v0.2.7 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index 9915e47af7e..9d2868de43b 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220120121729-eb2fe1f4df58 h1:NHX4FXQQQ9dVhQBBM1BThVbYmN3EnM4Dxzvz0DYTOTk= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220120121729-eb2fe1f4df58/go.mod h1:SmDIzoUwFlej6Ac5ilBMyBImTj/TrmJmZ6wh/ILMfuI= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126065420-3d2e3c81e8e4 h1:h8neqftyFIA2kFG9nIEESSwARjixPdD0L3OZZhE9XjQ= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126065420-3d2e3c81e8e4/go.mod h1:SmDIzoUwFlej6Ac5ilBMyBImTj/TrmJmZ6wh/ILMfuI= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -381,8 +381,6 @@ github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lI github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= -github.com/filecoin-project/index-provider v0.2.2 h1:t4+Q+Bu4yw9LdRAdH85rxPcoY8yKZlm2LdQxiST9UUY= -github.com/filecoin-project/index-provider v0.2.2/go.mod h1:QkOSa6WlNFTdbdGLDS4w5k3pMsz/fLZFoorAGgM7e0Y= github.com/filecoin-project/index-provider v0.2.3 h1:F4zM+hetYYXt0dXgUSejN9SadAHUjvzakfWFbC6HUa4= github.com/filecoin-project/index-provider v0.2.3/go.mod h1:QkOSa6WlNFTdbdGLDS4w5k3pMsz/fLZFoorAGgM7e0Y= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= From 211ad166af7ec8f0ba59c858c821fa7e179557fd Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Wed, 26 Jan 2022 15:53:27 +0400 Subject: [PATCH 41/99] update markets deps --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index bcd7d1421a3..fcdbbc0793c 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126065420-3d2e3c81e8e4 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126115144-06ec15036195 github.com/filecoin-project/go-indexer-core v0.2.7 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index 9d2868de43b..b39380ad236 100644 --- a/go.sum +++ b/go.sum @@ -339,8 +339,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126065420-3d2e3c81e8e4 h1:h8neqftyFIA2kFG9nIEESSwARjixPdD0L3OZZhE9XjQ= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126065420-3d2e3c81e8e4/go.mod h1:SmDIzoUwFlej6Ac5ilBMyBImTj/TrmJmZ6wh/ILMfuI= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126115144-06ec15036195 h1:IgKgvwi63bhOGvg+2BmYVRK+XEgS/YaEJMzSbY/RAiM= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126115144-06ec15036195/go.mod h1:SmDIzoUwFlej6Ac5ilBMyBImTj/TrmJmZ6wh/ILMfuI= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 5d72ebe0cc818443820e55bd3c288841bad49a3b Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 27 Jan 2022 09:48:10 +0000 Subject: [PATCH 42/99] Upgrade `index-provider` and update topic name Update the topic name to be consistent with default configured in storetheindex. Upgrade to the latest `index-provider`. --- documentation/en/default-lotus-miner-config.toml | 2 +- go.mod | 2 +- go.sum | 10 ++++++---- node/config/def_test.go | 2 +- 4 files changed, 9 insertions(+), 7 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 2e9638fabb3..345a2b91cdb 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -265,7 +265,7 @@ #LinkedChunkSize = 16384 # env var: LOTUS_INDEXERPROVIDER_PUBSUBTOPIC - #PubSubTopic = "indexer/ingest" + #PubSubTopic = "/indexer/ingest/mainnet" # env var: LOTUS_INDEXERPROVIDER_PURGELINKCACHE #PurgeLinkCache = false diff --git a/go.mod b/go.mod index fcdbbc0793c..ce44409381c 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.2.3 + github.com/filecoin-project/index-provider v0.2.4 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index b39380ad236..1bc52d803ae 100644 --- a/go.sum +++ b/go.sum @@ -355,8 +355,9 @@ github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3G github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.2.1/go.mod h1:iHDfdqieReblkLoHneB68wvthFtNKB+wkeEWKtiJESk= github.com/filecoin-project/go-legs v0.2.2/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= -github.com/filecoin-project/go-legs v0.2.3 h1:sNEUF+Cw4mpGp8hX4oZO/lIAiZpbJy55ih2GxXhj+V0= github.com/filecoin-project/go-legs v0.2.3/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= +github.com/filecoin-project/go-legs v0.2.4 h1:2U4Zg2NMO76YxMMFhAWscvDBatqOlbUYDNKB70cLNl4= +github.com/filecoin-project/go-legs v0.2.4/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -381,8 +382,8 @@ github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lI github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= -github.com/filecoin-project/index-provider v0.2.3 h1:F4zM+hetYYXt0dXgUSejN9SadAHUjvzakfWFbC6HUa4= -github.com/filecoin-project/index-provider v0.2.3/go.mod h1:QkOSa6WlNFTdbdGLDS4w5k3pMsz/fLZFoorAGgM7e0Y= +github.com/filecoin-project/index-provider v0.2.4 h1:UNiT7mgln51nliy39t4JwoUNfttYeju3OEW+MIZVfbw= +github.com/filecoin-project/index-provider v0.2.4/go.mod h1:XTRE4AJglEpSlJwSZFVcm6zs3vsDvyfDwLkjTFSB5Po= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -407,8 +408,9 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36PO github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/storetheindex v0.2.2/go.mod h1:05vxs5u3vTQFAwGW9+pgWSMc3BgFOK513nPyIQyLwyQ= -github.com/filecoin-project/storetheindex v0.2.3 h1:YXA1qWQv/tRzvuqcPUt4kQbIgxFdKP32SPjWTefhOGw= github.com/filecoin-project/storetheindex v0.2.3/go.mod h1:US7ddOKCI+KQFcC3ipKuhK3i46EYlSCt5EvPhxBLfWI= +github.com/filecoin-project/storetheindex v0.2.5 h1:upSoyl1ostX2DxyXoR5U8FSRqvT1pHeYEfO3irobYZw= +github.com/filecoin-project/storetheindex v0.2.5/go.mod h1:Izc9PdivlQ+he1J8R1DD8978P8Yna0xQbf61L2UKxFc= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= diff --git a/node/config/def_test.go b/node/config/def_test.go index 85264358b54..e6ad1a68719 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -55,5 +55,5 @@ func TestDefaultMinerRoundtrip(t *testing.T) { func TestDefaultStorageMiner_SetsIndexIngestTopic(t *testing.T) { subject := DefaultStorageMiner() - require.Equal(t, "indexer/ingest", subject.IndexerProvider.PubSubTopic) + require.Equal(t, "/indexer/ingest/mainnet", subject.IndexerProvider.PubSubTopic) } From ad348c8e2f01e487794d8f259bdd56d9ca8e1bba Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Tue, 1 Feb 2022 09:52:45 +0000 Subject: [PATCH 43/99] Upgrade to the latest index provider Upgrade to the latest index provider which rolls out a more compact ad signature mechanism along with dependency updates. --- go.mod | 4 ++-- go.sum | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/go.mod b/go.mod index ce44409381c..3344036dffa 100644 --- a/go.mod +++ b/go.mod @@ -37,7 +37,7 @@ require ( github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126115144-06ec15036195 - github.com/filecoin-project/go-indexer-core v0.2.7 + github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.2.4 + github.com/filecoin-project/index-provider v0.2.6 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 1bc52d803ae..b4cb47ca405 100644 --- a/go.sum +++ b/go.sum @@ -349,15 +349,15 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGy github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= -github.com/filecoin-project/go-indexer-core v0.2.7 h1:D0egR6Q3Jkp5r4klxkdDQvjXeLx3cwZMKE55qop2xCI= github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitviL7h1fksIU6a4j52yPnA/E1PU= +github.com/filecoin-project/go-indexer-core v0.2.8 h1:h1SRdZKTVcaXlzex3UevHh4OWDAhgpMzL4tHNAA7MQI= +github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.2.1/go.mod h1:iHDfdqieReblkLoHneB68wvthFtNKB+wkeEWKtiJESk= github.com/filecoin-project/go-legs v0.2.2/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= -github.com/filecoin-project/go-legs v0.2.3/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= -github.com/filecoin-project/go-legs v0.2.4 h1:2U4Zg2NMO76YxMMFhAWscvDBatqOlbUYDNKB70cLNl4= -github.com/filecoin-project/go-legs v0.2.4/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= +github.com/filecoin-project/go-legs v0.2.7 h1:+b1BQv4QKkRNsDUE8Z4sEhLXhfVQ+iGpHhANpYqxJlA= +github.com/filecoin-project/go-legs v0.2.7/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= @@ -382,8 +382,8 @@ github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lI github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= -github.com/filecoin-project/index-provider v0.2.4 h1:UNiT7mgln51nliy39t4JwoUNfttYeju3OEW+MIZVfbw= -github.com/filecoin-project/index-provider v0.2.4/go.mod h1:XTRE4AJglEpSlJwSZFVcm6zs3vsDvyfDwLkjTFSB5Po= +github.com/filecoin-project/index-provider v0.2.6 h1:JodDoTiLjDPifRxKSgoyDwD8qzbSZDcyn5IPF0osVAg= +github.com/filecoin-project/index-provider v0.2.6/go.mod h1:y87dsIQdcmQS5PWIcifQdRb454ViVxjjFEccMDswIjQ= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -409,8 +409,8 @@ github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= github.com/filecoin-project/storetheindex v0.2.2/go.mod h1:05vxs5u3vTQFAwGW9+pgWSMc3BgFOK513nPyIQyLwyQ= github.com/filecoin-project/storetheindex v0.2.3/go.mod h1:US7ddOKCI+KQFcC3ipKuhK3i46EYlSCt5EvPhxBLfWI= -github.com/filecoin-project/storetheindex v0.2.5 h1:upSoyl1ostX2DxyXoR5U8FSRqvT1pHeYEfO3irobYZw= -github.com/filecoin-project/storetheindex v0.2.5/go.mod h1:Izc9PdivlQ+he1J8R1DD8978P8Yna0xQbf61L2UKxFc= +github.com/filecoin-project/storetheindex v0.3.0 h1:M9C4BFLCKn6FJn2N/8q0VbX00hEjEWUuvJpscqKwqzQ= +github.com/filecoin-project/storetheindex v0.3.0/go.mod h1:GhUmP8+nINxDRUqxQvTc3Fqc7Yp6w0dW/uTaYYIzd68= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= From db5e4da268329952fd6d1ccc1454a50fcbe796a2 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 2 Feb 2022 10:51:53 +0100 Subject: [PATCH 44/99] add fullnodeApi to StorageProvider --- node/modules/storageminer.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index c8822b28e29..2a6b61b69c0 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -590,6 +590,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, spn storagemarket.StorageProviderNode, df dtypes.StorageDealFilter, dsw *dagstore.Wrapper, + fullnodeApi v1api.FullNode, ) (storagemarket.StorageProvider, error) { net := smnet.NewFromLibp2pHost(h) @@ -620,6 +621,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, spn, address.Address(minerAddress), storedAsk, + fullnodeApi, opt, ) } From f9b63c5f8c61836411efb20147882f4ee3c5e90a Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 2 Feb 2022 11:36:08 +0100 Subject: [PATCH 45/99] add idxProvHost to StorageProvider --- node/builder_miner.go | 1 + node/modules/storageminer.go | 2 ++ node/modules/storageminer_idxprov.go | 21 ++++++++++++++++++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/node/builder_miner.go b/node/builder_miner.go index de22ef8aa60..e45e8d19a79 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -168,6 +168,7 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(dtypes.ProviderTransferNetwork), modules.NewProviderTransferNetwork), Override(new(dtypes.ProviderTransport), modules.NewProviderTransport), Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDataTransfer), + Override(new(*modules.IdxProvHost), modules.IndexerProviderHost(cfg.IndexerProvider)), Override(new(provider.Interface), modules.IndexerProvider(cfg.IndexerProvider)), Override(new(*storedask.StoredAsk), modules.NewStorageAsk), Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, nil)), diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 2a6b61b69c0..34b27d9d75f 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -591,6 +591,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, df dtypes.StorageDealFilter, dsw *dagstore.Wrapper, fullnodeApi v1api.FullNode, + idxProvHost *IdxProvHost, ) (storagemarket.StorageProvider, error) { net := smnet.NewFromLibp2pHost(h) @@ -622,6 +623,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, address.Address(minerAddress), storedAsk, fullnodeApi, + idxProvHost.Host, opt, ) } diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 8a0d2105733..b200d23eb6a 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -48,10 +48,12 @@ type IdxProv struct { peerstore.Peerstore } -func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, marketHost host.Host) (provider.Interface, error) { - return func(args IdxProv, marketHost host.Host) (provider.Interface, error) { - ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/indexer-provider")) +type IdxProvHost struct { + host.Host +} +func IndexerProviderHost(cfg config.IndexerProviderConfig) func(IdxProv) (*IdxProvHost, error) { + return func(args IdxProv) (*IdxProvHost, error) { pkey := args.Peerstore.PrivKey(args.PeerID) if pkey == nil { return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) @@ -62,6 +64,19 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, mark return nil, xerrors.Errorf("creating indexer provider host: %w", err) } + return &IdxProvHost{h}, nil + } +} + +func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, marketHost host.Host, h *IdxProvHost) (provider.Interface, error) { + return func(args IdxProv, marketHost host.Host, h *IdxProvHost) (provider.Interface, error) { + ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/indexer-provider")) + + pkey := args.Peerstore.PrivKey(args.PeerID) + if pkey == nil { + return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) + } + dt, err := newIndexerProviderDataTransfer(cfg, args.MetricsCtx, args.Lifecycle, args.Repo, h, ipds) if err != nil { return nil, err From 2790cf35af1cacfee6994895f3b9082e366dd7f2 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 2 Feb 2022 13:06:53 +0100 Subject: [PATCH 46/99] change fullnodeApi to listen addrs --- go.mod | 4 +--- go.sum | 36 +++--------------------------------- node/modules/storageminer.go | 7 ++++++- 3 files changed, 10 insertions(+), 37 deletions(-) diff --git a/go.mod b/go.mod index 3344036dffa..970e0d1647c 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126115144-06ec15036195 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 @@ -160,7 +160,6 @@ require ( go.uber.org/fx v1.15.0 go.uber.org/multierr v1.7.0 go.uber.org/zap v1.19.1 - golang.org/x/crypto v0.0.0-20211209193657-4570a0811e8b // indirect golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c golang.org/x/sys v0.0.0-20211209171907-798191bca915 @@ -169,7 +168,6 @@ require ( golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 gopkg.in/cheggaaa/pb.v1 v1.0.28 gotest.tools v2.2.0+incompatible - lukechampine.com/blake3 v1.1.7 // indirect ) replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi diff --git a/go.sum b/go.sum index b4cb47ca405..5ba5e5e6432 100644 --- a/go.sum +++ b/go.sum @@ -298,6 +298,7 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/filecoin-project/dagstore v0.5.1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= github.com/filecoin-project/dagstore v0.5.2-0.20220120115845-e07b050f48d3 h1:kuZsRFDjyrDAgoHNolJBnO7xX1EETHdJ090sgD3Al5E= github.com/filecoin-project/dagstore v0.5.2-0.20220120115845-e07b050f48d3/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= @@ -324,13 +325,9 @@ github.com/filecoin-project/go-crypto v0.0.0-20191218222705-effae4ea9f03/go.mod github.com/filecoin-project/go-crypto v0.0.1 h1:AcvpSGGCgjaY8y1az6AMfKQWreF/pWO2JJGLl6gCq6o= github.com/filecoin-project/go-crypto v0.0.1/go.mod h1:+viYnvGtUTgJRdy6oaeF4MTFKAfatX071MPDPBL11EQ= github.com/filecoin-project/go-dagaggregator-unixfs v0.2.0/go.mod h1:WTuJWgBQY0omnQqa8kRPT9O0Uj5wQOgslVMUuTeHdJ8= -github.com/filecoin-project/go-data-transfer v1.11.4/go.mod h1:2MitLI0ebCkLlPKM7NRggP/t9d+gCcREUKkCKqWRCwU= -github.com/filecoin-project/go-data-transfer v1.12.1/go.mod h1:j3HL645YiQFxcM+q7uPlGApILSqeweDABNgZQP7pDYU= -github.com/filecoin-project/go-data-transfer v1.13.0/go.mod h1:TcUtAdQl1ofnLV9oH3gPC93Hjce9yuKnq4O4j2M/BU4= github.com/filecoin-project/go-data-transfer v1.14.0 h1:4pnfJk8FYtqcdAg+QRGzaz57seUC/Tz+HJgPuGB7zdg= github.com/filecoin-project/go-data-transfer v1.14.0/go.mod h1:wNJKhaLLYBJDM3VFvgvYi4iUjPa69pz/1Q5Q4HzX2wE= github.com/filecoin-project/go-ds-versioning v0.0.0-20211206185234-508abd7c2aff/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= -github.com/filecoin-project/go-ds-versioning v0.1.0/go.mod h1:mp16rb4i2QPmxBnmanUx8i/XANp+PFCCJWiAb+VW4/s= github.com/filecoin-project/go-ds-versioning v0.1.1 h1:JiyBqaQlwC+UM0WhcBtVEeT3XrX59mQhT8U3p7nu86o= github.com/filecoin-project/go-ds-versioning v0.1.1/go.mod h1:C9/l9PnB1+mwPa26BBVpCjG/XQCB0yj/q5CK2J8X1I4= github.com/filecoin-project/go-fil-commcid v0.0.0-20200716160307-8f644712406f/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= @@ -339,8 +336,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126115144-06ec15036195 h1:IgKgvwi63bhOGvg+2BmYVRK+XEgS/YaEJMzSbY/RAiM= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220126115144-06ec15036195/go.mod h1:SmDIzoUwFlej6Ac5ilBMyBImTj/TrmJmZ6wh/ILMfuI= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac h1:5k1TVKQzIcI+/ZA9i7u2Lq4JVRlWxYj7qKAWO4ltZZA= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -349,17 +346,13 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGy github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= -github.com/filecoin-project/go-indexer-core v0.2.7/go.mod h1:6YD7KwDOQ+03DdAitviL7h1fksIU6a4j52yPnA/E1PU= github.com/filecoin-project/go-indexer-core v0.2.8 h1:h1SRdZKTVcaXlzex3UevHh4OWDAhgpMzL4tHNAA7MQI= github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.2.1/go.mod h1:iHDfdqieReblkLoHneB68wvthFtNKB+wkeEWKtiJESk= -github.com/filecoin-project/go-legs v0.2.2/go.mod h1:mdNMISV/bWyZguFM7R4s0mxV1v6Vhda3BiAw9+jv5iE= github.com/filecoin-project/go-legs v0.2.7 h1:+b1BQv4QKkRNsDUE8Z4sEhLXhfVQ+iGpHhANpYqxJlA= github.com/filecoin-project/go-legs v0.2.7/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= -github.com/filecoin-project/go-padreader v0.0.0-20210723183308-812a16dc01b1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 h1:+nripp+UI/rhl01w9Gs4V0XDGaVPYPMGU/D/gNVLue0= @@ -368,7 +361,6 @@ github.com/filecoin-project/go-state-types v0.0.0-20200903145444-247639ffa6ad/go github.com/filecoin-project/go-state-types v0.0.0-20200928172055-2df22083d8ab/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.0.0-20201102161440-c8033295a1fc/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.0/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= -github.com/filecoin-project/go-state-types v0.1.1-0.20210506134452-99b279731c48/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1-0.20210810190654-139e0e79e69e/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.1/go.mod h1:ezYnPf0bNkTsDibL/psSz5dy4B5awOJ/E7P2Saeep8g= github.com/filecoin-project/go-state-types v0.1.3 h1:rzIJyQo5HO2ptc8Jcu8P0qTutnI7NWwTle54eAHoNO0= @@ -381,7 +373,6 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.2.1/go.mod h1:T3Ct7dqS7GDtotzFk/cNe0fzhoPLLk8htiXMK+xQfHU= github.com/filecoin-project/index-provider v0.2.6 h1:JodDoTiLjDPifRxKSgoyDwD8qzbSZDcyn5IPF0osVAg= github.com/filecoin-project/index-provider v0.2.6/go.mod h1:y87dsIQdcmQS5PWIcifQdRb454ViVxjjFEccMDswIjQ= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -407,8 +398,6 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsG github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.2.2/go.mod h1:05vxs5u3vTQFAwGW9+pgWSMc3BgFOK513nPyIQyLwyQ= -github.com/filecoin-project/storetheindex v0.2.3/go.mod h1:US7ddOKCI+KQFcC3ipKuhK3i46EYlSCt5EvPhxBLfWI= github.com/filecoin-project/storetheindex v0.3.0 h1:M9C4BFLCKn6FJn2N/8q0VbX00hEjEWUuvJpscqKwqzQ= github.com/filecoin-project/storetheindex v0.3.0/go.mod h1:GhUmP8+nINxDRUqxQvTc3Fqc7Yp6w0dW/uTaYYIzd68= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -710,7 +699,6 @@ github.com/ipfs/go-block-format v0.0.3 h1:r8t66QstRp/pd/or4dpnbVfXT5Gt7lOqRvC+/d github.com/ipfs/go-block-format v0.0.3/go.mod h1:4LmD4ZUw0mhO+JSKdpWwrzATiEfM7WWgQ8H5l6P8MVk= github.com/ipfs/go-blockservice v0.0.7/go.mod h1:EOfb9k/Y878ZTRY/CH0x5+ATtaipfbRhbvNSdgc/7So= github.com/ipfs/go-blockservice v0.1.0/go.mod h1:hzmMScl1kXHg3M2BjTymbVPjv627N7sYcvYaKbop39M= -github.com/ipfs/go-blockservice v0.1.3/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.4/go.mod h1:OTZhFpkgY48kNzbgyvcexW9cHrpjBYIjSR0KoDOFOLU= github.com/ipfs/go-blockservice v0.1.7/go.mod h1:GmS+BAt4hrwBKkzE11AFDQUrnvqjwFatGS2MY7wOjEM= github.com/ipfs/go-blockservice v0.2.1 h1:NJ4j/cwEfIg60rzAWcCIxRtOwbf6ZPK49MewNxObCPQ= @@ -738,8 +726,6 @@ github.com/ipfs/go-datastore v0.4.1/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13X github.com/ipfs/go-datastore v0.4.2/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.4/go.mod h1:SX/xMIKoCszPqp+z9JhPYCmoOoXTvaa13XEbGtsFUhA= github.com/ipfs/go-datastore v0.4.5/go.mod h1:eXTcaaiN6uOlVCLS9GjJUJtlvJfM3xk23w3fyfrmmJs= -github.com/ipfs/go-datastore v0.4.6/go.mod h1:XSipLSc64rFKSFRFGo1ecQl+WhYce3K7frtpHkyPFUc= -github.com/ipfs/go-datastore v0.4.7-0.20211013204805-28a3721c2e66/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.0/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= github.com/ipfs/go-datastore v0.5.1 h1:WkRhLuISI+XPD0uk3OskB0fYFSyqK8Ob5ZYew9Qa1nQ= github.com/ipfs/go-datastore v0.5.1/go.mod h1:9zhEApYMTl17C8YDp7JmU7sQZi2/wqiYh73hakZ90Bk= @@ -750,7 +736,6 @@ github.com/ipfs/go-ds-badger v0.0.5/go.mod h1:g5AuuCGmr7efyzQhLL8MzwqcauPojGPUaH github.com/ipfs/go-ds-badger v0.0.7/go.mod h1:qt0/fWzZDoPW6jpQeqUjR5kBfhDNB65jd9YlmAvpQBk= github.com/ipfs/go-ds-badger v0.2.1/go.mod h1:Tx7l3aTph3FMFrRS838dcSJh+jjA7cX9DrGVwx/NOwE= github.com/ipfs/go-ds-badger v0.2.3/go.mod h1:pEYw0rgg3FIrywKKnL+Snr+w/LjJZVMTBRn4FS6UHUk= -github.com/ipfs/go-ds-badger v0.2.6/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.2.7/go.mod h1:02rnztVKA4aZwDuaRPTf8mpqcKmXP7mLl6JPxd14JHA= github.com/ipfs/go-ds-badger v0.3.0 h1:xREL3V0EH9S219kFFueOYJJTcjgNSZ2HY1iSvN7U1Ro= github.com/ipfs/go-ds-badger v0.3.0/go.mod h1:1ke6mXNqeV8K3y5Ak2bAA0osoTfmxUdupVCGm4QUIek= @@ -773,9 +758,7 @@ github.com/ipfs/go-filestore v1.1.0/go.mod h1:6e1/5Y6NvLuCRdmda/KA4GUhXJQ3Uat6vc github.com/ipfs/go-fs-lock v0.0.6/go.mod h1:OTR+Rj9sHiRubJh3dRhD15Juhd/+w6VPOY28L7zESmM= github.com/ipfs/go-fs-lock v0.0.7 h1:6BR3dajORFrFTkb5EpCUFIAypsoxpGpDSVUdFwzgL9U= github.com/ipfs/go-fs-lock v0.0.7/go.mod h1:Js8ka+FNYmgQRLrRXzU3CB/+Csr1BwrRilEcvYrHhhc= -github.com/ipfs/go-graphsync v0.10.0/go.mod h1:cKIshzTaa5rCZjryH5xmSKZVGX9uk1wvwGvz2WEha5Y= github.com/ipfs/go-graphsync v0.11.0/go.mod h1:wC+c8vGVjAHthsVIl8LKr37cUra2GOaMYcQNNmMxDqE= -github.com/ipfs/go-graphsync v0.11.5/go.mod h1:+/sZqRwRCQRrV7NCzgBtufmr5QGpUE98XSa7NlsztmM= github.com/ipfs/go-graphsync v0.12.0 h1:QCsVHVzb9FTkcm3NEa8GjXnUeGit1L9s08HcSVQ4m/g= github.com/ipfs/go-graphsync v0.12.0/go.mod h1:nASYWYETgsnMbQ3+DirNImOHQ8TY0a5AhAqyOY55tUg= github.com/ipfs/go-ipfs v0.11.0/go.mod h1:g68Thu2Ho11AWoHsN34P5fSK7iA6OWWRy3T/g8HLixc= @@ -784,10 +767,8 @@ github.com/ipfs/go-ipfs-blockstore v0.1.0/go.mod h1:5aD0AvHPi7mZc6Ci1WCAhiBQu2Is github.com/ipfs/go-ipfs-blockstore v0.1.4/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.1.6/go.mod h1:Jxm3XMVjh6R17WvxFEiyKBLUGr86HgIYJW/D/MwqeYQ= github.com/ipfs/go-ipfs-blockstore v0.2.1/go.mod h1:jGesd8EtCM3/zPgx+qr0/feTXGUeRai6adgwC+Q+JvE= -github.com/ipfs/go-ipfs-blockstore v1.0.1/go.mod h1:MGNZlHNEnR4KGgPHM3/k8lBySIOK2Ve+0KjZubKlaOE= github.com/ipfs/go-ipfs-blockstore v1.0.4-0.20210205083733-fb07d7bc5aec/go.mod h1:feuklK+m9POeWJzYQO7l05yNEgUiX5oELBNA8/Be33E= github.com/ipfs/go-ipfs-blockstore v1.0.4/go.mod h1:uL7/gTJ8QIZ3MtA3dWf+s1a0U3fJy2fcEZAsovpRp+w= -github.com/ipfs/go-ipfs-blockstore v1.1.0/go.mod h1:5QDUApRqpgPcfGstCxYeMnjt/DYQtXXdJVCvxHHuWVk= github.com/ipfs/go-ipfs-blockstore v1.1.1/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= github.com/ipfs/go-ipfs-blockstore v1.1.2 h1:WCXoZcMYnvOTmlpX+RSSnhVN0uCmbWTeepTGX5lgiXw= github.com/ipfs/go-ipfs-blockstore v1.1.2/go.mod h1:w51tNR9y5+QXB0wkNcHt4O2aSZjTdqaEWaQdSxEyUOY= @@ -938,7 +919,6 @@ github.com/ipld/go-ipld-prime v0.14.0/go.mod h1:9ASQLwUFLptCov6lIYc70GRB4V7UTyLD github.com/ipld/go-ipld-prime v0.14.1/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.2/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.3-0.20211207234443-319145880958/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= -github.com/ipld/go-ipld-prime v0.14.3/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime v0.14.4 h1:bqhmume8+nbNsX4/+J6eohktfZHAI8GKrF3rQ0xgOyc= github.com/ipld/go-ipld-prime v0.14.4/go.mod h1:QcE4Y9n/ZZr8Ijg5bGPT0GqYWgZ1704nH0RDcQtgTP0= github.com/ipld/go-ipld-prime-proto v0.0.0-20191113031812-e32bd156a1e5/go.mod h1:gcvzoEDBjwycpXt3LBE061wT9f46szXGHAmj9uoP6fU= @@ -1079,7 +1059,6 @@ github.com/libp2p/go-libp2p v0.13.0/go.mod h1:pM0beYdACRfHO1WcJlp65WXyG2A6NqYM+t github.com/libp2p/go-libp2p v0.14.0/go.mod h1:dsQrWLAoIn+GkHPN/U+yypizkHiB9tnv79Os+kSgQ4Q= github.com/libp2p/go-libp2p v0.14.3/go.mod h1:d12V4PdKbpL0T1/gsUNN8DfgMuRPDX8bS2QxCZlwRH0= github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m2kJVru3rM= -github.com/libp2p/go-libp2p v0.15.0/go.mod h1:8Ljmwon0cZZYKrOCjFeLwQEK8bqR42dOheUZ1kSKhP0= github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= @@ -1165,7 +1144,6 @@ github.com/libp2p/go-libp2p-discovery v0.1.0/go.mod h1:4F/x+aldVHjHDHuX85x1zWoFT github.com/libp2p/go-libp2p-discovery v0.2.0/go.mod h1:s4VGaxYMbw4+4+tsoQTqh7wfxg97AEdo4GYBt6BadWg= github.com/libp2p/go-libp2p-discovery v0.3.0/go.mod h1:o03drFnz9BVAZdzC/QUQ+NeQOu38Fu7LJGEOK2gQltw= github.com/libp2p/go-libp2p-discovery v0.5.0/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= -github.com/libp2p/go-libp2p-discovery v0.5.1/go.mod h1:+srtPIU9gDaBNu//UHvcdliKBIcr4SfDcm0/PfPJLug= github.com/libp2p/go-libp2p-discovery v0.6.0 h1:1XdPmhMJr8Tmj/yUfkJMIi8mgwWrLUsCB3bMxdT+DSo= github.com/libp2p/go-libp2p-discovery v0.6.0/go.mod h1:/u1voHt0tKIe5oIA1RHBKQLVCWPna2dXmPNHc2zR9S8= github.com/libp2p/go-libp2p-gostream v0.3.0/go.mod h1:pLBQu8db7vBMNINGsAwLL/ZCE8wng5V1FThoaE5rNjc= @@ -1211,7 +1189,6 @@ github.com/libp2p/go-libp2p-netutil v0.1.0 h1:zscYDNVEcGxyUpMd0JReUZTrpMfia8PmLK github.com/libp2p/go-libp2p-netutil v0.1.0/go.mod h1:3Qv/aDqtMLTUyQeundkKsA+YCThNdbQD54k3TqjpbFU= github.com/libp2p/go-libp2p-noise v0.1.1/go.mod h1:QDFLdKX7nluB7DEnlVPbz7xlLHdwHFA9HiohJRr3vwM= github.com/libp2p/go-libp2p-noise v0.2.0/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= -github.com/libp2p/go-libp2p-noise v0.2.2/go.mod h1:IEbYhBBzGyvdLBoxxULL/SGbJARhUeqlO8lVSREYu2Q= github.com/libp2p/go-libp2p-noise v0.3.0 h1:NCVH7evhVt9njbTQshzT7N1S3Q6fjj9M11FCgfH5+cA= github.com/libp2p/go-libp2p-noise v0.3.0/go.mod h1:JNjHbociDJKHD64KTkzGnzqJ0FEV5gHJa6AB00kbCNQ= github.com/libp2p/go-libp2p-peer v0.0.1/go.mod h1:nXQvOBbwVqoP+T5Y5nCjeH4sP9IX/J0AMzcDUVruVoo= @@ -1236,7 +1213,6 @@ github.com/libp2p/go-libp2p-pnet v0.2.0/go.mod h1:Qqvq6JH/oMZGwqs3N1Fqhv8NVhrdYc github.com/libp2p/go-libp2p-protocol v0.0.1/go.mod h1:Af9n4PiruirSDjHycM1QuiMi/1VZNHYcK8cLgFJLZ4s= github.com/libp2p/go-libp2p-protocol v0.1.0/go.mod h1:KQPHpAabB57XQxGrXCNvbL6UEXfQqUgC/1adR2Xtflk= github.com/libp2p/go-libp2p-pubsub v0.1.1/go.mod h1:ZwlKzRSe1eGvSIdU5bD7+8RZN/Uzw0t1Bp9R1znpR/Q= -github.com/libp2p/go-libp2p-pubsub v0.5.6/go.mod h1:gVOzwebXVdSMDQBTfH8ACO5EJ4SQrvsHqCmYsCZpD0E= github.com/libp2p/go-libp2p-pubsub v0.6.0/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= github.com/libp2p/go-libp2p-pubsub v0.6.1 h1:wycbV+f4rreCoVY61Do6g/BUk0RIrbNRcYVbn+QkjGk= github.com/libp2p/go-libp2p-pubsub v0.6.1/go.mod h1:nJv87QM2cU0w45KPR1rZicq+FmFIOD16zmT+ep1nOmg= @@ -1298,7 +1274,6 @@ github.com/libp2p/go-libp2p-testing v0.6.0/go.mod h1:QBk8fqIL1XNcno/l3/hhaIEn4aL github.com/libp2p/go-libp2p-testing v0.7.0 h1:9bfyhNINizxuLrKsenzGaZalXRXIaAEmx1BP/PzF1gM= github.com/libp2p/go-libp2p-testing v0.7.0/go.mod h1:OLbdn9DbgdMwv00v+tlp1l3oe2Cl+FAjoWIA2pa0X6E= github.com/libp2p/go-libp2p-tls v0.1.3/go.mod h1:wZfuewxOndz5RTnCAxFliGjvYSDA40sKitV4c50uI1M= -github.com/libp2p/go-libp2p-tls v0.2.0/go.mod h1:twrp2Ci4lE2GYspA1AnlYm+boYjqVruxDKJJj7s6xrc= github.com/libp2p/go-libp2p-tls v0.3.0/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= github.com/libp2p/go-libp2p-tls v0.3.1 h1:lsE2zYte+rZCEOHF72J1Fg3XK3dGQyKvI6i5ehJfEp0= github.com/libp2p/go-libp2p-tls v0.3.1/go.mod h1:fwF5X6PWGxm6IDRwF3V8AVCCj/hOd5oFlg+wo2FxJDY= @@ -1401,7 +1376,6 @@ github.com/libp2p/go-tcp-transport v0.2.1/go.mod h1:zskiJ70MEfWz2MKxvFB/Pv+tPIB1 github.com/libp2p/go-tcp-transport v0.2.3/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.4/go.mod h1:9dvr03yqrPyYGIEN6Dy5UvdJZjyPFvl1S/igQ5QD1SU= github.com/libp2p/go-tcp-transport v0.2.7/go.mod h1:lue9p1b3VmZj1MhhEGB/etmvF/nBQ0X9CW2DutBT3MM= -github.com/libp2p/go-tcp-transport v0.2.8/go.mod h1:64rSfVidkYPLqbzpcN2IwHY4pmgirp67h++hZ/rcndQ= github.com/libp2p/go-tcp-transport v0.4.0/go.mod h1:0y52Rwrn4076xdJYu/51/qJIdxz+EWDAOG2S45sV3VI= github.com/libp2p/go-tcp-transport v0.5.0 h1:3ZPW8HAuyRAuFzyabE0hSrCXKKSWzROnZZX7DtcIatY= github.com/libp2p/go-tcp-transport v0.5.0/go.mod h1:UPPL0DIjQqiWRwVAb+CEQlaAG0rp/mCqJfIhFcLHc4Y= @@ -1434,7 +1408,6 @@ github.com/libp2p/go-yamux/v2 v2.3.0/go.mod h1:iTU+lOIn/2h0AgKcL49clNTwfEw+WSfDY github.com/libp2p/go-yamux/v3 v3.0.1/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= github.com/libp2p/go-yamux/v3 v3.0.2 h1:LW0q5+A1Wy0npEsPJP9wmare2NH4ohNluN5EWVwv2mE= github.com/libp2p/go-yamux/v3 v3.0.2/go.mod h1:s2LsDhHbh+RfCsQoICSYt58U2f8ijtPANFD8BmE74Bo= -github.com/libp2p/zeroconf/v2 v2.0.0/go.mod h1:J85R/d9joD8u8F9aHM8pBXygtG9W02enEwS+wWeL6yo= github.com/libp2p/zeroconf/v2 v2.1.1/go.mod h1:fuJqLnUwZTshS3U/bMRJ3+ow/v9oid1n0DmyYyNO1Xs= github.com/lightstep/lightstep-tracer-common/golang/gogo v0.0.0-20190605223551-bc2310a04743/go.mod h1:qklhhLq1aX+mtWk9cPHPzaBjWImj5ULL6C7HFJtXQMM= github.com/lightstep/lightstep-tracer-go v0.18.1/go.mod h1:jlF1pusYV4pidLvZ+XD0UBX0ZE6WURAspgAczcDHrL4= @@ -1956,7 +1929,6 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20210713220151-be142a5ae1a8/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= @@ -2185,7 +2157,6 @@ golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzB golang.org/x/mod v0.1.1-0.20191209134235-331c550502dd/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180719180050-a680a1efc54d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2464,7 +2435,6 @@ golang.org/x/tools v0.0.0-20201112185108-eeaa07dd7696/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.1.1-0.20210225150353-54dc8c5edb56/go.mod h1:9bzcO0MWcOuT0tm1iBGzDVPshzfwoVvREIui8C+MHqU= golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 34b27d9d75f..c8a30b9d656 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -611,6 +611,11 @@ func StorageProvider(minerAddress dtypes.MinerAddress, opt := storageimpl.CustomDealDecisionLogic(storageimpl.DealDeciderFunc(df)) + ai, err := fullnodeApi.NetAddrsListen(context.Background()) + if err != nil { + return nil, err + } + return storageimpl.NewProvider( net, namespace.Wrap(ds, datastore.NewKey("/deals/provider")), @@ -622,7 +627,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, spn, address.Address(minerAddress), storedAsk, - fullnodeApi, + ai, idxProvHost.Host, opt, ) From 79403f169e44da63cbf493e7d1ef0f8f0d542429 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 2 Feb 2022 13:18:53 +0100 Subject: [PATCH 47/99] fix autogenerated docs --- documentation/en/default-lotus-miner-config.toml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 345a2b91cdb..f6f3e1d689a 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -270,6 +270,9 @@ # env var: LOTUS_INDEXERPROVIDER_PURGELINKCACHE #PurgeLinkCache = false + # env var: LOTUS_INDEXERPROVIDER_PUBLISHERKIND + #PublisherKind = "dtsync" + # Binding address for the libp2p host - 0 means random port. # Format: multiaddress; see https://multiformats.io/multiaddr/ # @@ -292,6 +295,10 @@ # env var: LOTUS_INDEXERPROVIDER_MAXSIMULTANEOUSTRANSFERS #MaxSimultaneousTransfers = 20 + [IndexerProvider.HttpPublisher] + # env var: LOTUS_INDEXERPROVIDER_HTTPPUBLISHER_LISTENMULTIADDR + #ListenMultiaddr = "/ip4/0.0.0.0/tcp/3104/http" + [Sealing] # Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time. From 03dd33dbbe784e9d759c625446ca14757190e342 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 2 Feb 2022 14:07:41 +0100 Subject: [PATCH 48/99] upgrade go-fil-markets --- go.mod | 2 +- go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/go.mod b/go.mod index 970e0d1647c..cf587739217 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202130458-93e4c64218c2 github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index 5ba5e5e6432..bc1d2b46acc 100644 --- a/go.sum +++ b/go.sum @@ -338,6 +338,8 @@ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7L github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac h1:5k1TVKQzIcI+/ZA9i7u2Lq4JVRlWxYj7qKAWO4ltZZA= github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202130458-93e4c64218c2 h1:00InEPicixNXm0Ovvy0u8EpWrNgXkxLQ64SImOn9MR4= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202130458-93e4c64218c2/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From faa3a79a5f0fd734703bac4686127673f0b08437 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 2 Feb 2022 16:01:19 +0100 Subject: [PATCH 49/99] use NetAddrListener iface --- node/modules/storageminer.go | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index c8a30b9d656..34b27d9d75f 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -611,11 +611,6 @@ func StorageProvider(minerAddress dtypes.MinerAddress, opt := storageimpl.CustomDealDecisionLogic(storageimpl.DealDeciderFunc(df)) - ai, err := fullnodeApi.NetAddrsListen(context.Background()) - if err != nil { - return nil, err - } - return storageimpl.NewProvider( net, namespace.Wrap(ds, datastore.NewKey("/deals/provider")), @@ -627,7 +622,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, spn, address.Address(minerAddress), storedAsk, - ai, + fullnodeApi, idxProvHost.Host, opt, ) From c3d41d4e17a07fb38e5fb2ebbb15f29abcab9047 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Wed, 2 Feb 2022 16:12:28 +0100 Subject: [PATCH 50/99] upgrade go-fil-markets --- go.mod | 2 +- go.sum | 6 ++---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/go.mod b/go.mod index cf587739217..b1720761287 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202130458-93e4c64218c2 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630 github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index bc1d2b46acc..a3753f8d1f1 100644 --- a/go.sum +++ b/go.sum @@ -336,10 +336,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac h1:5k1TVKQzIcI+/ZA9i7u2Lq4JVRlWxYj7qKAWO4ltZZA= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202115512-c1c9ba8722ac/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202130458-93e4c64218c2 h1:00InEPicixNXm0Ovvy0u8EpWrNgXkxLQ64SImOn9MR4= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202130458-93e4c64218c2/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630 h1:h46LVtyElHCjLt7JtIPHjLId+H65izL0ytZ9EC/hA44= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 235377585d45c3e1b478aa4518da3f81dc1ea79f Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 3 Feb 2022 11:51:01 +0000 Subject: [PATCH 51/99] Clarify the purpose of `MaxSimultaneousTransfers` config Clarify the documentation of `MaxSimultaneousTransfers` to state that the "transfer" refers to multihash syncing only and not the data itself. --- documentation/en/default-lotus-miner-config.toml | 4 ++-- node/config/doc_gen.go | 3 +-- node/config/types.go | 4 ++-- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 345a2b91cdb..07328bb7794 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -285,8 +285,8 @@ # env var: LOTUS_INDEXERPROVIDER_ANNOUNCEADDRESSES #AnnounceAddresses = [] - # The maximum number of simultaneous data transfers between the indexers - # and the indexer provider + # The maximum number of simultaneous requests syncing the list of advertised multihashes between + # the indexers and the index provider. # # type: uint64 # env var: LOTUS_INDEXERPROVIDER_MAXSIMULTANEOUSTRANSFERS diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 1b7c20b6394..8e7a1a963d4 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -378,8 +378,7 @@ Format: multiaddress`, Name: "MaxSimultaneousTransfers", Type: "uint64", - Comment: `The maximum number of simultaneous data transfers between the indexers -and the indexer provider`, + Comment: `The maximum number of simultaneous requests syncing the list of advertised multihashes between the indexers and the index provider.`, }, }, "Libp2p": []DocField{ diff --git a/node/config/types.go b/node/config/types.go index 428f1d59bee..18f27feeac3 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -173,8 +173,8 @@ type IndexerProviderConfig struct { // Format: multiaddress AnnounceAddresses []string - // The maximum number of simultaneous data transfers between the indexers - // and the indexer provider + // The maximum number of simultaneous requests syncing the list of advertised multihashes + // between the indexers and the index provider. MaxSimultaneousTransfers uint64 } From 575e6add435b3eac6daab80522cba44b5e827a59 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 3 Feb 2022 11:51:01 +0000 Subject: [PATCH 52/99] Rename `IndexerProvider` to `IndexProvider` and add more docs Rename the config section corresponding to indexing to `IndexProvider` for better readability. Update existing docs for better clarity and add docs for config parameters embedded from `index-provider` `Ingest` config library. --- .../en/default-lotus-miner-config.toml | 45 +++++++++++++------ itests/deals_concurrent_test.go | 10 ++--- itests/kit/deals.go | 6 +-- node/builder_miner.go | 2 +- node/config/def.go | 4 +- node/config/def_test.go | 2 +- node/config/doc_gen.go | 21 +++++---- node/config/types.go | 34 +++++++------- node/modules/storageminer_idxprov.go | 14 +++--- 9 files changed, 81 insertions(+), 57 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 07328bb7794..79b4efb87af 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -257,39 +257,58 @@ #Path = "" -[IndexerProvider] - # env var: LOTUS_INDEXERPROVIDER_LINKCACHESIZE +[IndexProvider] + # The maximum number of multihash chunk links that index provider cash can store before + # LRU eviction. If chunks belonging to a single advertisement are larger than the cache can + # hold, the cache is resized to be able to hold all links. The actual disk usaed depends on + # LinkedChunkSize and the length of multihashes. For example, for 128-bit long multihashes + # with the default LinkedChunkSize, and LinkCacheSize the cache size can grow to 256MiB. + # + # type int + # env var: LOTUS_INDEXPROVIDER_LINKCACHESIZE #LinkCacheSize = 1024 - # env var: LOTUS_INDEXERPROVIDER_LINKEDCHUNKSIZE + # The number of multihashes in each chunk of the + # advertised multihash entries linked list. If multihashes are 128-bit, then + # setting LinkedChunkSize = 16384 will result in blocks of 0.25MiB when + # full. + # + # type int + # env var: LOTUS_INDEXPROVIDER_LINKEDCHUNKSIZE #LinkedChunkSize = 16384 - # env var: LOTUS_INDEXERPROVIDER_PUBSUBTOPIC + # The gossipsub topic name used to publish change to the advertised content. + # + # env var: LOTUS_INDEXPROVIDER_PUBSUBTOPIC #PubSubTopic = "/indexer/ingest/mainnet" - # env var: LOTUS_INDEXERPROVIDER_PURGELINKCACHE + # Whether to purge all cached entries on start-up. + # + # env var: LOTUS_INDEXPROVIDER_PURGELINKCACHE #PurgeLinkCache = false - # Binding address for the libp2p host - 0 means random port. - # Format: multiaddress; see https://multiformats.io/multiaddr/ + # Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised + # multihashes. Note that when port is set to 0 a random port is generated at runtime and may be + # different on every restart. The format of the strings specified must conform to multiaddress; + # see https://multiformats.io/multiaddr/ # # type: []string - # env var: LOTUS_INDEXERPROVIDER_LISTENADDRESSES + # env var: LOTUS_INDEXPROVIDER_LISTENADDRESSES #ListenAddresses = ["/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0"] - # Addresses to explicitly announce to other peers. If not specified, - # all interface addresses are announced - # Format: multiaddress + # The address the endpoints at which the data associated to the advertised + # multihashes can be retrieved. If not specified, the ListenAddresses are used instead. The format + # of the strings specified must conform to multiaddress; see https://multiformats.io/multiaddr/ # # type: []string - # env var: LOTUS_INDEXERPROVIDER_ANNOUNCEADDRESSES + # env var: LOTUS_INDEXPROVIDER_ANNOUNCEADDRESSES #AnnounceAddresses = [] # The maximum number of simultaneous requests syncing the list of advertised multihashes between # the indexers and the index provider. # # type: uint64 - # env var: LOTUS_INDEXERPROVIDER_MAXSIMULTANEOUSTRANSFERS + # env var: LOTUS_INDEXPROVIDER_MAXSIMULTANEOUSTRANSFERS #MaxSimultaneousTransfers = 20 diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index 3bc5e4813cf..624e253b441 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -55,11 +55,11 @@ func TestDealWithMarketAndMinerNode(t *testing.T) { dh := kit.NewDealHarness(t, client, main, market) dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{ - N: n, - FastRetrieval: fastRetrieval, - CarExport: carExport, - StartEpoch: startEpoch, - IndexerProvider: idxProv, + N: n, + FastRetrieval: fastRetrieval, + CarExport: carExport, + StartEpoch: startEpoch, + IndexProvider: idxProv, }) } diff --git a/itests/kit/deals.go b/itests/kit/deals.go index ca3848c588b..44f785d3df3 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -406,7 +406,7 @@ type RunConcurrentDealsOpts struct { CarExport bool StartEpoch abi.ChainEpoch UseCARFileForStorageDeal bool - IndexerProvider *shared_testutil.MockIndexProvider + IndexProvider *shared_testutil.MockIndexProvider } func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { @@ -434,8 +434,8 @@ func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { }) // Check that the storage provider announced the deal to indexers - if opts.IndexerProvider != nil { - notifs := opts.IndexerProvider.GetNotifs() + if opts.IndexProvider != nil { + notifs := opts.IndexProvider.GetNotifs() _, ok := notifs[string(deal.Bytes())] require.True(dh.t, ok) } diff --git a/node/builder_miner.go b/node/builder_miner.go index de22ef8aa60..afac1e8280a 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -168,7 +168,7 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(dtypes.ProviderTransferNetwork), modules.NewProviderTransferNetwork), Override(new(dtypes.ProviderTransport), modules.NewProviderTransport), Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDataTransfer), - Override(new(provider.Interface), modules.IndexerProvider(cfg.IndexerProvider)), + Override(new(provider.Interface), modules.IndexProvider(cfg.IndexProvider)), Override(new(*storedask.StoredAsk), modules.NewStorageAsk), Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, nil)), Override(new(storagemarket.StorageProvider), modules.StorageProvider), diff --git a/node/config/def.go b/node/config/def.go index d6fedc7539e..75e2a08a3d2 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -181,7 +181,7 @@ func DefaultStorageMiner() *StorageMiner { }, }, - IndexerProvider: IndexerProviderConfig{ + IndexProvider: IndexProviderConfig{ ListenAddresses: []string{ "/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0", @@ -234,7 +234,7 @@ func DefaultStorageMiner() *StorageMiner { // TODO: Remove hardcoded defaults once provider library exposes them. // See: https://github.com/filecoin-project/index-provider/issues/108 - cfg.IndexerProvider.Ingest = ipconfig.NewIngest() + cfg.IndexProvider.Ingest = ipconfig.NewIngest() cfg.Common.API.ListenAddress = "/ip4/127.0.0.1/tcp/2345/http" cfg.Common.API.RemoteListenAddress = "127.0.0.1:2345" diff --git a/node/config/def_test.go b/node/config/def_test.go index e6ad1a68719..c25b255bfd3 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -55,5 +55,5 @@ func TestDefaultMinerRoundtrip(t *testing.T) { func TestDefaultStorageMiner_SetsIndexIngestTopic(t *testing.T) { subject := DefaultStorageMiner() - require.Equal(t, "/indexer/ingest/mainnet", subject.IndexerProvider.PubSubTopic) + require.Equal(t, "/indexer/ingest/mainnet", subject.IndexProvider.PubSubTopic) } diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 8e7a1a963d4..d7c500e6716 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -358,27 +358,30 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f Comment: ``, }, }, - "IndexerProviderConfig": []DocField{ + "IndexProviderConfig": []DocField{ { Name: "ListenAddresses", Type: "[]string", - Comment: `Binding address for the libp2p host - 0 means random port. -Format: multiaddress; see https://multiformats.io/multiaddr/`, + Comment: `Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised +multihashes. Note that when port is set to 0 a random port is generated at runtime and may be +different on every restart. The format of the strings specified must conform to multiaddress; +see https://multiformats.io/multiaddr/`, }, { Name: "AnnounceAddresses", Type: "[]string", - Comment: `Addresses to explicitly announce to other peers. If not specified, -all interface addresses are announced -Format: multiaddress`, + Comment: `The address the endpoints at which the data associated to the advertised +multihashes can be retrieved. If not specified, the ListenAddresses are used instead. The format +of the strings specified must conform to multiaddress; see https://multiformats.io/multiaddr/`, }, { Name: "MaxSimultaneousTransfers", Type: "uint64", - Comment: `The maximum number of simultaneous requests syncing the list of advertised multihashes between the indexers and the index provider.`, + Comment: `The maximum number of simultaneous requests syncing the list of advertised multihashes between +the indexers and the index provider.`, }, }, "Libp2p": []DocField{ @@ -857,8 +860,8 @@ Default is 20 (about once a week).`, Comment: ``, }, { - Name: "IndexerProvider", - Type: "IndexerProviderConfig", + Name: "IndexProvider", + Type: "IndexProviderConfig", Comment: ``, }, diff --git a/node/config/types.go b/node/config/types.go index 18f27feeac3..b73e957f600 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -45,14 +45,14 @@ type Backup struct { type StorageMiner struct { Common - Subsystems MinerSubsystemConfig - Dealmaking DealmakingConfig - IndexerProvider IndexerProviderConfig - Sealing SealingConfig - Storage sectorstorage.SealerConfig - Fees MinerFeeConfig - Addresses MinerAddressConfig - DAGStore DAGStoreConfig + Subsystems MinerSubsystemConfig + Dealmaking DealmakingConfig + IndexProvider IndexProviderConfig + Sealing SealingConfig + Storage sectorstorage.SealerConfig + Fees MinerFeeConfig + Addresses MinerAddressConfig + DAGStore DAGStoreConfig } type DAGStoreConfig struct { @@ -161,20 +161,22 @@ type DealmakingConfig struct { RetrievalPricing *RetrievalPricing } -type IndexerProviderConfig struct { +type IndexProviderConfig struct { config.Ingest - // Binding address for the libp2p host - 0 means random port. - // Format: multiaddress; see https://multiformats.io/multiaddr/ + // Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised + // multihashes. Note that when port is set to 0 a random port is generated at runtime and may be + // different on every restart. The format of the strings specified must conform to multiaddress; + // see https://multiformats.io/multiaddr/ ListenAddresses []string - // Addresses to explicitly announce to other peers. If not specified, - // all interface addresses are announced - // Format: multiaddress + // The address the endpoints at which the data associated to the advertised + // multihashes can be retrieved. If not specified, the ListenAddresses are used instead. The format + // of the strings specified must conform to multiaddress; see https://multiformats.io/multiaddr/ AnnounceAddresses []string - // The maximum number of simultaneous requests syncing the list of advertised multihashes - // between the indexers and the index provider. + // The maximum number of simultaneous requests syncing the list of advertised multihashes between + // the indexers and the index provider. MaxSimultaneousTransfers uint64 } diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 8a0d2105733..b5caf3e59c4 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -48,7 +48,7 @@ type IdxProv struct { peerstore.Peerstore } -func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, marketHost host.Host) (provider.Interface, error) { +func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host) (provider.Interface, error) { return func(args IdxProv, marketHost host.Host) (provider.Interface, error) { ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/indexer-provider")) @@ -57,12 +57,12 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, mark return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) } - h, err := createIndexerProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses, cfg.AnnounceAddresses) + h, err := createIndexProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses, cfg.AnnounceAddresses) if err != nil { return nil, xerrors.Errorf("creating indexer provider host: %w", err) } - dt, err := newIndexerProviderDataTransfer(cfg, args.MetricsCtx, args.Lifecycle, args.Repo, h, ipds) + dt, err := newIndexProviderDataTransfer(cfg, args.MetricsCtx, args.Lifecycle, args.Repo, h, ipds) if err != nil { return nil, err } @@ -96,7 +96,7 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, mark } } -func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string, announceAddrs []string) (host.Host, error) { +func createIndexProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string, announceAddrs []string) (host.Host, error) { addrsFactory, err := lp2p.MakeAddrsFactory(announceAddrs, nil) if err != nil { return nil, err @@ -125,11 +125,11 @@ func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci return h, nil } -func newIndexerProviderDataTransfer(cfg config.IndexerProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, h host.Host, ds datastore.Batching) (datatransfer.Manager, error) { +func newIndexProviderDataTransfer(cfg config.IndexProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, h host.Host, ds datastore.Batching) (datatransfer.Manager, error) { net := dtnet.NewFromLibp2pHost(h) // Set up graphsync - gs := newIndexerProviderGraphsync(cfg, mctx, lc, h) + gs := newIndexProviderGraphsync(cfg, mctx, lc, h) // Set up data transfer dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/transfers")) @@ -153,7 +153,7 @@ func newIndexerProviderDataTransfer(cfg config.IndexerProviderConfig, mctx helpe return dt, nil } -func newIndexerProviderGraphsync(cfg config.IndexerProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host) graphsync.GraphExchange { +func newIndexProviderGraphsync(cfg config.IndexProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host) graphsync.GraphExchange { graphsyncNetwork := gsnet.NewFromLibp2pHost(h) return graphsyncimpl.New(helpers.LifecycleCtx(mctx, lc), graphsyncNetwork, From 6ef0c382c3445595406b14e22f56d1ec4c4056b3 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 3 Feb 2022 13:24:46 +0000 Subject: [PATCH 53/99] Fix typos in default miner config --- documentation/en/default-lotus-miner-config.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 79b4efb87af..6fad2700c09 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -258,9 +258,9 @@ [IndexProvider] - # The maximum number of multihash chunk links that index provider cash can store before + # The maximum number of multihash chunk links that index provider cache can store before # LRU eviction. If chunks belonging to a single advertisement are larger than the cache can - # hold, the cache is resized to be able to hold all links. The actual disk usaed depends on + # hold, the cache is resized to be able to hold all links. The actual disk usage depends on # LinkedChunkSize and the length of multihashes. For example, for 128-bit long multihashes # with the default LinkedChunkSize, and LinkCacheSize the cache size can grow to 256MiB. # From 20fc5ffa387669dd077793685e6e876029c0c0a7 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 3 Feb 2022 14:43:20 +0100 Subject: [PATCH 54/99] fixing tests --- itests/kit/ensemble.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 0227ee81e70..56569ceaeff 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -541,6 +541,12 @@ func (n *Ensemble) Start() *Ensemble { node.Override(new(stmgr.UpgradeSchedule), n.options.upgradeSchedule), } + if m.options.subsystems.Has(SMarkets) { + opts = append(opts, + node.Override(new(*modules.IdxProvHost), node.MockHost(n.mn)), + ) + } + // append any node builder options. opts = append(opts, m.options.extraNodeOpts...) From 595ad44ee71e743e626b7144c2755eb28095faee Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 3 Feb 2022 15:44:18 +0100 Subject: [PATCH 55/99] refactor indexprovider libp2p host connection to fullnode with meshcreator --- .../en/default-lotus-miner-config.toml | 22 +++++----- go.mod | 2 +- go.sum | 2 + itests/deals_concurrent_test.go | 10 ++--- itests/kit/deals.go | 6 +-- itests/kit/ensemble.go | 4 +- markets/idxprov/host.go | 5 +++ markets/idxprov/idxprov_test/noop.go | 16 ++++++++ markets/idxprov/mesh.go | 40 +++++++++++++++++++ node/builder_miner.go | 6 ++- node/config/def.go | 4 +- node/config/def_test.go | 2 +- node/config/doc_gen.go | 6 +-- node/config/types.go | 18 ++++----- node/modules/storageminer.go | 9 +++-- node/modules/storageminer_idxprov.go | 27 ++++++------- 16 files changed, 122 insertions(+), 57 deletions(-) create mode 100644 markets/idxprov/host.go create mode 100644 markets/idxprov/idxprov_test/noop.go create mode 100644 markets/idxprov/mesh.go diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index f6f3e1d689a..0bc5cfe1e6f 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -257,27 +257,27 @@ #Path = "" -[IndexerProvider] - # env var: LOTUS_INDEXERPROVIDER_LINKCACHESIZE +[IndexProvider] + # env var: LOTUS_INDEXPROVIDER_LINKCACHESIZE #LinkCacheSize = 1024 - # env var: LOTUS_INDEXERPROVIDER_LINKEDCHUNKSIZE + # env var: LOTUS_INDEXPROVIDER_LINKEDCHUNKSIZE #LinkedChunkSize = 16384 - # env var: LOTUS_INDEXERPROVIDER_PUBSUBTOPIC + # env var: LOTUS_INDEXPROVIDER_PUBSUBTOPIC #PubSubTopic = "/indexer/ingest/mainnet" - # env var: LOTUS_INDEXERPROVIDER_PURGELINKCACHE + # env var: LOTUS_INDEXPROVIDER_PURGELINKCACHE #PurgeLinkCache = false - # env var: LOTUS_INDEXERPROVIDER_PUBLISHERKIND + # env var: LOTUS_INDEXPROVIDER_PUBLISHERKIND #PublisherKind = "dtsync" # Binding address for the libp2p host - 0 means random port. # Format: multiaddress; see https://multiformats.io/multiaddr/ # # type: []string - # env var: LOTUS_INDEXERPROVIDER_LISTENADDRESSES + # env var: LOTUS_INDEXPROVIDER_LISTENADDRESSES #ListenAddresses = ["/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0"] # Addresses to explicitly announce to other peers. If not specified, @@ -285,18 +285,18 @@ # Format: multiaddress # # type: []string - # env var: LOTUS_INDEXERPROVIDER_ANNOUNCEADDRESSES + # env var: LOTUS_INDEXPROVIDER_ANNOUNCEADDRESSES #AnnounceAddresses = [] # The maximum number of simultaneous data transfers between the indexers # and the indexer provider # # type: uint64 - # env var: LOTUS_INDEXERPROVIDER_MAXSIMULTANEOUSTRANSFERS + # env var: LOTUS_INDEXPROVIDER_MAXSIMULTANEOUSTRANSFERS #MaxSimultaneousTransfers = 20 - [IndexerProvider.HttpPublisher] - # env var: LOTUS_INDEXERPROVIDER_HTTPPUBLISHER_LISTENMULTIADDR + [IndexProvider.HttpPublisher] + # env var: LOTUS_INDEXPROVIDER_HTTPPUBLISHER_LISTENMULTIADDR #ListenMultiaddr = "/ip4/0.0.0.0/tcp/3104/http" diff --git a/go.mod b/go.mod index b1720761287..d26187b7d5e 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index a3753f8d1f1..88ba59b5bc0 100644 --- a/go.sum +++ b/go.sum @@ -338,6 +338,8 @@ github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7L github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630 h1:h46LVtyElHCjLt7JtIPHjLId+H65izL0ytZ9EC/hA44= github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee h1:mL4jV1+c5jA9823E4DUfUVSSqPS/jGz75QuIOXVLqvE= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/itests/deals_concurrent_test.go b/itests/deals_concurrent_test.go index 3bc5e4813cf..624e253b441 100644 --- a/itests/deals_concurrent_test.go +++ b/itests/deals_concurrent_test.go @@ -55,11 +55,11 @@ func TestDealWithMarketAndMinerNode(t *testing.T) { dh := kit.NewDealHarness(t, client, main, market) dh.RunConcurrentDeals(kit.RunConcurrentDealsOpts{ - N: n, - FastRetrieval: fastRetrieval, - CarExport: carExport, - StartEpoch: startEpoch, - IndexerProvider: idxProv, + N: n, + FastRetrieval: fastRetrieval, + CarExport: carExport, + StartEpoch: startEpoch, + IndexProvider: idxProv, }) } diff --git a/itests/kit/deals.go b/itests/kit/deals.go index ca3848c588b..44f785d3df3 100644 --- a/itests/kit/deals.go +++ b/itests/kit/deals.go @@ -406,7 +406,7 @@ type RunConcurrentDealsOpts struct { CarExport bool StartEpoch abi.ChainEpoch UseCARFileForStorageDeal bool - IndexerProvider *shared_testutil.MockIndexProvider + IndexProvider *shared_testutil.MockIndexProvider } func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { @@ -434,8 +434,8 @@ func (dh *DealHarness) RunConcurrentDeals(opts RunConcurrentDealsOpts) { }) // Check that the storage provider announced the deal to indexers - if opts.IndexerProvider != nil { - notifs := opts.IndexerProvider.GetNotifs() + if opts.IndexProvider != nil { + notifs := opts.IndexProvider.GetNotifs() _, ok := notifs[string(deal.Bytes())] require.True(dh.t, ok) } diff --git a/itests/kit/ensemble.go b/itests/kit/ensemble.go index 56569ceaeff..e0a549c2b06 100644 --- a/itests/kit/ensemble.go +++ b/itests/kit/ensemble.go @@ -36,6 +36,8 @@ import ( "github.com/filecoin-project/lotus/extern/sector-storage/ffiwrapper" "github.com/filecoin-project/lotus/extern/sector-storage/mock" "github.com/filecoin-project/lotus/genesis" + "github.com/filecoin-project/lotus/markets/idxprov" + idxprov_test "github.com/filecoin-project/lotus/markets/idxprov/idxprov_test" lotusminer "github.com/filecoin-project/lotus/miner" "github.com/filecoin-project/lotus/node" "github.com/filecoin-project/lotus/node/config" @@ -543,7 +545,7 @@ func (n *Ensemble) Start() *Ensemble { if m.options.subsystems.Has(SMarkets) { opts = append(opts, - node.Override(new(*modules.IdxProvHost), node.MockHost(n.mn)), + node.Override(new(idxprov.MeshCreator), idxprov_test.NewNoopMeshCreator), ) } diff --git a/markets/idxprov/host.go b/markets/idxprov/host.go new file mode 100644 index 00000000000..5e901a560f4 --- /dev/null +++ b/markets/idxprov/host.go @@ -0,0 +1,5 @@ +package idxprov + +import "github.com/libp2p/go-libp2p-core/host" + +type Host host.Host diff --git a/markets/idxprov/idxprov_test/noop.go b/markets/idxprov/idxprov_test/noop.go new file mode 100644 index 00000000000..535c13d2522 --- /dev/null +++ b/markets/idxprov/idxprov_test/noop.go @@ -0,0 +1,16 @@ +package idxprov_test + +import ( + "context" +) + +type NoopMeshCreator struct { +} + +func NewNoopMeshCreator() *NoopMeshCreator { + return &NoopMeshCreator{} +} + +func (mc NoopMeshCreator) Connect(ctx context.Context) error { + return nil +} diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go new file mode 100644 index 00000000000..d073bbb1e07 --- /dev/null +++ b/markets/idxprov/mesh.go @@ -0,0 +1,40 @@ +package idxprov + +import ( + "context" + "fmt" + + "github.com/filecoin-project/lotus/api/v1api" + + logging "github.com/ipfs/go-log/v2" +) + +var log = logging.Logger("idxprov") + +type MeshCreator interface { + Connect(ctx context.Context) error +} + +type Libp2pMeshCreator struct { + fullnodeApi v1api.FullNode + idxProvHost Host +} + +func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { + addrs, err := mc.fullnodeApi.NetAddrsListen(ctx) + if err != nil { + return err + } + + if err := mc.idxProvHost.Connect(ctx, addrs); err != nil { + return fmt.Errorf("failed to connect index provider host with the full node: %w", err) + } + mc.idxProvHost.ConnManager().Protect(addrs.ID, "markets") + log.Debugw("successfully connected to full node", "fullNodeInfo", addrs.String()) + + return nil +} + +func NewMeshCreator(fullnodeApi v1api.FullNode, idxProvHost Host) MeshCreator { + return Libp2pMeshCreator{fullnodeApi, idxProvHost} +} diff --git a/node/builder_miner.go b/node/builder_miner.go index e45e8d19a79..351a65be79e 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -26,6 +26,7 @@ import ( sealing "github.com/filecoin-project/lotus/extern/storage-sealing" "github.com/filecoin-project/lotus/markets/dagstore" "github.com/filecoin-project/lotus/markets/dealfilter" + "github.com/filecoin-project/lotus/markets/idxprov" "github.com/filecoin-project/lotus/markets/retrievaladapter" "github.com/filecoin-project/lotus/markets/sectoraccessor" "github.com/filecoin-project/lotus/markets/storageadapter" @@ -168,8 +169,9 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(dtypes.ProviderTransferNetwork), modules.NewProviderTransferNetwork), Override(new(dtypes.ProviderTransport), modules.NewProviderTransport), Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDataTransfer), - Override(new(*modules.IdxProvHost), modules.IndexerProviderHost(cfg.IndexerProvider)), - Override(new(provider.Interface), modules.IndexerProvider(cfg.IndexerProvider)), + Override(new(idxprov.MeshCreator), idxprov.NewMeshCreator), + Override(new(idxprov.Host), modules.IndexProviderHost(cfg.IndexProvider)), + Override(new(provider.Interface), modules.IndexProvider(cfg.IndexProvider)), Override(new(*storedask.StoredAsk), modules.NewStorageAsk), Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, nil)), Override(new(storagemarket.StorageProvider), modules.StorageProvider), diff --git a/node/config/def.go b/node/config/def.go index d6fedc7539e..75e2a08a3d2 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -181,7 +181,7 @@ func DefaultStorageMiner() *StorageMiner { }, }, - IndexerProvider: IndexerProviderConfig{ + IndexProvider: IndexProviderConfig{ ListenAddresses: []string{ "/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0", @@ -234,7 +234,7 @@ func DefaultStorageMiner() *StorageMiner { // TODO: Remove hardcoded defaults once provider library exposes them. // See: https://github.com/filecoin-project/index-provider/issues/108 - cfg.IndexerProvider.Ingest = ipconfig.NewIngest() + cfg.IndexProvider.Ingest = ipconfig.NewIngest() cfg.Common.API.ListenAddress = "/ip4/127.0.0.1/tcp/2345/http" cfg.Common.API.RemoteListenAddress = "127.0.0.1:2345" diff --git a/node/config/def_test.go b/node/config/def_test.go index e6ad1a68719..c25b255bfd3 100644 --- a/node/config/def_test.go +++ b/node/config/def_test.go @@ -55,5 +55,5 @@ func TestDefaultMinerRoundtrip(t *testing.T) { func TestDefaultStorageMiner_SetsIndexIngestTopic(t *testing.T) { subject := DefaultStorageMiner() - require.Equal(t, "/indexer/ingest/mainnet", subject.IndexerProvider.PubSubTopic) + require.Equal(t, "/indexer/ingest/mainnet", subject.IndexProvider.PubSubTopic) } diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index 1b7c20b6394..55392a9f30f 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -358,7 +358,7 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f Comment: ``, }, }, - "IndexerProviderConfig": []DocField{ + "IndexProviderConfig": []DocField{ { Name: "ListenAddresses", Type: "[]string", @@ -858,8 +858,8 @@ Default is 20 (about once a week).`, Comment: ``, }, { - Name: "IndexerProvider", - Type: "IndexerProviderConfig", + Name: "IndexProvider", + Type: "IndexProviderConfig", Comment: ``, }, diff --git a/node/config/types.go b/node/config/types.go index 428f1d59bee..35b6646c641 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -45,14 +45,14 @@ type Backup struct { type StorageMiner struct { Common - Subsystems MinerSubsystemConfig - Dealmaking DealmakingConfig - IndexerProvider IndexerProviderConfig - Sealing SealingConfig - Storage sectorstorage.SealerConfig - Fees MinerFeeConfig - Addresses MinerAddressConfig - DAGStore DAGStoreConfig + Subsystems MinerSubsystemConfig + Dealmaking DealmakingConfig + IndexProvider IndexProviderConfig + Sealing SealingConfig + Storage sectorstorage.SealerConfig + Fees MinerFeeConfig + Addresses MinerAddressConfig + DAGStore DAGStoreConfig } type DAGStoreConfig struct { @@ -161,7 +161,7 @@ type DealmakingConfig struct { RetrievalPricing *RetrievalPricing } -type IndexerProviderConfig struct { +type IndexProviderConfig struct { config.Ingest // Binding address for the libp2p host - 0 means random port. diff --git a/node/modules/storageminer.go b/node/modules/storageminer.go index 34b27d9d75f..1df076ff027 100644 --- a/node/modules/storageminer.go +++ b/node/modules/storageminer.go @@ -62,6 +62,7 @@ import ( "github.com/filecoin-project/lotus/journal" "github.com/filecoin-project/lotus/markets" "github.com/filecoin-project/lotus/markets/dagstore" + "github.com/filecoin-project/lotus/markets/idxprov" marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/markets/pricing" lotusminer "github.com/filecoin-project/lotus/miner" @@ -590,8 +591,7 @@ func StorageProvider(minerAddress dtypes.MinerAddress, spn storagemarket.StorageProviderNode, df dtypes.StorageDealFilter, dsw *dagstore.Wrapper, - fullnodeApi v1api.FullNode, - idxProvHost *IdxProvHost, + meshCreator idxprov.MeshCreator, ) (storagemarket.StorageProvider, error) { net := smnet.NewFromLibp2pHost(h) @@ -622,8 +622,9 @@ func StorageProvider(minerAddress dtypes.MinerAddress, spn, address.Address(minerAddress), storedAsk, - fullnodeApi, - idxProvHost.Host, + meshCreator, + //fullnodeApi, + //idxProvHost, opt, ) } diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index b200d23eb6a..e9ee94c57d9 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -29,6 +29,7 @@ import ( "github.com/libp2p/go-libp2p-core/host" "github.com/filecoin-project/lotus/build" + "github.com/filecoin-project/lotus/markets/idxprov" marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules/dtypes" @@ -48,28 +49,24 @@ type IdxProv struct { peerstore.Peerstore } -type IdxProvHost struct { - host.Host -} - -func IndexerProviderHost(cfg config.IndexerProviderConfig) func(IdxProv) (*IdxProvHost, error) { - return func(args IdxProv) (*IdxProvHost, error) { +func IndexProviderHost(cfg config.IndexProviderConfig) func(IdxProv) (idxprov.Host, error) { + return func(args IdxProv) (idxprov.Host, error) { pkey := args.Peerstore.PrivKey(args.PeerID) if pkey == nil { return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) } - h, err := createIndexerProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses, cfg.AnnounceAddresses) + h, err := createIndexProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses, cfg.AnnounceAddresses) if err != nil { return nil, xerrors.Errorf("creating indexer provider host: %w", err) } - return &IdxProvHost{h}, nil + return h, nil } } -func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, marketHost host.Host, h *IdxProvHost) (provider.Interface, error) { - return func(args IdxProv, marketHost host.Host, h *IdxProvHost) (provider.Interface, error) { +func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, h idxprov.Host) (provider.Interface, error) { + return func(args IdxProv, marketHost host.Host, h idxprov.Host) (provider.Interface, error) { ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/indexer-provider")) pkey := args.Peerstore.PrivKey(args.PeerID) @@ -77,7 +74,7 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, mark return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) } - dt, err := newIndexerProviderDataTransfer(cfg, args.MetricsCtx, args.Lifecycle, args.Repo, h, ipds) + dt, err := newIndexProviderDataTransfer(cfg, args.MetricsCtx, args.Lifecycle, args.Repo, h, ipds) if err != nil { return nil, err } @@ -111,7 +108,7 @@ func IndexerProvider(cfg config.IndexerProviderConfig) func(params IdxProv, mark } } -func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string, announceAddrs []string) (host.Host, error) { +func createIndexProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string, announceAddrs []string) (host.Host, error) { addrsFactory, err := lp2p.MakeAddrsFactory(announceAddrs, nil) if err != nil { return nil, err @@ -140,11 +137,11 @@ func createIndexerProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci return h, nil } -func newIndexerProviderDataTransfer(cfg config.IndexerProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, h host.Host, ds datastore.Batching) (datatransfer.Manager, error) { +func newIndexProviderDataTransfer(cfg config.IndexProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, h host.Host, ds datastore.Batching) (datatransfer.Manager, error) { net := dtnet.NewFromLibp2pHost(h) // Set up graphsync - gs := newIndexerProviderGraphsync(cfg, mctx, lc, h) + gs := newIndexProviderGraphsync(cfg, mctx, lc, h) // Set up data transfer dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/transfers")) @@ -168,7 +165,7 @@ func newIndexerProviderDataTransfer(cfg config.IndexerProviderConfig, mctx helpe return dt, nil } -func newIndexerProviderGraphsync(cfg config.IndexerProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host) graphsync.GraphExchange { +func newIndexProviderGraphsync(cfg config.IndexProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host) graphsync.GraphExchange { graphsyncNetwork := gsnet.NewFromLibp2pHost(h) return graphsyncimpl.New(helpers.LifecycleCtx(mctx, lc), graphsyncNetwork, From bb6235733d8714184a651d2c3132f708b9e5a86d Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 3 Feb 2022 15:48:05 +0100 Subject: [PATCH 56/99] go mod tidy --- go.sum | 2 -- 1 file changed, 2 deletions(-) diff --git a/go.sum b/go.sum index 88ba59b5bc0..977fa37fcc7 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,6 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630 h1:h46LVtyElHCjLt7JtIPHjLId+H65izL0ytZ9EC/hA44= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220202151058-ea0c8f1c8630/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee h1:mL4jV1+c5jA9823E4DUfUVSSqPS/jGz75QuIOXVLqvE= github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= From b6b5046ccee9323abc38542824cb1e57bcee1942 Mon Sep 17 00:00:00 2001 From: Anton Evangelatov Date: Thu, 3 Feb 2022 16:26:04 +0100 Subject: [PATCH 57/99] upgrade go-fil-markets --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index d26187b7d5e..2d3e7d232e7 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203152434-8790cca614d3 github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index 977fa37fcc7..b2ebceb1c3d 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee h1:mL4jV1+c5jA9823E4DUfUVSSqPS/jGz75QuIOXVLqvE= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203143446-7ec33d5dc6ee/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203152434-8790cca614d3 h1:ak9I3TaeAQof84/DsyJ2BO1rShP77OfyZEiVNltjYAs= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203152434-8790cca614d3/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 7247f8e41fda387cd26533b239d1a9b5b560dcf2 Mon Sep 17 00:00:00 2001 From: Will Scott Date: Thu, 3 Feb 2022 17:24:49 +0100 Subject: [PATCH 58/99] add net protect api methods fix #8015 --- api/api_net.go | 4 ++ api/mocks/mock_full.go | 43 +++++++++++++++ api/proxy_gen.go | 39 ++++++++++++++ api/v0api/v0mocks/mock_full.go | 43 +++++++++++++++ build/openrpc/full.json.gz | Bin 26596 -> 26585 bytes build/openrpc/miner.json.gz | Bin 13091 -> 13088 bytes build/openrpc/worker.json.gz | Bin 3915 -> 3917 bytes documentation/en/api-v0-methods-miner.md | 49 ++++++++++++++++++ documentation/en/api-v0-methods.md | 49 ++++++++++++++++++ documentation/en/api-v1-unstable-methods.md | 49 ++++++++++++++++++ .../en/default-lotus-miner-config.toml | 32 ++++-------- node/impl/net/protect.go | 35 +++++++++++++ 12 files changed, 322 insertions(+), 21 deletions(-) create mode 100644 node/impl/net/protect.go diff --git a/api/api_net.go b/api/api_net.go index 7dddb09ac0a..74581e3acda 100644 --- a/api/api_net.go +++ b/api/api_net.go @@ -51,6 +51,10 @@ type Net interface { NetBlockRemove(ctx context.Context, acl NetBlockList) error //perm:admin NetBlockList(ctx context.Context) (NetBlockList, error) //perm:read + NetProtectAdd(ctx context.Context, acl []peer.ID) error //perm:admin + NetProtectRemove(ctx context.Context, acl []peer.ID) error //perm:admin + NetProtectList(ctx context.Context) ([]peer.ID, error) //perm:read + // ResourceManager API NetStat(ctx context.Context, scope string) (NetStat, error) //perm:read NetLimit(ctx context.Context, scope string) (NetLimit, error) //perm:read diff --git a/api/mocks/mock_full.go b/api/mocks/mock_full.go index e985a794d0c..49c49e22ea3 100644 --- a/api/mocks/mock_full.go +++ b/api/mocks/mock_full.go @@ -1856,6 +1856,49 @@ func (mr *MockFullNodeMockRecorder) NetPeers(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPeers", reflect.TypeOf((*MockFullNode)(nil).NetPeers), arg0) } +// NetProtectAdd mocks base method. +func (m *MockFullNode) NetProtectAdd(arg0 context.Context, arg1 []peer.ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetProtectAdd", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetProtectAdd indicates an expected call of NetProtectAdd. +func (mr *MockFullNodeMockRecorder) NetProtectAdd(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetProtectAdd", reflect.TypeOf((*MockFullNode)(nil).NetProtectAdd), arg0, arg1) +} + +// NetProtectList mocks base method. +func (m *MockFullNode) NetProtectList(arg0 context.Context) ([]peer.ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetProtectList", arg0) + ret0, _ := ret[0].([]peer.ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetProtectList indicates an expected call of NetProtectList. +func (mr *MockFullNodeMockRecorder) NetProtectList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetProtectList", reflect.TypeOf((*MockFullNode)(nil).NetProtectList), arg0) +} + +// NetProtectRemove mocks base method. +func (m *MockFullNode) NetProtectRemove(arg0 context.Context, arg1 []peer.ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetProtectRemove", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetProtectRemove indicates an expected call of NetProtectRemove. +func (mr *MockFullNodeMockRecorder) NetProtectRemove(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetProtectRemove", reflect.TypeOf((*MockFullNode)(nil).NetProtectRemove), arg0, arg1) +} + // NetPubsubScores mocks base method. func (m *MockFullNode) NetPubsubScores(arg0 context.Context) ([]api.PubsubScore, error) { m.ctrl.T.Helper() diff --git a/api/proxy_gen.go b/api/proxy_gen.go index e9bf130a725..a4024ab729a 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -593,6 +593,12 @@ type NetStruct struct { NetPeers func(p0 context.Context) ([]peer.AddrInfo, error) `perm:"read"` + NetProtectAdd func(p0 context.Context, p1 []peer.ID) error `perm:"admin"` + + NetProtectList func(p0 context.Context) ([]peer.ID, error) `perm:"read"` + + NetProtectRemove func(p0 context.Context, p1 []peer.ID) error `perm:"admin"` + NetPubsubScores func(p0 context.Context) ([]PubsubScore, error) `perm:"read"` NetSetLimit func(p0 context.Context, p1 string, p2 NetLimit) error `perm:"admin"` @@ -3672,6 +3678,39 @@ func (s *NetStub) NetPeers(p0 context.Context) ([]peer.AddrInfo, error) { return *new([]peer.AddrInfo), ErrNotSupported } +func (s *NetStruct) NetProtectAdd(p0 context.Context, p1 []peer.ID) error { + if s.Internal.NetProtectAdd == nil { + return ErrNotSupported + } + return s.Internal.NetProtectAdd(p0, p1) +} + +func (s *NetStub) NetProtectAdd(p0 context.Context, p1 []peer.ID) error { + return ErrNotSupported +} + +func (s *NetStruct) NetProtectList(p0 context.Context) ([]peer.ID, error) { + if s.Internal.NetProtectList == nil { + return *new([]peer.ID), ErrNotSupported + } + return s.Internal.NetProtectList(p0) +} + +func (s *NetStub) NetProtectList(p0 context.Context) ([]peer.ID, error) { + return *new([]peer.ID), ErrNotSupported +} + +func (s *NetStruct) NetProtectRemove(p0 context.Context, p1 []peer.ID) error { + if s.Internal.NetProtectRemove == nil { + return ErrNotSupported + } + return s.Internal.NetProtectRemove(p0, p1) +} + +func (s *NetStub) NetProtectRemove(p0 context.Context, p1 []peer.ID) error { + return ErrNotSupported +} + func (s *NetStruct) NetPubsubScores(p0 context.Context) ([]PubsubScore, error) { if s.Internal.NetPubsubScores == nil { return *new([]PubsubScore), ErrNotSupported diff --git a/api/v0api/v0mocks/mock_full.go b/api/v0api/v0mocks/mock_full.go index 26d7959404b..e18c8bfe7ad 100644 --- a/api/v0api/v0mocks/mock_full.go +++ b/api/v0api/v0mocks/mock_full.go @@ -1769,6 +1769,49 @@ func (mr *MockFullNodeMockRecorder) NetPeers(arg0 interface{}) *gomock.Call { return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetPeers", reflect.TypeOf((*MockFullNode)(nil).NetPeers), arg0) } +// NetProtectAdd mocks base method. +func (m *MockFullNode) NetProtectAdd(arg0 context.Context, arg1 []peer.ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetProtectAdd", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetProtectAdd indicates an expected call of NetProtectAdd. +func (mr *MockFullNodeMockRecorder) NetProtectAdd(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetProtectAdd", reflect.TypeOf((*MockFullNode)(nil).NetProtectAdd), arg0, arg1) +} + +// NetProtectList mocks base method. +func (m *MockFullNode) NetProtectList(arg0 context.Context) ([]peer.ID, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetProtectList", arg0) + ret0, _ := ret[0].([]peer.ID) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// NetProtectList indicates an expected call of NetProtectList. +func (mr *MockFullNodeMockRecorder) NetProtectList(arg0 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetProtectList", reflect.TypeOf((*MockFullNode)(nil).NetProtectList), arg0) +} + +// NetProtectRemove mocks base method. +func (m *MockFullNode) NetProtectRemove(arg0 context.Context, arg1 []peer.ID) error { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "NetProtectRemove", arg0, arg1) + ret0, _ := ret[0].(error) + return ret0 +} + +// NetProtectRemove indicates an expected call of NetProtectRemove. +func (mr *MockFullNodeMockRecorder) NetProtectRemove(arg0, arg1 interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "NetProtectRemove", reflect.TypeOf((*MockFullNode)(nil).NetProtectRemove), arg0, arg1) +} + // NetPubsubScores mocks base method. func (m *MockFullNode) NetPubsubScores(arg0 context.Context) ([]api.PubsubScore, error) { m.ctrl.T.Helper() diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 7dec77e7cdd932d36240e255426f41fbff01e78e..7ca70d7d9a7bfd719c101badd45b7df84a32d2f5 100644 GIT binary patch delta 24963 zcmV*8Kykn1&jH!b0kHG}1M}sMllKCP16MB^lZ69#0d1511NDC|8zjR!#HFn7CK!_1 zOXWgp5{uIB5%f{C6jLU|d$EX%>@E=)Y1=t_SUzDP^2CBF%Zzqf%L$EpBs9v?x7Pm7 z6|uqXA231DU~e$l+}a-P42FXX>|G(*`X6U+Pa{evl{Wcs@FqZ>XkC~2Hu#LmA&m(i z?7bc?tDHFsa65lTz-LTO={eW5zkC}Qzg`Uo@~?vh7euQGoWe*<#Xdi@BKaBN>5LEd z2AhN7;JyAKeKARibAe0GD3znzN81VE4~Q{1MQ6xEIOME9@|tju6c0|$_ovecO(92u z>V;e+O&?uM$vI*i&O2%E{;FG10UX; zpYOkWa}JI_f_-p)`sVQX?eQTvIQew=o1l2~34Hu?A?oGGUVIW1%-V-1zaPChQe-ZU zPtV_6T$0}zN|!=TH?tv73P$!y?BjZSY4DCnU_w3u<~+-bQq8{{ASIt}6Hk3}U2R2k#&|!E>zKDDNP9i_jqqvzMn4 zn&Wt`AAFGUM}s}(WRR1xYy=MnhsQ@{8-6?veKfs}MtH}g4BhbAf=yrCUfqU&Pso4v z&BXg>cYeJ+o6{?PGxl$<;O!0@d>2D|j=bN#Ztbj?ZDwxwh~+O(q=fED)EbGxhSg0}C8UX!h> zB?6!yM~|B7kK9HrNZf9V&JfaWsk(oqy82ShX~Fe(!ahFl!_H>2_u(BPh~e&j2VK89 zoKtT~Uf}RtSkcR!44PW6?uCrQW~V~Zwz=m%)z6fnzIt3(Zb0hxaMQOo=7-XaBn|?- zA(H+|-0z!9vE753@GrKSCw!s;yH0pr-#X?*m$#Yyx@fPnKVx^fTPTf5s< zI+`7m3kkedRn{q?I<0L2uiwz(DR}bbYkS3=Hq&qdDW%)~&{1`NtkrtPU17sa?U%_d zDKC!X_LIW9y(#a)@LFkuo>YI{uq3y`5u5Rd?2N8nPDe3`kpIui$t~HL{`F!s@<()M z#Q!GS;WiF$Z)ef9H@ilI?_ci(Ls#k5bb^#d(R^byegZG`9SQhI{QL5QYY*F(R-O$# z=q-boI{D>RY^upWVoYQMG%6p-{nkA%N6orNsFBY4Mm($2G3pZt!|;DN4E#@Wcx{x6 zpxLWQsF|!+96d>WJ?CtMl`aderHts+OvwhjY@_7fS$bRglc=A@f5}zY&Lrrx=v7mX z`0(x4tES`arJ#|{0w7Ojxs#|B%*+$NGmu&8!*YmO;H)7cD})BX1azYOM&%eS=Qetn zZX*Y89lUk$_U`oD>!yDs6RD(5Pb{pa=MpkDdM@t})-~<5UeZ*f)~jq|1s!Pg&sGPf zd?q?DN*+vTlqtjtO{h{>6*VEan4ye@4rvZBOT0Kj$uK|(dd}%{N|1`^l}dGGUt${3QeHC3SnK;D0)5s54BUdh)3jJJH&PrRqxy4+J>0p0vb2vDYGqPIGy@Tv` zCRl#mT}x$+S#D#f7HtYAtgm+Z<-sbT?aii4FjCy`*$Qfh&n$iTLlACP`t_f^N6?=dHL_2l4}#}qN`}u;)gt7bw4ow&jUxUl48vdn#5$1Y7#JW3`N$W- zeu}uz{5j;*K{XvNaoSyFpt`p=KhXN{!~;T8-m{sYbMyRGNRB+D=*;0@huXroom)OG~%j zX4Cr-sK2cx>5ghb|7;bYs&2oH-8uqOmF#uDA?10w4W(N*Lol_js>yql_O(9)#fiGs zL0~SP_3i}9_A48KvOnP{(j&B*Y%wU=WgM>o+8rg2(fl0q2h9mh&VW~!9~wut2_?_P5M&KN5I~M1RrHc1XSEX-Pk&pmRRb#Wtn-O0XzXP zOG6CMEoRwPr8^P!Xf_hXq%DoCez;r=iIxm*L_Gw_Jr^XqO@~q6Bj|S&BMAC^oVXTr z`h#hjt0uW2+B2Pd$$68Rc%gy;mBesIt?$9?e%W-4>kL7^v!2wIZQ_c?3%-0GSJP|U z#}$8s+Hc@yoG#Is2@C3QH4Xz`-U7nxPFKrCaY-^gDz!rzV+3!2V4ped`e3!InxGZi ziTbg{A&XM5O;`TbRUo}?3i3Zkyt~HLm9014nr|Y~)OxvxDC2C207@F2(8xoRI0zPi zA6~Kqie|T=!+x3^RXf zu~Qn{?75BIdyfCnXPizj5k~LMcFQxXx}HsVwQB6qr9>HRHHA$pxb%62ok5d=ee{@m za)77DWVseJn`lslCe8Nxu+WbskT=JYN9SQI*7=S4om?rOS=(K*{5h=K57srOMa@8_ zFD*>n&B0^x#ErJ=qD}*h2tR~@cSwKd^V9aSBVT`cY71HHY>DeRPqZHgbcxXh(NJjL zgMk+Z5&{T$pdPCDfJ`=s57V1qSdYvY$+s#y$Bj2O0HNO-4HW{|+T7l0i88v~p!HY* z$EYr@RId)=q2LH|co9LuCKU+XR(2E#)d>+Fa>#X=jim7Lk+jJ}grW`k_XvNCDGiz& zY&FfU>};#=PGXu1_L@abi78J$61IovK1lkXox)Z7>gn_2BWZ-lLtAoGdXq^t!+&SN zM58+iB+?VbPPA@qAB}#a^z*xaZvXl1KmWc)@BfE~?{@cD^!tAuc%N_IAG|%^e$U>} zcNe$Ohm-5y{)bPx`^+=8M?ZgQm)!XnPqs!ob#a)+5!D!~dWp>?Rj<;GFdj)g^4q!_olf-`QAxr*IKa=qnrQ^>85P zXkx&Pw)KO`%vIfnqNPcgac&_sI4M7w8bvea-?wfeCYQ~s93rEpc($xA2u*rt zBdGG@RKZo3ZG_GOt;v_Em$S9}=d<#6KW4I<$s}p<^>oeh2N~+7N<-Im5S$C-WNT-$ zE_7K6&bOHO^2&eAZb~GnZWI3a%sgE2-!Y07pC%I&Er--eBaMeFGJ+jowb2b5ZId#T zf=(v4Oc>xZ$iWO=BLIPiA`UT;x@DLFkPmfTCbgtAdo)_47aG-=c%hy1cI$PbvDMp%Emk@?$yCkzRNnmv(!pQ7ks z!P7@@F-L?;iFOSGMX2!bn0OI_ENcZtX0mzt;1nSVruNlDG2aUW)NN1G^m~cUu8=NJ zew7MTm5o{Jivra+bgGt&R*Md#1KYMi4L~dXf*m}HRk*h_iR^AfteIriW_<@|Xl?Ir&;>l11`|)I?%-LW| z-S89<6lryPxPPYn8RfuY@wh+C_*m@1MtHUsA(W5KO5LtIrJxsu+|D>A6WUooq!cVJ zSWk*Bw@nSYJ%$_Sxm~u?WAb3;z>s@B9AF~wy-a`Hu21VFNp*Y#17~qQ2#d2a4!d^E zm~X5^eMCdbV9@KuSmzw_#3D)VR;uzYpL2O}-rl!C^4FJdgO93~>Wfn7e3EY1HWc_}PV`dD68n9z_j#R(Y?>}hl%}|9y zrFPAK;pNa^i{RTpAp;epkDhb!w88*3Bu<;1{#0Px zX~a`e@L1L8_X;!?=7FmCb zZf2Fb>;&i5V_R=fZlzcBM=jBAjLB79K{L0oJ9>y3_N$dh`_b)Il}OZ%&2ls~R-5vX z?bT|j60%#gEjIo00QF(a`!Y~=i=*GgksH~ibF4`suMk$8$IopiQNbi^+je5sv~AX2 z$7}PljXcSL{5GCTOJPx^myPhC%p`xX5>uI}(h%G9FybJ0MvZ9*v;$15oRu7eibkD_ zFvf)M?mPug)OWFV4=SqF4#La9<)E{NFlE=$N2nPw^LWKfdjlcxsNY`{q#CO`I~TXJ z-RHr$)an0|_X5^+{p~cK>3nnkMk;!FiEp0z@F5iF5kUUtQ zMTH$6ABo8=gOY=V4pnx}_y_BZcRB1!LgiIm4tu$Zj^`^JZcvq%!~;A9PoAlQXNWBq zE2?OZyL>5=%LIyU8PC<}1{n(w3#3?x1_&V+i-^m2p$c7cAjH{3b8AJHz*gAKlZvDtW%Txw_pgOxCgs9%d!tRpH@Qq5q%MAPevMl`R> zP>5nAK_KNwN`XmyS!ND>lw7l3b8tlC&X2Pn>TvMp8WAp26L${3$gKh!HCS&)Sd?*v_yk zP^mjfqE9?+=-jR{!(^88d}QW4Z@4ER}hK>y-?J_K9cp`}bF`o(DTD$`J1H3IiE5e8iJV%Vfc_>P3ZEnd( zFf6#yKhM$MAE}J;Z;1jl87t3Lj#H}|x&B(#=z<}CIwBT5YF6H>>T$U;%$3P^1=!7Av7rm*SY*6kj z#n+3?K2v->wktJW?7nVZJB-69mzJUP5-L%uTS-3TFiF<1k!|QmbeJK<5g1b%Sgf^D zyL~NxxvCD?x<;$mf}Epy$Qj@iMCv_&>JIi~IKU0&Gl>*cHoo-v@sae}P?9J;$ed-jz&o$<{qri{wO?4Tytbd{ zC%BU<{ZTpHQFcNVU)xB>G`B*_Wov(+@}W5;UN`0~O*H03w9ux&F=6p!f<1Y4d`$d* zu7?dQC|ky~Ux;KxW%!$wSU?z@uUkKJ)(WBd8v)yK`PT-{lG`Y^#$t9I^r3lj$5< zf1|pbMl#320ralousu*QD%T+tHF{0%MT5x7j>SAf4Zy=})RR9LAk;@-te(+|Ytm#m zq!_>ra4|!dWRCcZirFnE1p|BrxlUNbV+MSP=9Gx(8^wf(sh)&tU6PYe7r&qX-@*Rj zZ@-`Z-@*R*oBuoAzjzN2xyBJCa`)gGe?}ON0|Xf20_!k3NAjk&p-#&N`6Usp$=lm9 zE^lUt01pO%XffAM%p?ao!eR`Ws@oet`r)^pI+y3k*6vQtsrGk}yHEo+JJnT08|$)RO}|JtmF$5=-qjoM$&_f3`Z& zUe(FvA)95^kp9WQ6f!VD2zW5;&-TcTu%+dpHDwYyWFq;u5uKaAKT_i9n4mx8l2my8 z9b_kXj`?8kwfvzcQu^{VLUSC?6Kg=qLzxy!TS$9@f0JPIKj#NCkNnpR{rA8AH5d*m z(`Ajvp^v85(FpH&l%X3wTd?VilVu1TXSNYTs@H9?oYC(NRrUDU;8k-#TL&NMvA1bQ ze{8!@9`zl+4d%$la*B;Hfzjd(@u)8(wfKk(?d}+fdkph~c7V=m{&hgy%+fOG99Pm5 zPJFkwmcQ;H1iBncToBE+xej~rQIrHglkEvBe>xxQj|o;V6->=QrY|k<&*mK^5Lr`@ z@}lM}v7tv(S-ApCNoceHDrI=0p^FtRNgAw1CYv3Bh|!Ja1I1OG4|6Fxj znh$9bR=#mbjyae>958?&tu#Cep>x^X_F0jW13GTZeXmCy8 zf5C3eaqYZ*O9aYl06|l!g9vfrxhUlwk=~5t?M^>_jf|f=_HE=kZu&PwUu?id!e$09 zZf1~6j1flILx9a_9Qa_26y})F2*68{zzI&l3|=EJ!_yfE@D&R1j8Y%a3Bbe)Vj=GU zCg4vpmODM-;hzA7)SI#XphtYS>vCuNe@;%Su3a#9qfxo8qA%mQEUulxbB6Gb(R43s zk}DX(RvSj|VEgkvl~h_7!_V}Ob42{}5P3BY{9;WjRhKc;OQ=y@S6lh+4W9C5v)q?b z2Ml7u5Kqlw>DOHrQrO&eXr=Pn$$09W}cw{ zL58{|c`B1=1M%{3uJ)8hxsg@RYE-h_9PU)XM5KNs&@El6<3&0y^2ytWf1O^*BAjCl z7N`Mt zd(PT>sMg-7CYOj3S)VbV`4PP7s11_pKT8uN?ca$OFgj-~LwMP}s&!8Yonm^JAXMq)MgHrM+Kix>_ruy>_$(EM@s_B5h&QnlGH z^ZTfm-v*yCIixXB!30Zc9U$mYBDaE*3pHZms{jR+oT;MP*Wo}1e@N)z)X@@qk0KOe zI5@{s0@alLHc)Asnue?QNQ``DF5?bDF_xdPOk{FO&$<5aU%m~DU$12LBsw`*a8x;3 z-@mqu_Q=nnZv)KHeEC%w)rr75ML*~{+ae&rh-c6bU=+bcnkUOHXd_#4Eqaz38WJa28uQkIqLZoY2y99=`t(c*NA18^b z#-ZhXxMf|{O(f+ASgb5V|Mk}O{1oUl31A-9*Tt+F?`<&fdjx$oM=S1?w#A$Q@&ps7 z-J$0j!Xw-cdw#}b6?D@-+D}P-MtC~o8k)Y>KQv5JC1f7mf1VS`O2S$zpCJ$7P>GO! z$eVDXABqPj=lj!Xgr>q^vqaDZkgF53PHn5drO}mCGl5*$>e4+iYzL5`^ZDYk>P}GCgE- z$#e_kLDQq2t`F=a)yo$(36Z5>e}|-uJ|+{|ZSTw=&?=;2j5iKv5EJPFuFI?N0TWE7 z3H_yeYz8m=?Xl%MxIC=lVum6lBjyR^V1YP*WC1)nf1k@GqhjVU11ekk#^Vg5$bJ1g zOO7MG0WMSQ&prj7U&R&K1d8vix0O%njr68%4u*q|h~LoY%6xP#@3dFt&*i=2iQh`S zQS(Ro&(s6)DfJaWqCD~|Hxs*kH|b5I(G^myWFA1(w7U6bv@?3~`sL`=XjeMd&~;`~ zE(9Yse_p#4ynSy1JjLSxy`_=*D4i}EdSGU7#h}z&%9BpWwst~(?zX?6r!-IQ#Xy@A z-v%3}%emW(G9-XqYlZ-5hbIkT(yeMDnEIK(hSd2%2~^e;3Gdcq-Tn|#8XQ3G%}!%B zYmb9-)$363m#=#7=p0W8^0l$`6g>Iz)h2j2f7eDs@Ni14UHEXZ3k_#S^PG&uUm%Rx zOxkKpb`BV6F6U@2YV?=1vU(tGA()Gw`jPQdUx$gP{^H_ZT-=L`dubc@VrX8&kX5R^ zyGfQRi3;JmH2%JSlQu6V9$-wBUm#=B$~tfuoL+{9^PckC}VJ7w!Q z&Umx+Age?aaaxbjIPy@Bw;?%&?i9LHf9Ou3JB98X%g(X94&dz7X5B3S0uUU|ke3B5 zcfw^k5)F_{7dee6r|M%o`SSJ4SN&L0Ip>haY$-U)wb+Qus>rtoX~iBc!Do5)LKKNf z%s@b=*n^%J*7@XRwyGJ8c{ilcs8Po%+e=1P2zgJ@wU{z@JN8zh-Uu|Gkk=Z)5B@=N60SHz3 z6mKbq7z9&%jmYD?gu{t>C+3})FN*o?y318k(Q}5v0D7ngF<+o$8pViom@-`1qwl_E-M#4(AhTIO2o8L;R4E2`*&dari<{ZB%^4s8ujrfA|DeNd|IX=+WKs z|LR5Ey)JqID^sGYD3i7A9nUc)e0Rr2qDjKl0&TO4I7=8^qS@1yp~QRo_-?XQf9-5{PF1z0t9!RD^PHS!3Ym6W+`4kz+UBKHavhI*>UMs>DbK7& zON2neQUYo+gs)&sg7o`av)m;+b7#j~sJRQMaz11iYVOXC835;HQ$n%sxx|{%h}E19 zvppNOBzsurvtV{R+hua0JhLze7638j? z#y2T})h>xwLZhryH9pc*_1=MSYwH#`4 zsA-jrN0(cyDmtLqJM64hXSF){>*TMqTG!badfk*btcRRoR_Vfea0lCD30ui8+#)?# zo}V?y3FcI>Q^igdJ5}sdv2!3h2lA?z>Gf7qKCg2We~78r2`s6)mhphnZ#)So3PFx(%g1_b`Wye zY3lRlf8(UBkyXav63-DHEs}{r4ec#^?!-!sY2z|;`w>+&XE!gt25lGIkhC3CnUsOEX)k!R#lu|A? z8o)WG`-zt-jzePYihhX>i4F*cYlL*3BdGore->~Up=(TI7A$}eCX^u`?EAhnTcRvz z>X-u#uaFY$6B-2cM%c?rBJY9Acyn{)NuLnI(=^+nc#4MltvYm@yc1Tppru&>b2iNv zPq|6<@gf8n zfASTbhkMw!(dJ%fZb$d%FmlFq`3UtokMWCp#qI7IrQoT`)?Xdz)h?g^<8u?0)A_r7 zP3Nzj8$$!=X z!z)g@KzIkz9Y}W|{SHC8gS`&+I@s%Af3JhRU19HTT@pqG#!eN+>56-G^;Lmy`Pt4Y zXjgO9C)~|CTEx4JSU2HBLrErjDnP4_dXJLOtOT~+A zL5Bw&9&~uHD;|7Vm$p{`mQ|u0+J`u#?#>bb?1cOJ4p*p*RcJtaO~DDzGhbo?f87$N z;&=gg1POzl7;SKT)C&eo+bhtPg%X^oAZV`sBgJg@!IyUru$u!;4mdgB|KgUshh6dlmq_#jqiT1ORgC!oo*ok}!$ix4US@P(fiGXj3yxMmWx88^gR^Y3 z>f%X7Ped1%;QOL<5OCPDlyFQN&c%KII6!B&sDC zY=8^nN*6lOj6u0^4#r5;;uIjl;s}8Sja3dn-GNJjZlTA6g>21aN0j6zm}IsitfsuOj1{6;=^niovVkHQ{cfMNW8Gce=ZdGmxCed z$dk1`YOdyxv_sN&{Z37aseakhPGr)b4Y41#pdunPp zfaCy@14s@aJv@N4y}4PJf5ti0^Q-vma};`X*%#dN)tMbq8ZTFH&*ys3GvKmw&fhy6 zcBc;Ox}#{$U+qBTeHr7jzj_@#!1p~N#C@2zWxuua06PQ6892_saRyFL2F`X}&UFEx zBLsQ3Xl_-t&ZJ3Ak8SYfYvp;qG2S?wK}_C+)SKDcG-jbr=8R;!e?L1W8HM)Q>NF>w z{3pF|Kv*0%FbEL0v{TZwmWjGY94Hf7jPZsJ+5())k5>W37_;DnYY9^3hy~G4_ z3;5Z}LsIDq2-9Vi6X z3G-LbX|t!n^H%{q1yAyjzZtn#G~RIeQqE3ji|VWUx#aq#8WxkQn50{sMslNoP7JvJ z3rkQn;4{dR;QbrSXMO~42%r&QAtL;dy5G6GK*}1-6p+@Mf5NbJ6`?x~8UEiPeyXle z>nb^Q_0Y6$sI;Z#= z5hDqb@{w$SPeN{1)`SrPlQ_uEJNZLFX#s9<5CB3!K*?DUaE-<(z5?}5vx^>&SpvOJetD{YLR`(oKV z_-nb7h34)};e z95Cfq%Ug=hqH_{*nS?YZc4-{*?`*dHj#a2c;%8T8+qnQiYEOJmZe9-uzsq=wBOPv` zAGh2ye=D}t)_gJ9vazs=Jm1}wqwA^4eJwHi!^t>wAA$wTfmH5ngbSK-K~pYh$^}jJ zgyvs0q`E&tb9#-`6_cGHy-8r5u0JyQ>J7dZe>!V_1yYWi6u=9}Dn9)+43t+#C$*VG zbe_8oN$pWU&qE<+xi7P-qXy6;yA_epYMaT!^1)v075*ScH ze+2Vcu6aEokJYEO&fMPj1K94`B!?v(mULLsVacvo@^wS@|MMFdu5xvfQU8u_kgqy( z+e5xaqXWG`&itUX_Zpi#Rp#{1oTj3vf~a?R{bp?{`sKIGHz&@QShM2x&f=|}4py!m zx9(2)pWz)|XKwF7UV4Y}9m;no-=X{me~9w8HXHJ(3zWD*PW7z%kHz?1@qEuY*mK>l zLi5c?z9AQA6^`#UE~H(i&gF340d@!29bmuDfZai02Z0>~b`ba>Lg1~2jQIj!tr7-p z)W3_6iJp*e-?7j6Ufah`n7pK+6YK_tp+Kqz8G-S_8wZY8@ujp|DxOCKQ*IYB=ni6>4?XImfDC zts1;t%us}6hAKiiSRf7{SpbjD=ZNqm=~a5S|3*)U=;y`wHGKTsD;sroz962iu=j1C z53dR}b%17=_~LINT@Z@0QsNi8f1s!FIKXW7flb+9Z)UYOxaG&W z1(($$Z>2aYK4v$`oS#ZF@lZ|TDqWH8m)w_alr>#!FKV)xs+pIhDSjIh zzda(Wpkcq@o*m90At=b#U%miy#e4C+Rd>TJL+OvG{7Pk~L|ri(D5vWV_69m5+&tt9 zK~2 z3Y{u^jH>WuO{PyN(+_D7h%R>0eY&!}h2&v>;}H8xHJK*d;KtUJTKTXGJUeqp@T~{3 z#C-OAiC>~p4CHAYVjo0;8zy%FAYdq%JXdALm`v5|$+FKOAK;YQ1~}#b%e{lS$|M1S z-nbe92o9-_Jn-aZe}=so(1|LtM0uWg`#gl+74p+o#MnL6IW9hkQZvYA8+o@$KN&;2 zrlwj~QSz!LNu*p^?@&iE@($UG5Ucc%27o>$6S`E`yhAmDrVB<^eOaE@{^x9zt(`== zUl{s+WHW3+`eH%U;(PtF9jZ^kdJ!h}AwPcz@lgDZ;@&F#t}r21O7Wpni&Ue&**lXin`$v$&s-XSv zE8Hfj*>7uor2MvNOLeVnQ>xb;Bh&5U<*Q;6jqhX=e_fdS)U7Ju&iA);)JByCw;@u? z26z7D8X4T_21>3~A#!rNbe2o=9C;DqrxC()dGMs_h|Fq>bvTewl`>4)IM|aDB$Vzaslcw)fWdBdK!p!HKylF{h@I z-3`EMfBtp*g!b)NA6=^Ij((6{Z(LeTJs+Mbij0omFt>7BjOt1gM@fio(%Js&4;V=8EoJ?3kw0GI7HgTy<>53^f5`0XH8$f@Y2dQf24#*v}C0n;Rtz(YTN5qa}-;H@2uTN zca7@yi>8x++HBkR%i6(jw!k z0e$2eXe~f;9k)v(^iTy#qmQ`iQ@3+4IaiORtEZJbb^aFTZ*l&XN9k|rcT?>rT$9_F ze}QbRgB}aattsd0iez`2j@fH$aX3TX)p>}B564{{VwI%&#<%Lvr{Kw$(!dtc=2@x+ zx9WR!#IvP7J80{mt%J4>+B#_Kpsji-El-bO*rSrwB$Rj|_vb;<^-5$6g}GwFuQf7jvQrGu9aUOIT`;N^pXmzC+6j{ri~9|XUNz-ZCM&*vDe>~a( zQHPivVs?o6F(T%Nn!<4VbyMCkEhf9?iZBS+2ULIgTD|XV2V9q?l&EwdcEz*0XD<30 zNxy!LudnF-@9YwEKEc*L!5@9(-hmwlb{yEb*I?(tW)T`~Hf7*T(yGMcIbIF#C=z!T zX=i(IHOI|eoL?<=*9FbKutzrf)+5>?x!&MvfjM~Sn`y=#s`EOMnNGQejDgz-4Q9=Jk_ zWHbPs$Tw4bjR-hCN}gYmM~UPM^TF0{*-H+=BAIbGVly6*ozd0H=_n=f6xlRZSA>Pa=3`vgaWhD!e~4{dl1q|N zhG7_Bq=+YEIh8+^RR4v65JtiPWTMgrxR{|!k`%>EUPz{>_<)kN zD2&wSm|PM?d!sj%k^kPdL5|8ER_@vSRkFp4W(^PUA25iKb^yPF>;%s-AMCxBKi(pA z2*d2~^R8kF*LlT!#Sf35w--R_Jv`rV~dwTnt!dUC6oP!I1?QvS}EhBp_s~|F8|U-(0yRjL+qD@O4p?S zAJ|k7dj#@R_Vvt@ALq?2=7-crgT2k+;7qFBY6jjx_B#____Y#Rhm=VIiFWGkJERTC z;W>Z|f4xQMK=CD>e7Z)_8^-Y*in(LFkVy3u5g71=`RD>CgMWr5F-a(2P!0pti@~Pa z>qA~FXkJ86iApym?5D&VfizP+0Ip^4hl8Uyf@+QLZl?cJ6KDq04dstYL=@@<)RS)o zwl2Rt!2}KVwzfyZ!P}VVWUKi?(&m`TLHE=@e@y*zt)E`&$JhEf=LJ5|?O^YlL>%Yw z*n>fk${sf{+{7qM3=#*y_pdFx+!D=ZG;ENZX5?ELq?Lu;Phi6Q*xe!u)cmL*?M>~N zli#tXMTKrkpi|DiZtSWFTfuHNQ7c}m3EfXD1hX6$Zd=aM%(=GxAlJ4WUfZ!~6(FM8 ze{@ErGb%e8mFD=R`m&8fHdU>bpI7Nuo5G2r?lkaK9n2J7CIm~1s;Z)4HMAI-oCVNf z*(4*?b`_*%O`9u#idIPLW>bTuZOtmPs4b1eK5ARfFr_-~6Xe&A6UI&$_a=4FMO`%bWC8-&#M8NZ==|4)_y zhsQ_kl3aW``m_hmXEY9cz-O2N4zH5UJ8*>-3}C`Ig8u*C+ishSa{ZZ6u1&ivf9}it z#4l5|l~XNrN@HDH%w~IsZ*Famb_enzF2Bd^h4%>dxM^g#bq`cOwKjh=+1BTt3P{8b_$0&AuGR|2bsicN*{!+!OsPy9d2s+aCR3rAgO1_xB{Fr8 zq#`1Ij5jXm6(Z_5-EtgKY^o_Re?CvU0|=?;SAD{c8ve`>d2|as4!o=kV5$(EfaJ>n z$V*Y58<*rlpbi}g6bm%~$>L^)B9sRHM3hsH1^{!RLxxg{V+JS*7D7XSWHO2`!{WL8 z!uPy+##Q)S-C|d`w695GP8c%1k#vdQRjgW3y8iozBjS#q=tG>#S*Rh{EY7`~ArB4+twR@`VS`dfR z2>M8L0+NLqMj=_&^{yBYD<1hme?ev4RZSfx2DKMa zqO5AsRY75S<+nl&L2sr?CYmcNAw6(|q&Xer2#GI$Jjpkl`!X{;ogq;Xl5*{#{BR5L8AQ7TAu&O6Ux_8(R8Ng$ z0P-!S!;vqnR#M82e^k_nqX;m>nOH*UL`nG}KJXv`W28_7r-0$PKqE%LaaIcx;N!^z z$u1GZZ)kJ{u9b<&HtI*_lF0U|21vc2#hS^w6f-tIK$j#Y9IMZjc2%r!(Fw(>jEc?% zCRssp@WmuZhVPPO4UW|q#|%YMntU{tqX1QyV;JODx+g^de^eu*gR&G}EFEvz z^A9ylWj&b3jDs1x*7A}@5%M@7!pdT5PE8@ZBr>psfnI~o@BKNYA~>)`#*ZMFtMhpw zx5MUk*m}-8f7X{#iF_LlN9A4>=93Q~|F#M0oWp<4swFAsJw`muXYRSUc{pf!c8Qas^wdjQ^c zxp-FJOwbxpcSfZTMEAX}xk6owQjhvb1Hz8FE~C&U!Ml)g3g3Q==fz8x%DN5Y%kt65gb2a58Z)c|lvq>!vQ=~KtdxfD5U)PyZlzn2+N<4Y^{h=2k)+A~3>u>o78yd) z_Du&{A`12SpkJ6e*C55-SRHnMtQLvGf6y)Bo|`gHJZqnC;yz}XXy*)jpqV5dh-I_g zbf4lo#Lpn{>6{?O-bQqOfS@O(U^hinMXc7|i54NJ8%J~wF*!#K3)e;G)> zo9&@{b~e$u?H(57$V-;W*_nH7@sSU1)Q4RUt8ra*({vZ<31)ni+{amc`z(WBz5(?h z3g5Q9c|U8Var0~CyZ3XwS(01O;K_7gCVzWD^1f(vjiQB)u)xI373A{#{e)|mmtA9D zRl;ICQp*=E>=#G<*2*VNhs9bhpY>HfV}#Odx^L6phya*bPL}? zD5c4on#59)?!A*ZGP-HGEuZ5np!A9Xd5yh!butWsEc?|B<}(1nTnv;<(nbM|JT0*i z=Ax8JcsYX%cmc#>PKWdcrKZEF{C}~p@}@ci!Wj?`*noJ|lu-PH(yKT;KI$lrbnVqb zty+sG-D;EbePz*<^~@svD&;6bJi_Q&pHDnKN)LnRG_?xr>xVA*%E`%Pp57%=a{a#i znhL?!O^3`sz~~C`By6jbB+QXmO&sP(Eft2j(hU+ZSFXK0EcVYrDCRj+-hY!glw$A= z^CEg9t%DOP%?2HiS}iCO)OM~Z=|h7<9C;4FdK?ws8etR^L*1%cktE9?dFr72!$0mYCZnXNkRy z$%IBKi4}lj8gp%M%QPH!D}SP$(Cc(*WcC%C?u^Wpvb!>Jdv~-u63<0PD1(9g8zT=@ zrq%5lkDp~&+1uJ2ZOfcfGRKQ#R*%YIfDz&5&P9@c#(Z`H$0#Ugn?2_+;>u&aCtb_K z!5iY|ALu!K8etEeqDa4#8lar%M!!%@6&`;ds>LM+=p1>RMitGUK!3)64}I~K3v2|C z&CEyNd%XS9{EjWEC1c{q-v{xSEr;-3ba~a#|&JODAR9u2xO5 zwlvI%X2WguobQk#&RDML=qFi(s&iN-E2PCVEUy`>K9-iCRV`x~u5=IUgN0{XO}PV< zvN?qj#~uzL=^8&=rhl^nSZil&n~k=CZ7Ukzg}zz=xE!nIzDctMu5ewLRd(=hec@f5 zdD~F1CCIBadi%p4Kgl3|urheN>3qGK4tgzDS_dseutBCNeWrMSd{lSXzO~J4wA$aH z`>GCEJ338{>MiE{!F*vk_nMeejq;rZ-@MqlqkNQ30kk-f-+y4$KWlBvI|Ke_8u0DB z#?DB0M!GZ7f2fiEK;Yo0Dd~j_tK0WDzD8=ayPD)BI;(AjfBE`M#`0|_YM+PQ3~q#alU&6+3d|;}2Md)ckW5{6CkG~% z2V&OE{i^%E>wk+{jj*byj0|~U;JLaifKCQ`uhcK(_liH2J!F_Ja*631@)Eds8{#Pc zNL2eQ59DYxXzIw^i(_@2{%L^xDbmm0+=lY%{3EzHLpLz;3(pg^ZPrmk^BY>o?yEZz zyIvx0_R&UJrh{bMoM&^`clix;xqD0U!`d23mIt*fiGRZQcOZk?T(Vf0BCSDTwnpsm zlCg-|VdeZB>{dHj+%~LMEvnT6TOL;Q_KTgSlq?E0Ttghdae!6}V5}mw8h%qx4)FAt za7)BiXukopnZ&!ov~q8)ky?>ab8khkfGGiV0-!=?zp!L`ML{*cw5T7!8v@{bpqz4Hn$;P)# zj50%DA_^{2r)KWtkCXdO?%T-y(kw4uby-ouVmyV!e^ki$Ra4#yxv(p}!uG;aR9{V0 zDu4HLO3Y4BijqxHnt7TXg{1DAt%#I7RqXHNql26bbTZH?A~ZjR%YmS!_cnn+pKeG# z0OvD}uJTVlqMPzVv8*E+>?es?^3zC_Kb%1_MfvEMQ-q>pf3P>$+CCcnM(O8w|J?rb z+kgIjjo$wc58v(Xv*`E#I`BTzAWfqup1z3NYgGOC}rS@{W*0N*E$6W)kwe z31BF1jaRWf?LvEMNZD8d6hVSg0? zM&=Z-8S|!@(XxIv6|E|E9I}da_vo&EdGWd_6ONXT#$KHf%C!pWsifEj2${R?rx7}& z^Eu`U0EMGo_FZb2yxZ-U`jN5B&e_O%{w6e8286N@@Ul{gvyp|!lY5crevPt9A1V5( zopF}fp%~Xu5%$q@pobuN28)5erGM~`idc^`6b8^khcJX5=8I&+^kc<)>OhogKldt? z{}u1jF1G{&KP(`lZ74%&tjf`%wIkPpe)~{@x=&&oG0`%>!kB44BqqatD0;|;TTboj zj4`)8`$G`g?q*|}E}@mu#l4E(J|ofwhsBui-JKfH_2p|y)DClHJT&gsrhmmcqO4q3 z+W;$rKXcPI%pND#Fr?Ti*~ERMs7cL_J3D;0)5p;}C)`)tWzMigd7IgMXElcVL6CY4 z^cJ&p|1646&yYv2k-!ASHz&rSjpSMWD2IBwVl*)_yc_Kt4`v_R)-4Q1>$Bmj@Le(F zZil^~t+yKUut_CCZz?2R3x7o|>aTc_dq&7oG0WWG{T(Vd`(e95qhFj~I+#sx)#-upJ_qQhxZ0})ryD=%2oPU0aqxA?$x&4-| zu0Cr>uGj8E9hY~z{m?KreeXYr`6!zLzG}k90k)uWFd+$^?xskc|EIH`FVr_=`~4+V@jCIlH!ExQtwH&%F5o8+&deTdKgC$ zBD@&>D(0@tbCo_jCO*1V`0i7PGU#|1P=>N!GZ+MjOtUA_Z+;kaI+>);KFeT3*+_Q6 zRg(U!!w|(1QU&srQu-=rvF7CorB`F!MXetQsGyqPcHj zQzJLH))guS!Y+4+oB=jP)eNyZI%rNctDw`GFWtUwGKH*bmS(Jd&HRjhbkVN6J4eopsNM{FHN$S@S>OEM%^)w#dfdaQT_YDBX5+=OP_qapxj`z8HP6Gy#+HmFx!r zRm^vnr3FfD1b-?V;|8d_cCs|tVYa6$FkvngOyekIqL|%L^ z-bp8A^8S%Z%;KcDv)HuPE;Q|D3w%n;$CUKL<)bEAGCpDARlnbodv|HBC$%NCLk9RBUhdl;0$qjK~dt~ zWA4shCkU6{`D;w}@|C~&mp0zI6MU`rUsWWm`dfvjs^m|tTv-VbYtPZbuIz~=)raQg zc(pXk)9N|xJ7lweR^iU5IXALelKY>K-oBjJ-X5`6rnN7)H&PA2Ho&oReoSz{QDk^c znA)R)L4S~{5EvnVi5J8^@*nG_PI=nd>59!evgsYVcWL@vntqq2-=*nyY5E`ZQK;8V z+4DXkenX?HkK$b?6lxHt0HII86JIG)quf&TXq0ULk7dH`L1Ui#2ApWJlyet|2YMTf zs50tr>LVfT*n)V-2b{J-eN}q4+}+X#t1M!H34i508W_`FugQBo?_X{m^aqMq z)rr|QQ(x1tzvCN*IQOA60o!Gvi#M!{ng%*AkF1AFZuTy4m|G}%aa`+n(6p^M4*T?= zIrwf5-)rVd+1RWtcQ@NMTQ55A+pMWP+GAC7m|e zUw@pg*$WFle#SvQqgrwR8H&#Q!T=Lx9;@5M$-)+~wAu78yRUNZY`pWyomcwOX6mCJ z&vxlcZrfhdobuHA!ez~VON*}gE?)I*9`@RQ51Deyh)ZyaJ@ z2>N4kO}#U@04yZEXsAyyuNk+J@v`km{(r-=i)9gGaEgWiG8WGd8UG3VA z1L|FslR+uCxp7G@$?*h0{Tp1Ng}@`Bx-Q!v${k*)+V(^nx>ZqVLSy0sN`NG4KBcn&ZTl;q8D4Cz2n(KX}) zV-jtAVADga`%WkabI84!EG`~P#j3j}o_R0`Py}uu;S6vJ5MgnoZ=gfB(Br{EH}!Xn zn9L?(bOhZZFXqTs!@d9?em}oZVSiSNLIq!#0rYna1JPJ|xs#YDhuGh^B%d*#sqG%j zG^H`+vjPudU}=P>n7|-qXbuTsY`7#@ zF@~oE3h*-o#S9p-6ov#8Jf52NcaeVKk0B^sA2;$3(gbsPRYA=@_-@1NcI_4aH|ulUW_zrBLDJ4`~#4{Uno$&d5q z7ITGWH;02WsmiJucn8_<@}`5=-{p@($|QjgN&@%y9nyy6@Ekyf-Xe6M_!3V(U8Cp? z<9IG*ukk{iPDKRDP=B24(FINh{|rrHl2DfUcT_J_?xHtRJz+{NBB+c4Hzn++#2bO@ zQgcV?+re;f6enAIyPN6%)C8KrXsXxpM)s37f4?U+-Cc3U`P^z7@#u9~nF>}C_S;^m2D zdYq~(bH$JmW;rh0ww&e3cby)r!JqY)sA3 zwxvYL*tDaynt#<jjYulb^MccYsqSd=iu1sIHm`|B%wfwxlTi-gCDC$lF zU)8}(;blUww5X~o8dgIqC%s_-bXYdYNVQ!Bsaey`$)C4ES~r^-EUm9vt1ye&r_xsT zQQLZkDYbfDR40s`Fz!IE3AcUey_?BKeqjuC(`nPPK(#ZRU>gc`OY-s4 z#hX1KcYiBw_9N9sR(U`2l0cAtf;81{nc{Q#JT1BLp|C$_Y&>0(!{Z~sXOQSEMPqYK zkH{|`_J2`ZMMHz=nH~d4RLnD|%3l)YN>AcyQDV6#4@&%Q+}YORJZ9Y7S}YGq?ard? z^$_UO!m?j~!XThGIy0;PXSUrYDof$A0m@sEYJc{~ow@>nOCm{AAjOy4vUFRPZp+eb zS@v-PGOxn#F3NXvYjdlI1T8y1DZfbdeI|*HsJPC=cxAQa+xK3h*16p`H&nqREBxy%eFHhwT(z@l2d}l3L*njy7eVT!#PFrS+DDjk-bSmXHYP+S4wrbO-<?r!`w%GL9IiJ zj}t8>YrPpN8l`M-V*YmD+=agFFYaw|+ik0RY9E>!df9X-K=sYj-BpoE=nm9T<#pNZ zT`xH{8#10PYp#9jv+7}Lr^Is1n}7bA^o^av#%VOC(H^!&Teg1fuH$d-50ORp-0l3O z+xdrsbX1R!6f@dQl0GgoZsV`%aP5Cr*G2MeTQ>JYTrzE)8KrNY9-2(zm5Mk1x5HhP zv!HdwR_Lvhi^W(mKg26zKNM8~Fy$rGb`BR;oAd8<0oJdZE@JuP!y%5;m4EAGD&S$T zNRVJRfZagQK1Xng#8SZA&};*6F4bv|l$-mzBx7(B*XfnCMCClY)kpo3V*p-O6EIm- zyh*-pRfge>OL8&8Oo(ssO2(Um2&sO8u|60O6OQKyV8O=(dI)f;a)~nFQNPDbq7EV2 zBgE1)sR#fsm$1QrZ*lO4Jbx^qk;_{ge89x~c@Rg0XFpG!BbcESB zj*{#?EzwWbbX&bqf!59vpi}Yh$LV0Q7gSyn@!g~BpBf^z=&}1DDHR* zSrw%flTb^$UvC!D8x$>9eHA?Px0O-TLyP34m3*0gARlrFJeZxtQ-8`T8K+B<2I}Ad zV5#*Yd8mp|fC!Hk$qBoZ5QpOcCFCwiM(I&{keq^Tv8hm8cI6F)iV_xIfAfw${F=($ zt)^>75{YnzrkL?)aYm`0m@A0h0N%*l#-i0hy?!L?sOf5t&k*y@DR^|{I$4?}+t~&&CVY3Nzq~uT>HY+1)|VDJcM>kT zX587(H)-etEJJ{~x($SZm~b5A?%;q?gs%}Z(&s?pgDFx8WPhY|&2E+QD4Ad%5f1?$ zg?zT*((}0VJT5)Yny2S+nP%1_(@Yt-DgAY4v0XdccM{y?^5eMtI4(bq%a7yoVkNO0+}5^zrFcoR9<3!Jq1tH=WVp940_cz)#c!F(8{RFbJ*YqH=CAFl>t0S zuSFDidJZE2C4ZnWvHaxbK%IYdnE0>MO@a}EjFSG`OAe8(*>z=_Kyhr-#}@vd-1RS= z(c+qln-_KIxRPZSQcTJhy;%z!S>1Z`PTeZnByc3XYLU}H*d*Lph#S?g5G^bbHcW^Z zFMWypA($gb(i>5Q#G&LD4$w7<#7evZ@CGixB%*VGxql0}`x$QHk8w~Afz=NUF`b$w zL2%Dk_-iN-apiS)6cGk%&^bJApaDND4_u!6@6z!tCNw zooU|^y5$j)34x@$&_Rg@3nd<%Ss5{ zV5wecsDJj%t#2=ml%rVfitAkhIj~Yn0JdNp&D+U?O3zaLaOYmxc$Q=~A0%q2-=Ar8 zg`(plb!zSaGU;MC#J;`;aX2`T(lPm!_((Q|xelYLGS}_OpL6Lk*(!KxlAX=UmhN@@-)JdNmx#zkd!E997<+EC`%Jp`?4olZs^SSa?C9sS;8z zpHa&D+s9FawJ6tH39LWznsAR44^Gbar_%^c1w`5VHn@;-wdtdaDLF@s!+EGdiJ0r> zcxqeyEsaER0t2~up)>s;!u17|$u;o@0n7T^-|RR?UU=0%;grIuqHV`~1rX>$plhy}6#P7L4UmD{AGai{ z7MX!;Y!*!({B{%PIRX}$3JpNrTYtCnpQG|B@;qpI)YG-A_rZCrPqtrg)ujhm5bt*~ zhtbu35Om$}G6_`ruNxg3X6-&a8wGCa-5R-u!#J8ExznYc7asIxXb9%;N~|BuK}Z?H z<3Q$zk$!AWReV1KVT7(RjajhBhuEy_;(m1Vbi3|2b^5(lo1`o6%cf-dnW2nfD0$FgbsqHfjN!LhSZr-Ja}&ksPCwXkt)*c4`jmeuhDS_yG(c@!E%J zlrT37<8S{_g*1AIQp}akaAGdsPj+xTZdR=pNM$N0^`3eeIRbCQqt%Y$HyH3%+Q+qD$ z!m={}bQ_h(6&(dJgo z(GInEPB7~#V?@5e;H55= zK0{Rri=CfzmVX^4K~i6=!UBy6Z|GVTb9BFd*T8m7%#Zr&AJI+6CGZj5H1B`@h87oc z)4aWk{fKVvRKF_Tmnm1lg*wW_)X}DDV>i2$T!CJOr=s5*mt_AM;y@;B7WT3nl|3*H z*bp$}h1)N7ueOXop9jdFqUe(7e#lgyB%Y%PdoW0{MSJSA;zQTXz8yx>B)KJ%hQ$mzy; zmXUXvdKE=`bSP`qo3BbRT4s1k%mpQXI>JEAR9czxB?%98K{aN`Ro~Z+$&yvvrvfg` zud`y(ZuzAFEJ51AB4 z`xx`h1s%bVnxT?u=t6iCqirpSfVf-v> zG1mj?+LIi6n|{FARvbU@qwjl!xmyDB&$*eL?A^V!47c4!k@(W;)qmtz-n|FQc{FUc zO_n7*{x6y+t_d+H#30WYq%xb;xqr1={TnT&KY5rLq1BQI^gC>|_Ai%z4gtbFK9>br z2c2FVoEq~}B2j-jNyBX5GDzMVhzgBRS`CwkVS&L$gOY5wcfe%?BU(EZ{CTPOkmc`i zMbC|Ra4uEqEH*E$S_8QByjfyL3e#=QKKkW$bJS?WLweuY5sjA SJA4HI0RR6pIN}E>M+E?|JEh?O delta 25042 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 CXw;4X diff --git a/build/openrpc/miner.json.gz b/build/openrpc/miner.json.gz index 111e3892245aaf4e14f3ef40fef994df4cda5e28..28c24c07ba5dda376c6ee34f3d87596b0af164ec 100644 GIT binary patch literal 13088 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 literal 13091 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 diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index d29e027ba491280364ca10c032f2acf6ac9fedc1..97250a33588a13a8b77fb10f5d6d27feb9f798a6 100644 GIT binary patch delta 2619 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 bzP9BkwG$j9Uj9D-0RR7kU5Evh-T(mrc7O(F diff --git a/documentation/en/api-v0-methods-miner.md b/documentation/en/api-v0-methods-miner.md index 4699c8fe805..9da6809be1f 100644 --- a/documentation/en/api-v0-methods-miner.md +++ b/documentation/en/api-v0-methods-miner.md @@ -89,6 +89,9 @@ * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) + * [NetProtectAdd](#NetProtectAdd) + * [NetProtectList](#NetProtectList) + * [NetProtectRemove](#NetProtectRemove) * [NetPubsubScores](#NetPubsubScores) * [NetSetLimit](#NetSetLimit) * [NetStat](#NetStat) @@ -1854,6 +1857,52 @@ Response: ] ``` +### NetProtectAdd + + +Perms: admin + +Inputs: +```json +[ + [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ] +] +``` + +Response: `{}` + +### NetProtectList + + +Perms: read + +Inputs: `null` + +Response: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +### NetProtectRemove + + +Perms: admin + +Inputs: +```json +[ + [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ] +] +``` + +Response: `{}` + ### NetPubsubScores diff --git a/documentation/en/api-v0-methods.md b/documentation/en/api-v0-methods.md index 883d4d27499..16e86775204 100644 --- a/documentation/en/api-v0-methods.md +++ b/documentation/en/api-v0-methods.md @@ -131,6 +131,9 @@ * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) + * [NetProtectAdd](#NetProtectAdd) + * [NetProtectList](#NetProtectList) + * [NetProtectRemove](#NetProtectRemove) * [NetPubsubScores](#NetPubsubScores) * [NetSetLimit](#NetSetLimit) * [NetStat](#NetStat) @@ -3905,6 +3908,52 @@ Response: ] ``` +### NetProtectAdd + + +Perms: admin + +Inputs: +```json +[ + [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ] +] +``` + +Response: `{}` + +### NetProtectList + + +Perms: read + +Inputs: `null` + +Response: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +### NetProtectRemove + + +Perms: admin + +Inputs: +```json +[ + [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ] +] +``` + +Response: `{}` + ### NetPubsubScores diff --git a/documentation/en/api-v1-unstable-methods.md b/documentation/en/api-v1-unstable-methods.md index a5fdd999429..0ff7bc8c873 100644 --- a/documentation/en/api-v1-unstable-methods.md +++ b/documentation/en/api-v1-unstable-methods.md @@ -137,6 +137,9 @@ * [NetLimit](#NetLimit) * [NetPeerInfo](#NetPeerInfo) * [NetPeers](#NetPeers) + * [NetProtectAdd](#NetProtectAdd) + * [NetProtectList](#NetProtectList) + * [NetProtectRemove](#NetProtectRemove) * [NetPubsubScores](#NetPubsubScores) * [NetSetLimit](#NetSetLimit) * [NetStat](#NetStat) @@ -4266,6 +4269,52 @@ Response: ] ``` +### NetProtectAdd + + +Perms: admin + +Inputs: +```json +[ + [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ] +] +``` + +Response: `{}` + +### NetProtectList + + +Perms: read + +Inputs: `null` + +Response: +```json +[ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" +] +``` + +### NetProtectRemove + + +Perms: admin + +Inputs: +```json +[ + [ + "12D3KooWGzxzKZYveHXtpG6AsrUJBcWxHBFS2HsEoGTxrMLvKXtf" + ] +] +``` + +Response: `{}` + ### NetPubsubScores diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index 6fad2700c09..c0392cc4a7c 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -258,38 +258,24 @@ [IndexProvider] - # The maximum number of multihash chunk links that index provider cache can store before - # LRU eviction. If chunks belonging to a single advertisement are larger than the cache can - # hold, the cache is resized to be able to hold all links. The actual disk usage depends on - # LinkedChunkSize and the length of multihashes. For example, for 128-bit long multihashes - # with the default LinkedChunkSize, and LinkCacheSize the cache size can grow to 256MiB. - # - # type int # env var: LOTUS_INDEXPROVIDER_LINKCACHESIZE #LinkCacheSize = 1024 - # The number of multihashes in each chunk of the - # advertised multihash entries linked list. If multihashes are 128-bit, then - # setting LinkedChunkSize = 16384 will result in blocks of 0.25MiB when - # full. - # - # type int # env var: LOTUS_INDEXPROVIDER_LINKEDCHUNKSIZE #LinkedChunkSize = 16384 - # The gossipsub topic name used to publish change to the advertised content. - # # env var: LOTUS_INDEXPROVIDER_PUBSUBTOPIC #PubSubTopic = "/indexer/ingest/mainnet" - # Whether to purge all cached entries on start-up. - # # env var: LOTUS_INDEXPROVIDER_PURGELINKCACHE #PurgeLinkCache = false - # Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised - # multihashes. Note that when port is set to 0 a random port is generated at runtime and may be - # different on every restart. The format of the strings specified must conform to multiaddress; + # env var: LOTUS_INDEXPROVIDER_PUBLISHERKIND + #PublisherKind = "dtsync" + + # Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised + # multihashes. Note that when port is set to 0 a random port is generated at runtime and may be + # different on every restart. The format of the strings specified must conform to multiaddress; # see https://multiformats.io/multiaddr/ # # type: []string @@ -304,13 +290,17 @@ # env var: LOTUS_INDEXPROVIDER_ANNOUNCEADDRESSES #AnnounceAddresses = [] - # The maximum number of simultaneous requests syncing the list of advertised multihashes between + # The maximum number of simultaneous requests syncing the list of advertised multihashes between # the indexers and the index provider. # # type: uint64 # env var: LOTUS_INDEXPROVIDER_MAXSIMULTANEOUSTRANSFERS #MaxSimultaneousTransfers = 20 + [IndexProvider.HttpPublisher] + # env var: LOTUS_INDEXPROVIDER_HTTPPUBLISHER_LISTENMULTIADDR + #ListenMultiaddr = "/ip4/0.0.0.0/tcp/3104/http" + [Sealing] # Upper bound on how many sectors can be waiting for more deals to be packed in it before it begins sealing at any given time. diff --git a/node/impl/net/protect.go b/node/impl/net/protect.go new file mode 100644 index 00000000000..1728985040a --- /dev/null +++ b/node/impl/net/protect.go @@ -0,0 +1,35 @@ +package net + +import ( + "context" + + "github.com/libp2p/go-libp2p-core/peer" +) + +const apiProtectTag = "api" + +func (a *NetAPI) NetProtectAdd(ctx context.Context, peers []peer.ID) error { + for _, p := range peers { + a.Host.ConnManager().Protect(p, apiProtectTag) + } + + return nil +} + +func (a *NetAPI) NetProtectRemove(ctx context.Context, peers []peer.ID) error { + for _, p := range peers { + a.Host.ConnManager().Unprotect(p, apiProtectTag) + } + + return nil +} + +func (a *NetAPI) NetProtectList(ctx context.Context) (result []peer.ID, err error) { + for _, conn := range a.Host.Network().Conns() { + if a.Host.ConnManager().IsProtected(conn.RemotePeer(), apiProtectTag) { + result = append(result, conn.RemotePeer()) + } + } + + return +} From c084130d3eb84a2ecc5acf3ceb63aafec90941f4 Mon Sep 17 00:00:00 2001 From: gammazero Date: Thu, 3 Feb 2022 14:56:21 -0800 Subject: [PATCH 59/99] Lotus chain nodes relay indexer pubsub messages Content providers announce the availability of indexer data using gossip pubsub. The content providers are not connected directly to indexers, so the pubsub messages are relayed to indexers via chain nodes. This PR makes chain nodes relay gossip pubsub messages, on the /indexer/ingest/ topic. --- build/params_shared_funcs.go | 1 + chain/sub/incoming.go | 21 +++++++++++++++++++++ metrics/metrics.go | 13 +++++++++++++ node/builder.go | 2 ++ node/builder_chain.go | 2 ++ node/modules/lp2p/pubsub.go | 1 + node/modules/services.go | 30 ++++++++++++++++++++++++++++++ 7 files changed, 70 insertions(+) diff --git a/build/params_shared_funcs.go b/build/params_shared_funcs.go index f59fee653e9..9d5dfa34777 100644 --- a/build/params_shared_funcs.go +++ b/build/params_shared_funcs.go @@ -13,6 +13,7 @@ import ( func BlocksTopic(netName dtypes.NetworkName) string { return "/fil/blocks/" + string(netName) } func MessagesTopic(netName dtypes.NetworkName) string { return "/fil/msgs/" + string(netName) } +func IngestTopic(netName dtypes.NetworkName) string { return "/indexer/ingest/" + string(netName) } func DhtProtocolName(netName dtypes.NetworkName) protocol.ID { return protocol.ID("/fil/kad/" + string(netName)) } diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index 2e962a2498c..dd18f25d05b 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -444,3 +444,24 @@ func recordFailure(ctx context.Context, metric *stats.Int64Measure, failureType ) stats.Record(ctx, metric.M(1)) } + +type IndexerMessageValidator struct { + self peer.ID +} + +func NewIndexerMessageValidator(self peer.ID) *IndexerMessageValidator { + return &IndexerMessageValidator{self: self} +} + +func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg *pubsub.Message) pubsub.ValidationResult { + // This chain-node should not be publishing its own messages. These are + // relayed from miner-nodes or index publishers. If a node appears to be + // local, reject it. + if pid == v.self { + log.Warnf("refusing to relay indexer message from self") + stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) + return pubsub.ValidationReject + } + stats.Record(ctx, metrics.IndexerMessageValidationSuccess.M(1)) + return pubsub.ValidationAccept +} diff --git a/metrics/metrics.go b/metrics/metrics.go index ddd149d8d9f..74549906989 100644 --- a/metrics/metrics.go +++ b/metrics/metrics.go @@ -76,6 +76,8 @@ var ( ChainNodeHeight = stats.Int64("chain/node_height", "Current Height of the node", stats.UnitDimensionless) ChainNodeHeightExpected = stats.Int64("chain/node_height_expected", "Expected Height of the node", stats.UnitDimensionless) ChainNodeWorkerHeight = stats.Int64("chain/node_worker_height", "Current Height of workers on the node", stats.UnitDimensionless) + IndexerMessageValidationFailure = stats.Int64("indexer/failure", "Counter for indexer message validation failures", stats.UnitDimensionless) + IndexerMessageValidationSuccess = stats.Int64("indexer/success", "Counter for indexer message validation successes", stats.UnitDimensionless) MessagePublished = stats.Int64("message/published", "Counter for total locally published messages", stats.UnitDimensionless) MessageReceived = stats.Int64("message/received", "Counter for total received messages", stats.UnitDimensionless) MessageValidationFailure = stats.Int64("message/failure", "Counter for message validation failures", stats.UnitDimensionless) @@ -191,6 +193,15 @@ var ( return view.Distribution(bounds...) }(), } + IndexerMessageValidationFailureView = &view.View{ + Measure: IndexerMessageValidationFailure, + Aggregation: view.Count(), + TagKeys: []tag.Key{FailureType, Local}, + } + IndexerMessageValidationSuccessView = &view.View{ + Measure: IndexerMessageValidationSuccess, + Aggregation: view.Count(), + } MessagePublishedView = &view.View{ Measure: MessagePublished, Aggregation: view.Count(), @@ -490,6 +501,8 @@ var ChainNodeViews = append([]*view.View{ BlockValidationSuccessView, BlockValidationDurationView, BlockDelayView, + IndexerMessageValidationFailureView, + IndexerMessageValidationSuccessView, MessagePublishedView, MessageReceivedView, MessageValidationFailureView, diff --git a/node/builder.go b/node/builder.go index 3f2e5950331..2f1ca182021 100644 --- a/node/builder.go +++ b/node/builder.go @@ -104,6 +104,8 @@ const ( HandleMigrateClientFundsKey HandlePaymentChannelManagerKey + RelayIndexerMessagesKey + // miner GetParamsKey HandleMigrateProviderFundsKey diff --git a/node/builder_chain.go b/node/builder_chain.go index 11283ec3a09..1e568397ea6 100644 --- a/node/builder_chain.go +++ b/node/builder_chain.go @@ -134,6 +134,8 @@ var ChainNode = Options( Override(new(*full.GasPriceCache), full.NewGasPriceCache), + Override(RelayIndexerMessagesKey, modules.RelayIndexerMessages), + // Lite node API ApplyIf(isLiteNode, Override(new(messagepool.Provider), messagepool.NewProviderLite), diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go index 32b85daf347..8fa005fcdc2 100644 --- a/node/modules/lp2p/pubsub.go +++ b/node/modules/lp2p/pubsub.go @@ -333,6 +333,7 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) { allowTopics := []string{ build.BlocksTopic(in.Nn), build.MessagesTopic(in.Nn), + build.IngestTopic(in.Nn), } allowTopics = append(allowTopics, drandTopics...) options = append(options, diff --git a/node/modules/services.go b/node/modules/services.go index 17d4a747641..db470aee20c 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -198,6 +198,36 @@ func HandleIncomingMessages(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub waitForSync(stmgr, pubsubMsgsSyncEpochs, subscribe) } +func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkName, h host.Host) error { + topicName := build.IngestTopic(nn) + + v := sub.NewIndexerMessageValidator(h.ID()) + + if err := ps.RegisterTopicValidator(topicName, v.Validate); err != nil { + panic(err) + } + + topicHandle, err := ps.Join(topicName) + if err != nil { + return xerrors.Errorf("failed to join pubsub topic %s: %w", topicName, err) + } + cancelFunc, err := topicHandle.Relay() + if err != nil { + return xerrors.Errorf("failed to relay to pubsub messages for topic %s: %w", topicName, err) + } + + // Cancel message relay on shutdown. + lc.Append(fx.Hook{ + OnStop: func(_ context.Context) error { + cancelFunc() + return nil + }, + }) + + log.Infof("relaying messages for pubsub topic %s", topicName) + return nil +} + func NewLocalDiscovery(lc fx.Lifecycle, ds dtypes.MetadataDS) (*discoveryimpl.Local, error) { local, err := discoveryimpl.NewLocal(namespace.Wrap(ds, datastore.NewKey("/deals/local"))) if err != nil { From 4691b2b809e2aca7848eb7b545ebe9bfc9ddd6a5 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Fri, 4 Feb 2022 12:15:01 +0400 Subject: [PATCH 60/99] changes to the indexer message relay PR --- build/params_shared_funcs.go | 4 +++- node/modules/lp2p/pubsub.go | 2 +- node/modules/services.go | 4 ++-- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/build/params_shared_funcs.go b/build/params_shared_funcs.go index 9d5dfa34777..f03a35fecb8 100644 --- a/build/params_shared_funcs.go +++ b/build/params_shared_funcs.go @@ -13,7 +13,9 @@ import ( func BlocksTopic(netName dtypes.NetworkName) string { return "/fil/blocks/" + string(netName) } func MessagesTopic(netName dtypes.NetworkName) string { return "/fil/msgs/" + string(netName) } -func IngestTopic(netName dtypes.NetworkName) string { return "/indexer/ingest/" + string(netName) } +func IndexerIngestTopic(netName dtypes.NetworkName) string { + return "/indexer/ingest/" + string(netName) +} func DhtProtocolName(netName dtypes.NetworkName) protocol.ID { return protocol.ID("/fil/kad/" + string(netName)) } diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go index 8fa005fcdc2..14f10045085 100644 --- a/node/modules/lp2p/pubsub.go +++ b/node/modules/lp2p/pubsub.go @@ -333,7 +333,7 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) { allowTopics := []string{ build.BlocksTopic(in.Nn), build.MessagesTopic(in.Nn), - build.IngestTopic(in.Nn), + build.IndexerIngestTopic(in.Nn), } allowTopics = append(allowTopics, drandTopics...) options = append(options, diff --git a/node/modules/services.go b/node/modules/services.go index d3b01ac6bbe..d0095075d6f 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -199,12 +199,12 @@ func HandleIncomingMessages(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub } func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkName, h host.Host) error { - topicName := build.IngestTopic(nn) + topicName := build.IndexerIngestTopic(nn) v := sub.NewIndexerMessageValidator(h.ID()) if err := ps.RegisterTopicValidator(topicName, v.Validate); err != nil { - panic(err) + return xerrors.Errorf("failed to register validator for topic %s, err: %w", topicName, err) } topicHandle, err := ps.Join(topicName) From ca46a79144e18c897f59882c747446741ba0d508 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Fri, 4 Feb 2022 13:04:07 +0400 Subject: [PATCH 61/99] protect full node connection --- markets/idxprov/mesh.go | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go index d073bbb1e07..3df990e1b2e 100644 --- a/markets/idxprov/mesh.go +++ b/markets/idxprov/mesh.go @@ -4,6 +4,10 @@ import ( "context" "fmt" + "github.com/libp2p/go-libp2p-core/network" + + "github.com/libp2p/go-libp2p-core/peer" + "github.com/filecoin-project/lotus/api/v1api" logging "github.com/ipfs/go-log/v2" @@ -21,16 +25,25 @@ type Libp2pMeshCreator struct { } func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { - addrs, err := mc.fullnodeApi.NetAddrsListen(ctx) + faddrs, err := mc.fullnodeApi.NetAddrsListen(ctx) if err != nil { return err } - if err := mc.idxProvHost.Connect(ctx, addrs); err != nil { + // if we already have a connection to the full node, there's nothing to do here + if mc.idxProvHost.Network().Connectedness(faddrs.ID) == network.Connected { + return nil + } + + // otherwise, connect to the full node, ask it to protect the connection and protect the connection on our end too + if err := mc.idxProvHost.Connect(ctx, faddrs); err != nil { return fmt.Errorf("failed to connect index provider host with the full node: %w", err) } - mc.idxProvHost.ConnManager().Protect(addrs.ID, "markets") - log.Debugw("successfully connected to full node", "fullNodeInfo", addrs.String()) + mc.idxProvHost.ConnManager().Protect(faddrs.ID, "markets") + mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{mc.idxProvHost.ID()}) + + log.Debugw("successfully connected to full node and asked it protect indexer provider peer conn", "fullNodeInfo", faddrs.String(), + "idxProviderPeerId", mc.idxProvHost.ID()) return nil } From daac7f298862272c3f7ac6ad9fd5d1021c9a882b Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Fri, 4 Feb 2022 13:55:26 +0400 Subject: [PATCH 62/99] fix lint --- markets/idxprov/mesh.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go index 3df990e1b2e..75f075742dd 100644 --- a/markets/idxprov/mesh.go +++ b/markets/idxprov/mesh.go @@ -40,7 +40,9 @@ func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { return fmt.Errorf("failed to connect index provider host with the full node: %w", err) } mc.idxProvHost.ConnManager().Protect(faddrs.ID, "markets") - mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{mc.idxProvHost.ID()}) + if err := mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{mc.idxProvHost.ID()}); err != nil { + return fmt.Errorf("failed to call NetProtectAdd on the full node, err: %w", err) + } log.Debugw("successfully connected to full node and asked it protect indexer provider peer conn", "fullNodeInfo", faddrs.String(), "idxProviderPeerId", mc.idxProvHost.ID()) From eb8296120b6a3ade2d9c92bde345e6ab02802c73 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Fri, 4 Feb 2022 13:58:47 +0400 Subject: [PATCH 63/99] changes to mesh creation code --- markets/idxprov/mesh.go | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go index 75f075742dd..5b580c7fda4 100644 --- a/markets/idxprov/mesh.go +++ b/markets/idxprov/mesh.go @@ -4,8 +4,6 @@ import ( "context" "fmt" - "github.com/libp2p/go-libp2p-core/network" - "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/lotus/api/v1api" @@ -27,19 +25,14 @@ type Libp2pMeshCreator struct { func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { faddrs, err := mc.fullnodeApi.NetAddrsListen(ctx) if err != nil { - return err - } - - // if we already have a connection to the full node, there's nothing to do here - if mc.idxProvHost.Network().Connectedness(faddrs.ID) == network.Connected { - return nil + return fmt.Errorf("failed to fetch full node listen addrs, err: %w", err) } // otherwise, connect to the full node, ask it to protect the connection and protect the connection on our end too if err := mc.idxProvHost.Connect(ctx, faddrs); err != nil { return fmt.Errorf("failed to connect index provider host with the full node: %w", err) } - mc.idxProvHost.ConnManager().Protect(faddrs.ID, "markets") + mc.idxProvHost.ConnManager().Protect(faddrs.ID, "index-provider-gossipsub") if err := mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{mc.idxProvHost.ID()}); err != nil { return fmt.Errorf("failed to call NetProtectAdd on the full node, err: %w", err) } From 1dc6a2fea6ce5726dd6a3954c8e7972e956448f6 Mon Sep 17 00:00:00 2001 From: gammazero Date: Tue, 8 Feb 2022 02:53:25 -0800 Subject: [PATCH 64/99] Add indexer pubsub message authentication and rate limiting --- chain/sub/incoming.go | 195 +++++++++++++++++++++++++++-- chain/sub/ratelimit/queue.go | 89 +++++++++++++ chain/sub/ratelimit/window.go | 70 +++++++++++ chain/sub/ratelimit/window_test.go | 61 +++++++++ node/modules/services.go | 5 +- 5 files changed, 411 insertions(+), 9 deletions(-) create mode 100644 chain/sub/ratelimit/queue.go create mode 100644 chain/sub/ratelimit/window.go create mode 100644 chain/sub/ratelimit/window_test.go diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index dd18f25d05b..c0ac42a5904 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -2,15 +2,17 @@ package sub import ( "context" - "fmt" + "sync" "time" address "github.com/filecoin-project/go-address" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/consensus" "github.com/filecoin-project/lotus/chain/messagepool" "github.com/filecoin-project/lotus/chain/store" + "github.com/filecoin-project/lotus/chain/sub/ratelimit" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/client" @@ -22,6 +24,7 @@ import ( connmgr "github.com/libp2p/go-libp2p-core/connmgr" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" + "github.com/multiformats/go-varint" "go.opencensus.io/stats" "go.opencensus.io/tag" "golang.org/x/xerrors" @@ -168,12 +171,12 @@ func fetchCids( cidIndex := make(map[cid.Cid]int) for i, c := range cids { if c.Prefix() != msgCidPrefix { - return fmt.Errorf("invalid msg CID: %s", c) + return xerrors.Errorf("invalid msg CID: %s", c) } cidIndex[c] = i } if len(cids) != len(cidIndex) { - return fmt.Errorf("duplicate CIDs in fetchCids input") + return xerrors.Errorf("duplicate CIDs in fetchCids input") } for block := range bserv.GetBlocks(ctx, cids) { @@ -196,7 +199,7 @@ func fetchCids( if len(cidIndex) > 0 { err := ctx.Err() if err == nil { - err = fmt.Errorf("failed to fetch %d messages for unknown reasons", len(cidIndex)) + err = xerrors.Errorf("failed to fetch %d messages for unknown reasons", len(cidIndex)) } return err } @@ -445,23 +448,199 @@ func recordFailure(ctx context.Context, metric *stats.Int64Measure, failureType stats.Record(ctx, metric.M(1)) } +type peerMsgInfo struct { + peerID peer.ID + lastCid cid.Cid + rateLimit *ratelimit.Window + mutex sync.Mutex +} + type IndexerMessageValidator struct { self peer.ID + + peerCache *lru.TwoQueueCache + fullNode api.FullNode } -func NewIndexerMessageValidator(self peer.ID) *IndexerMessageValidator { - return &IndexerMessageValidator{self: self} +func NewIndexerMessageValidator(self peer.ID, fullNode api.FullNode) *IndexerMessageValidator { + peerCache, _ := lru.New2Q(1024) + + return &IndexerMessageValidator{ + self: self, + peerCache: peerCache, + fullNode: fullNode, + } } func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg *pubsub.Message) pubsub.ValidationResult { // This chain-node should not be publishing its own messages. These are - // relayed from miner-nodes or index publishers. If a node appears to be - // local, reject it. + // relayed from market-nodes. If a node appears to be local, reject it. if pid == v.self { log.Warnf("refusing to relay indexer message from self") stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) return pubsub.ValidationReject } + originPeer := msg.GetFrom() + if originPeer == v.self { + log.Warnf("refusing to relay indexer message originating from self") + stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) + return pubsub.ValidationReject + } + + // Decode CID and originator addresses from message. + minerID, msgCid, err := decodeIndexerMessage(msg.Data) + if err != nil { + log.Errorw("Could not decode pubsub message", "err", err) + return pubsub.ValidationReject + } + + if minerID == "" { + log.Warnw("ignoring messsage missing miner id", "peer", originPeer) + return pubsub.ValidationIgnore + } + + var msgInfo *peerMsgInfo + val, ok := v.peerCache.Get(minerID) + if !ok { + msgInfo = &peerMsgInfo{} + } else { + msgInfo = val.(*peerMsgInfo) + } + + // Lock this peer's message info. + msgInfo.mutex.Lock() + defer msgInfo.mutex.Unlock() + + if !ok || originPeer != msgInfo.peerID { + // Check that the message was signed by an authenticated peer. + err = v.authenticateMessage(ctx, minerID, originPeer) + if err != nil { + log.Warnw("cannot authenticate messsage", "err", err, "peer", originPeer, "minerID", minerID) + stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) + return pubsub.ValidationReject + } + msgInfo.peerID = originPeer + if !ok { + // Add msgInfo to cache only after being authenticated. If two + // messages from the same peer are handled concurrently, there is a + // small chance that one msgInfo could replace the other here when + // the info is first cached. This is OK, so no need to prevent it. + v.peerCache.Add(minerID, msgInfo) + } + } + + // See if message needs to be ignored due to rate limiting. + if v.rateLimitPeer(msgInfo, msgCid) { + return pubsub.ValidationIgnore + } + stats.Record(ctx, metrics.IndexerMessageValidationSuccess.M(1)) return pubsub.ValidationAccept } + +func (v *IndexerMessageValidator) rateLimitPeer(msgInfo *peerMsgInfo, msgCid cid.Cid) bool { + const ( + msgLimit = 5 + msgTimeLimit = 10 * time.Second + repeatTimeLimit = 2 * time.Hour + ) + + timeWindow := msgInfo.rateLimit + + // Check overall message rate. + if timeWindow == nil { + timeWindow = ratelimit.NewWindow(msgLimit, msgTimeLimit) + msgInfo.rateLimit = timeWindow + } else if msgInfo.lastCid == msgCid { + // Check if this is a repeat of the previous message data. + if time.Since(timeWindow.Newest()) < repeatTimeLimit { + log.Warnw("ignoring repeated indexer message", "sender", msgInfo.peerID) + return true + } + } + + err := timeWindow.Add() + if err != nil { + log.Warnw("ignoring indexer message", "sender", msgInfo.peerID, "err", err) + return true + } + + msgInfo.lastCid = msgCid + + return false +} + +func decodeIndexerMessage(data []byte) (string, cid.Cid, error) { + n, msgCid, err := cid.CidFromBytes(data) + if err != nil { + return "", cid.Undef, err + } + if n > len(data) { + return "", cid.Undef, xerrors.New("bad cid length encoding") + } + data = data[n:] + + var minerID string + + if len(data) != 0 { + addrCount, n, err := varint.FromUvarint(data) + if err != nil { + return "", cid.Undef, xerrors.Errorf("cannot read number of multiaddrs: %w", err) + } + if n > len(data) { + return "", cid.Undef, xerrors.New("bad multiaddr count encoding") + } + data = data[n:] + + if addrCount != 0 { + // Read multiaddrs if there is any more data in message data. This allows + // backward-compatability with publishers that do not supply address data. + for i := 0; i < int(addrCount); i++ { + val, n, err := varint.FromUvarint(data) + if err != nil { + return "", cid.Undef, xerrors.Errorf("cannot read multiaddrs length: %w", err) + } + if n > len(data) { + return "", cid.Undef, xerrors.New("bad multiaddr length encoding") + } + data = data[n:] + + if len(data) < int(val) { + return "", cid.Undef, xerrors.New("bad multiaddr encoding") + } + data = data[val:] + } + } + if len(data) != 0 { + minerID = string(data) + } + } + + return minerID, msgCid, nil +} + +func (v *IndexerMessageValidator) authenticateMessage(ctx context.Context, minerID string, peerID peer.ID) error { + // Get miner info from lotus + minerAddress, err := address.NewFromString(minerID) + if err != nil { + return xerrors.Errorf("invalid miner id: %w", err) + } + + ts, err := v.fullNode.ChainHead(ctx) + if err != nil { + return err + } + + minerInfo, err := v.fullNode.StateMinerInfo(ctx, minerAddress, ts.Key()) + if err != nil { + return err + } + + if minerInfo.PeerId == nil { + return xerrors.New("no peer id for miner") + } + if *minerInfo.PeerId != peerID { + return xerrors.New("message not signed by peer in miner info") + } + return nil +} diff --git a/chain/sub/ratelimit/queue.go b/chain/sub/ratelimit/queue.go new file mode 100644 index 00000000000..d5ed001fde4 --- /dev/null +++ b/chain/sub/ratelimit/queue.go @@ -0,0 +1,89 @@ +package ratelimit + +import "errors" + +var ErrRate = errors.New("rate exceeded") + +type queue struct { + buf []int64 + count int + head int + tail int +} + +// cap returns the queue capacity +func (q *queue) cap() int { + return len(q.buf) +} + +// len returns the number of items in the queue +func (q *queue) len() int { + return q.count +} + +// push adds an element to the end of the queue. +func (q *queue) push(elem int64) error { + if q.count == len(q.buf) { + return ErrRate + } + + q.buf[q.tail] = elem + // Calculate new tail position. + q.tail = q.next(q.tail) + q.count++ + return nil +} + +// pop removes and returns the element from the front of the queue. +func (q *queue) pop() int64 { + if q.count <= 0 { + panic("pop from empty queue") + } + ret := q.buf[q.head] + + // Calculate new head position. + q.head = q.next(q.head) + q.count-- + + return ret +} + +// front returns the element at the front of the queue. This is the element +// that would be returned by pop(). This call panics if the queue is empty. +func (q *queue) front() int64 { + if q.count <= 0 { + panic("front() called when empty") + } + return q.buf[q.head] +} + +// back returns the element at the back of the queue. This call panics if the +// queue is empty. +func (q *queue) back() int64 { + if q.count <= 0 { + panic("back() called when empty") + } + return q.buf[q.prev(q.tail)] +} + +// prev returns the previous buffer position wrapping around buffer. +func (q *queue) prev(i int) int { + if i == 0 { + return len(q.buf) - 1 + } + return (i - 1) % len(q.buf) +} + +// next returns the next buffer position wrapping around buffer. +func (q *queue) next(i int) int { + return (i + 1) % len(q.buf) +} + +// truncate pops values that are less than or equal the specified threshold. +func (q *queue) truncate(threshold int64) { + for q.count != 0 && q.buf[q.head] <= threshold { + // pop() without returning a value + q.head = q.next(q.head) + q.count-- + } +} diff --git a/chain/sub/ratelimit/window.go b/chain/sub/ratelimit/window.go new file mode 100644 index 00000000000..f0429d3d383 --- /dev/null +++ b/chain/sub/ratelimit/window.go @@ -0,0 +1,70 @@ +package ratelimit + +import "time" + +// Window is a time windows for counting events within a span of time. The +// windows slides forward in time so that it spans from the most recent event +// to size time in the past. +type Window struct { + q *queue + size int64 +} + +// NewWindow creates a new Window that limits the number of events to maximum +// count of events withing a duration of time. The capacity sets the maximum +// number of events, and size sets the span of time over which the events are +// counted. +func NewWindow(capacity int, size time.Duration) *Window { + return &Window{ + q: &queue{ + buf: make([]int64, capacity), + }, + size: int64(size), + } +} + +// Add attempts to append a new timestamp into the current window. Previously +// added values that are not not within `size` difference from the value being +// added are first removed. Add fails if adding the value would cause the +// window to exceed capacity. +func (w *Window) Add() error { + now := time.Now().UnixNano() + if w.Len() != 0 { + w.q.truncate(now - w.size) + } + return w.q.push(now) +} + +// Cap returns the maximum number of items the window can hold. +func (w *Window) Cap() int { + return w.q.cap() +} + +// Len returns the number of elements currently in the window. +func (w *Window) Len() int { + return w.q.len() +} + +// Span returns the distance from the first to the last item in the window. +func (w *Window) Span() time.Duration { + if w.q.len() < 2 { + return 0 + } + return time.Duration(w.q.back() - w.q.front()) +} + +// Oldest returns the oldest timestamp in the window. +func (w *Window) Oldest() time.Time { + if w.q.len() == 0 { + return time.Time{} + } + return time.Unix(0, w.q.front()) +} + +// Newest returns the newest timestamp in the window. +func (w *Window) Newest() time.Time { + if w.q.len() == 0 { + return time.Time{} + } + return time.Unix(0, w.q.back()) +} diff --git a/chain/sub/ratelimit/window_test.go b/chain/sub/ratelimit/window_test.go new file mode 100644 index 00000000000..f656d6a0b15 --- /dev/null +++ b/chain/sub/ratelimit/window_test.go @@ -0,0 +1,61 @@ +package ratelimit + +import ( + "testing" + "time" +) + +func TestWindow(t *testing.T) { + const ( + maxEvents = 3 + timeLimit = 100 * time.Millisecond + ) + w := NewWindow(maxEvents, timeLimit) + if w.Len() != 0 { + t.Fatal("q.Len() =", w.Len(), "expect 0") + } + if w.Cap() != maxEvents { + t.Fatal("q.Cap() =", w.Cap(), "expect 3") + } + if !w.Newest().IsZero() { + t.Fatal("expected newest to be zero time with empty window") + } + if !w.Oldest().IsZero() { + t.Fatal("expected oldest to be zero time with empty window") + } + if w.Span() != 0 { + t.Fatal("expected span to be zero time with empty window") + } + + var err error + for i := 0; i < maxEvents; i++ { + err = w.Add() + if err != nil { + t.Fatalf("cannot add event %d", i) + } + } + if w.Len() != maxEvents { + t.Fatalf("q.Len() is %d, expected %d", w.Len(), maxEvents) + } + if err = w.Add(); err == nil { + t.Fatalf("add event %d within time limit should have failed", maxEvents+1) + } + + time.Sleep(timeLimit) + if err = w.Add(); err != nil { + t.Fatalf("cannot add event after time limit: %s", err) + } + + prev := w.Newest() + time.Sleep(timeLimit) + err = w.Add() + if err != nil { + t.Fatalf("cannot add event") + } + if w.Newest().Before(prev) { + t.Fatal("newest is before previous value") + } + if w.Oldest().Before(prev) { + t.Fatal("oldest is before previous value") + } +} diff --git a/node/modules/services.go b/node/modules/services.go index d0095075d6f..320a46d943c 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -20,6 +20,7 @@ import ( "github.com/filecoin-project/go-fil-markets/discovery" discoveryimpl "github.com/filecoin-project/go-fil-markets/discovery/impl" + "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/beacon" @@ -201,7 +202,9 @@ func HandleIncomingMessages(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkName, h host.Host) error { topicName := build.IndexerIngestTopic(nn) - v := sub.NewIndexerMessageValidator(h.ID()) + // TODO: How do this get set? + var fullNode api.FullNode + v := sub.NewIndexerMessageValidator(h.ID(), fullNode) if err := ps.RegisterTopicValidator(topicName, v.Validate); err != nil { return xerrors.Errorf("failed to register validator for topic %s, err: %w", topicName, err) From b2805823ce70fd5d7a194a00bdf975b0ab5ab892 Mon Sep 17 00:00:00 2001 From: gammazero Date: Tue, 8 Feb 2022 04:55:59 -0800 Subject: [PATCH 65/99] Pass to validator the interfaces needed to get miner info --- chain/sub/incoming.go | 20 ++++++++++++-------- node/modules/services.go | 8 +++----- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index c0ac42a5904..e39d0177fb3 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -6,7 +6,7 @@ import ( "time" address "github.com/filecoin-project/go-address" - "github.com/filecoin-project/lotus/api" + //"github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/consensus" @@ -16,6 +16,7 @@ import ( "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/metrics" "github.com/filecoin-project/lotus/node/impl/client" + "github.com/filecoin-project/lotus/node/impl/full" lru "github.com/hashicorp/golang-lru" blocks "github.com/ipfs/go-block-format" bserv "github.com/ipfs/go-blockservice" @@ -459,16 +460,18 @@ type IndexerMessageValidator struct { self peer.ID peerCache *lru.TwoQueueCache - fullNode api.FullNode + chainApi full.ChainModuleAPI + stateApi full.StateModuleAPI } -func NewIndexerMessageValidator(self peer.ID, fullNode api.FullNode) *IndexerMessageValidator { +func NewIndexerMessageValidator(self peer.ID, chainApi full.ChainModuleAPI, stateApi full.StateModuleAPI) *IndexerMessageValidator { peerCache, _ := lru.New2Q(1024) return &IndexerMessageValidator{ self: self, peerCache: peerCache, - fullNode: fullNode, + chainApi: chainApi, + stateApi: stateApi, } } @@ -512,7 +515,7 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg defer msgInfo.mutex.Unlock() if !ok || originPeer != msgInfo.peerID { - // Check that the message was signed by an authenticated peer. + // Check that the miner ID maps to the peer that sent the message. err = v.authenticateMessage(ctx, minerID, originPeer) if err != nil { log.Warnw("cannot authenticate messsage", "err", err, "peer", originPeer, "minerID", minerID) @@ -626,12 +629,12 @@ func (v *IndexerMessageValidator) authenticateMessage(ctx context.Context, miner return xerrors.Errorf("invalid miner id: %w", err) } - ts, err := v.fullNode.ChainHead(ctx) + ts, err := v.chainApi.ChainHead(ctx) if err != nil { return err } - minerInfo, err := v.fullNode.StateMinerInfo(ctx, minerAddress, ts.Key()) + minerInfo, err := v.stateApi.StateMinerInfo(ctx, minerAddress, ts.Key()) if err != nil { return err } @@ -640,7 +643,8 @@ func (v *IndexerMessageValidator) authenticateMessage(ctx context.Context, miner return xerrors.New("no peer id for miner") } if *minerInfo.PeerId != peerID { - return xerrors.New("message not signed by peer in miner info") + return xerrors.New("miner id does not map to peer that sent message") } + return nil } diff --git a/node/modules/services.go b/node/modules/services.go index 320a46d943c..95a2399d2da 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -20,7 +20,6 @@ import ( "github.com/filecoin-project/go-fil-markets/discovery" discoveryimpl "github.com/filecoin-project/go-fil-markets/discovery/impl" - "github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/beacon" @@ -36,6 +35,7 @@ import ( "github.com/filecoin-project/lotus/lib/peermgr" marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/hello" + "github.com/filecoin-project/lotus/node/impl/full" "github.com/filecoin-project/lotus/node/modules/dtypes" "github.com/filecoin-project/lotus/node/modules/helpers" "github.com/filecoin-project/lotus/node/repo" @@ -199,12 +199,10 @@ func HandleIncomingMessages(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub waitForSync(stmgr, pubsubMsgsSyncEpochs, subscribe) } -func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkName, h host.Host) error { +func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkName, h host.Host, chainModule full.ChainModule, stateModule full.StateModule) error { topicName := build.IndexerIngestTopic(nn) - // TODO: How do this get set? - var fullNode api.FullNode - v := sub.NewIndexerMessageValidator(h.ID(), fullNode) + v := sub.NewIndexerMessageValidator(h.ID(), &chainModule, &stateModule) if err := ps.RegisterTopicValidator(topicName, v.Validate); err != nil { return xerrors.Errorf("failed to register validator for topic %s, err: %w", topicName, err) From cc61650f8694ef9e055f9bd06938f149d2bf8950 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Tue, 8 Feb 2022 13:17:05 +0000 Subject: [PATCH 66/99] Upgrade to latest `index-provider` and set miner ID as extra gossip data Upgrade to the latest `index-provider` which upgrades the go-legs protocol to allow the inclusion of extra gossip data that may be used for gossip validation purposes. In the case of lotus gossip message validators the miner ID is used to verify the sender's peer ID on chain. Relates to: - https://github.com/filecoin-project/lotus/pull/8045 --- go.mod | 2 +- go.sum | 6 ++++-- node/modules/storageminer_idxprov.go | 12 +++++++++--- 3 files changed, 14 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index 353e5ba7d21..a01ddb8eb1e 100644 --- a/go.mod +++ b/go.mod @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.2.6 + github.com/filecoin-project/index-provider v0.2.7 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index c17fbce0d44..45818568329 100644 --- a/go.sum +++ b/go.sum @@ -350,8 +350,9 @@ github.com/filecoin-project/go-indexer-core v0.2.8 h1:h1SRdZKTVcaXlzex3UevHh4OWD github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.2.7 h1:+b1BQv4QKkRNsDUE8Z4sEhLXhfVQ+iGpHhANpYqxJlA= github.com/filecoin-project/go-legs v0.2.7/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= +github.com/filecoin-project/go-legs v0.2.8 h1:l76g9Yi7YzxNHwe60jPmQiezUUF0TMjqB/NP4+f23vU= +github.com/filecoin-project/go-legs v0.2.8/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -373,8 +374,9 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.2.6 h1:JodDoTiLjDPifRxKSgoyDwD8qzbSZDcyn5IPF0osVAg= github.com/filecoin-project/index-provider v0.2.6/go.mod h1:y87dsIQdcmQS5PWIcifQdRb454ViVxjjFEccMDswIjQ= +github.com/filecoin-project/index-provider v0.2.7 h1:9L2OxdMHT9HttBFCRg/zUVzBiBedPHPpAsSxBYvY9Cg= +github.com/filecoin-project/index-provider v0.2.7/go.mod h1:yLY8V22PYiEvwWaJSXpxwjI4jq6TFaVuBvQHOH/6+wE= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 8e59558faf1..dfbc669d350 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -19,6 +19,7 @@ import ( "github.com/libp2p/go-libp2p-core/peerstore" "go.uber.org/fx" + "github.com/filecoin-project/go-address" datatransfer "github.com/filecoin-project/go-data-transfer" dtimpl "github.com/filecoin-project/go-data-transfer/impl" dtnet "github.com/filecoin-project/go-data-transfer/network" @@ -65,8 +66,8 @@ func IndexProviderHost(cfg config.IndexProviderConfig) func(IdxProv) (idxprov.Ho } } -func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, h idxprov.Host) (provider.Interface, error) { - return func(args IdxProv, marketHost host.Host, h idxprov.Host) (provider.Interface, error) { +func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, h idxprov.Host, maddr dtypes.MinerAddress) (provider.Interface, error) { + return func(args IdxProv, marketHost host.Host, h idxprov.Host, maddr dtypes.MinerAddress) (provider.Interface, error) { ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/index-provider")) pkey := args.Peerstore.PrivKey(args.PeerID) @@ -84,7 +85,12 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo maddrs = append(maddrs, a.String()) } - e, err := engine.New(cfg.Ingest, pkey, dt, h, ipds, maddrs) + // Get the miner ID and set as extra gossip data. + // The extra data is required by the lotus-specific index-provider gossip message validators. + ma := address.Address(maddr) + log.Info("Using extra gossip data in index provider engine: %s", ma.String()) + + e, err := engine.New(cfg.Ingest, pkey, dt, h, ipds, maddrs, engine.WithExtraGossipData(ma.Bytes())) if err != nil { return nil, xerrors.Errorf("creating indexer provider engine: %w", err) } From a62e0270025a17facc64ce416c5901e0a298ab9c Mon Sep 17 00:00:00 2001 From: gammazero Date: Wed, 9 Feb 2022 10:29:49 -0800 Subject: [PATCH 67/99] review changes --- chain/sub/incoming.go | 5 ++--- chain/sub/ratelimit/queue.go | 4 ++-- chain/sub/ratelimit/window_test.go | 4 ++-- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index e39d0177fb3..222ad3dea29 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -6,7 +6,6 @@ import ( "time" address "github.com/filecoin-project/go-address" - //"github.com/filecoin-project/lotus/api" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/consensus" @@ -465,7 +464,7 @@ type IndexerMessageValidator struct { } func NewIndexerMessageValidator(self peer.ID, chainApi full.ChainModuleAPI, stateApi full.StateModuleAPI) *IndexerMessageValidator { - peerCache, _ := lru.New2Q(1024) + peerCache, _ := lru.New2Q(8192) return &IndexerMessageValidator{ self: self, @@ -498,7 +497,7 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg } if minerID == "" { - log.Warnw("ignoring messsage missing miner id", "peer", originPeer) + log.Debugw("ignoring messsage missing miner id", "peer", originPeer) return pubsub.ValidationIgnore } diff --git a/chain/sub/ratelimit/queue.go b/chain/sub/ratelimit/queue.go index d5ed001fde4..49f9bef6682 100644 --- a/chain/sub/ratelimit/queue.go +++ b/chain/sub/ratelimit/queue.go @@ -2,7 +2,7 @@ package ratelimit import "errors" -var ErrRate = errors.New("rate exceeded") +var ErrRateLimitExceeded = errors.New("rate limit exceeded") type queue struct { buf []int64 @@ -24,7 +24,7 @@ func (q *queue) len() int { // push adds an element to the end of the queue. func (q *queue) push(elem int64) error { if q.count == len(q.buf) { - return ErrRate + return ErrRateLimitExceeded } q.buf[q.tail] = elem diff --git a/chain/sub/ratelimit/window_test.go b/chain/sub/ratelimit/window_test.go index f656d6a0b15..c86b65ef75b 100644 --- a/chain/sub/ratelimit/window_test.go +++ b/chain/sub/ratelimit/window_test.go @@ -37,8 +37,8 @@ func TestWindow(t *testing.T) { if w.Len() != maxEvents { t.Fatalf("q.Len() is %d, expected %d", w.Len(), maxEvents) } - if err = w.Add(); err == nil { - t.Fatalf("add event %d within time limit should have failed", maxEvents+1) + if err = w.Add(); err != ErrRateLimitExceeded { + t.Fatalf("add event %d within time limit should have failed with err: %s", maxEvents+1, ErrRateLimitExceeded) } time.Sleep(timeLimit) From 3ff209d95d76def5fc648b8d08ab4366c925bb46 Mon Sep 17 00:00:00 2001 From: gammazero Date: Wed, 9 Feb 2022 11:06:56 -0800 Subject: [PATCH 68/99] Add replay rejection --- chain/sub/incoming.go | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index 222ad3dea29..f8578bee80c 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -1,6 +1,7 @@ package sub import ( + "bytes" "context" "sync" "time" @@ -451,6 +452,7 @@ func recordFailure(ctx context.Context, metric *stats.Int64Measure, failureType type peerMsgInfo struct { peerID peer.ID lastCid cid.Cid + lastSeqno []byte rateLimit *ratelimit.Window mutex sync.Mutex } @@ -513,6 +515,17 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg msgInfo.mutex.Lock() defer msgInfo.mutex.Unlock() + if ok { + // Reject replayed messages. + seqno := msg.Message.GetSeqno() + if bytes.Equal(msgInfo.lastSeqno, seqno) { + log.Warnf("rejecting replayed indexer message") + stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) + return pubsub.ValidationReject + } + msgInfo.lastSeqno = seqno + } + if !ok || originPeer != msgInfo.peerID { // Check that the miner ID maps to the peer that sent the message. err = v.authenticateMessage(ctx, minerID, originPeer) From 681ce94a34f71a970e8569b66bab0e637b1eafe7 Mon Sep 17 00:00:00 2001 From: gammazero Date: Wed, 9 Feb 2022 16:21:05 -0800 Subject: [PATCH 69/99] Correctly handle seqno check --- chain/sub/incoming.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index f8578bee80c..acec90c728b 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -1,8 +1,8 @@ package sub import ( - "bytes" "context" + "encoding/binary" "sync" "time" @@ -452,7 +452,7 @@ func recordFailure(ctx context.Context, metric *stats.Int64Measure, failureType type peerMsgInfo struct { peerID peer.ID lastCid cid.Cid - lastSeqno []byte + lastSeqno uint64 rateLimit *ratelimit.Window mutex sync.Mutex } @@ -517,11 +517,10 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg if ok { // Reject replayed messages. - seqno := msg.Message.GetSeqno() - if bytes.Equal(msgInfo.lastSeqno, seqno) { - log.Warnf("rejecting replayed indexer message") - stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) - return pubsub.ValidationReject + seqno := binary.BigEndian.Uint64(msg.Message.GetSeqno()) + if seqno <= msgInfo.lastSeqno { + log.Debugf("ignoring replayed indexer message") + return pubsub.ValidationIgnore } msgInfo.lastSeqno = seqno } From 9481fa0a4b5ed18575947fa413d5de936f6437f3 Mon Sep 17 00:00:00 2001 From: gammazero Date: Wed, 9 Feb 2022 16:40:27 -0800 Subject: [PATCH 70/99] Use new indexer pubsub message encoding --- chain/sub/incoming.go | 64 ++++++------------------------------------- go.mod | 1 + go.sum | 3 +- 3 files changed, 12 insertions(+), 56 deletions(-) diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index acec90c728b..4277503fda6 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -1,12 +1,14 @@ package sub import ( + "bytes" "context" "encoding/binary" "sync" "time" address "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-legs/dtsync" "github.com/filecoin-project/lotus/build" "github.com/filecoin-project/lotus/chain" "github.com/filecoin-project/lotus/chain/consensus" @@ -25,7 +27,6 @@ import ( connmgr "github.com/libp2p/go-libp2p-core/connmgr" "github.com/libp2p/go-libp2p-core/peer" pubsub "github.com/libp2p/go-libp2p-pubsub" - "github.com/multiformats/go-varint" "go.opencensus.io/stats" "go.opencensus.io/tag" "golang.org/x/xerrors" @@ -491,18 +492,20 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg return pubsub.ValidationReject } - // Decode CID and originator addresses from message. - minerID, msgCid, err := decodeIndexerMessage(msg.Data) + idxrMsg := dtsync.Message{} + err := idxrMsg.UnmarshalCBOR(bytes.NewBuffer(msg.Data)) if err != nil { - log.Errorw("Could not decode pubsub message", "err", err) + log.Errorw("Could not decode indexer pubsub message", "err", err) return pubsub.ValidationReject } - - if minerID == "" { + if len(idxrMsg.ExtraData) == 0 { log.Debugw("ignoring messsage missing miner id", "peer", originPeer) return pubsub.ValidationIgnore } + minerID := string(idxrMsg.ExtraData) + msgCid := idxrMsg.Cid + var msgInfo *peerMsgInfo val, ok := v.peerCache.Get(minerID) if !ok { @@ -584,55 +587,6 @@ func (v *IndexerMessageValidator) rateLimitPeer(msgInfo *peerMsgInfo, msgCid cid return false } -func decodeIndexerMessage(data []byte) (string, cid.Cid, error) { - n, msgCid, err := cid.CidFromBytes(data) - if err != nil { - return "", cid.Undef, err - } - if n > len(data) { - return "", cid.Undef, xerrors.New("bad cid length encoding") - } - data = data[n:] - - var minerID string - - if len(data) != 0 { - addrCount, n, err := varint.FromUvarint(data) - if err != nil { - return "", cid.Undef, xerrors.Errorf("cannot read number of multiaddrs: %w", err) - } - if n > len(data) { - return "", cid.Undef, xerrors.New("bad multiaddr count encoding") - } - data = data[n:] - - if addrCount != 0 { - // Read multiaddrs if there is any more data in message data. This allows - // backward-compatability with publishers that do not supply address data. - for i := 0; i < int(addrCount); i++ { - val, n, err := varint.FromUvarint(data) - if err != nil { - return "", cid.Undef, xerrors.Errorf("cannot read multiaddrs length: %w", err) - } - if n > len(data) { - return "", cid.Undef, xerrors.New("bad multiaddr length encoding") - } - data = data[n:] - - if len(data) < int(val) { - return "", cid.Undef, xerrors.New("bad multiaddr encoding") - } - data = data[val:] - } - } - if len(data) != 0 { - minerID = string(data) - } - } - - return minerID, msgCid, nil -} - func (v *IndexerMessageValidator) authenticateMessage(ctx context.Context, minerID string, peerID peer.ID) error { // Get miner info from lotus minerAddress, err := address.NewFromString(minerID) diff --git a/go.mod b/go.mod index 2d3e7d232e7..23ab5a0c2f6 100644 --- a/go.mod +++ b/go.mod @@ -39,6 +39,7 @@ require ( github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203152434-8790cca614d3 github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 + github.com/filecoin-project/go-legs v0.3.0 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 github.com/filecoin-project/go-state-types v0.1.3 diff --git a/go.sum b/go.sum index b2ebceb1c3d..22cf52fe8c2 100644 --- a/go.sum +++ b/go.sum @@ -350,8 +350,9 @@ github.com/filecoin-project/go-indexer-core v0.2.8 h1:h1SRdZKTVcaXlzex3UevHh4OWD github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.2.7 h1:+b1BQv4QKkRNsDUE8Z4sEhLXhfVQ+iGpHhANpYqxJlA= github.com/filecoin-project/go-legs v0.2.7/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= +github.com/filecoin-project/go-legs v0.3.0 h1:1rDNdPdXbgetmmvRcYZV5YIplIO8LtBVQ7ZttKCrTrM= +github.com/filecoin-project/go-legs v0.3.0/go.mod h1:x6nwM+DuN7NzlPndOoJuiHYCX+pze6+efPRx17nIA7M= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= From f0accce286500987b2718b1f8cc6fc7ef3f3d4a4 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 10 Feb 2022 12:18:06 +0000 Subject: [PATCH 71/99] Upgrade `index-provider` and go-fil-markets to latest See: https://github.com/filecoin-project/go-fil-markets/pull/680 --- go.mod | 4 ++-- go.sum | 13 ++++++------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index a01ddb8eb1e..0516abd2302 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203152434-8790cca614d3 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220210121001-44fb837759c1 github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-padreader v0.0.1 @@ -45,7 +45,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.2.7 + github.com/filecoin-project/index-provider v0.3.0 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index 45818568329..e1edde31d99 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203152434-8790cca614d3 h1:ak9I3TaeAQof84/DsyJ2BO1rShP77OfyZEiVNltjYAs= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220203152434-8790cca614d3/go.mod h1:gnZw2JAtaGcAwGA7ASD3cvO7Laz1N06VLP9FVEQfnRg= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220210121001-44fb837759c1 h1:gGfvTCfHDCqEfVhGZSIALKtzF3D4p5Lhm4wH4KGv+60= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220210121001-44fb837759c1/go.mod h1:Q7EWzO9s4sg2KYBUJduTYdtVhVhusDuH2W0keyyub3I= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -351,8 +351,8 @@ github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43 github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.2.7/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= -github.com/filecoin-project/go-legs v0.2.8 h1:l76g9Yi7YzxNHwe60jPmQiezUUF0TMjqB/NP4+f23vU= -github.com/filecoin-project/go-legs v0.2.8/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= +github.com/filecoin-project/go-legs v0.3.0 h1:1rDNdPdXbgetmmvRcYZV5YIplIO8LtBVQ7ZttKCrTrM= +github.com/filecoin-project/go-legs v0.3.0/go.mod h1:x6nwM+DuN7NzlPndOoJuiHYCX+pze6+efPRx17nIA7M= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -374,9 +374,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.2.6/go.mod h1:y87dsIQdcmQS5PWIcifQdRb454ViVxjjFEccMDswIjQ= -github.com/filecoin-project/index-provider v0.2.7 h1:9L2OxdMHT9HttBFCRg/zUVzBiBedPHPpAsSxBYvY9Cg= -github.com/filecoin-project/index-provider v0.2.7/go.mod h1:yLY8V22PYiEvwWaJSXpxwjI4jq6TFaVuBvQHOH/6+wE= +github.com/filecoin-project/index-provider v0.3.0 h1:+oU4whsKq2x2Z/sQfd2gVGDrARrOZVpR/irlGsKaxSc= +github.com/filecoin-project/index-provider v0.3.0/go.mod h1:3m4D2O+o649LfrsgNCZqTiiY6r+t9qF5g55jhB3PPLo= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= From 3f3d61b0434a050f3e4ef98fd341eb1ff3767cff Mon Sep 17 00:00:00 2001 From: gammazero Date: Thu, 10 Feb 2022 08:41:18 -0800 Subject: [PATCH 72/99] Service creation takes interface, not implementation --- node/modules/services.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/modules/services.go b/node/modules/services.go index 95a2399d2da..6c9a23d491c 100644 --- a/node/modules/services.go +++ b/node/modules/services.go @@ -199,10 +199,10 @@ func HandleIncomingMessages(mctx helpers.MetricsCtx, lc fx.Lifecycle, ps *pubsub waitForSync(stmgr, pubsubMsgsSyncEpochs, subscribe) } -func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkName, h host.Host, chainModule full.ChainModule, stateModule full.StateModule) error { +func RelayIndexerMessages(lc fx.Lifecycle, ps *pubsub.PubSub, nn dtypes.NetworkName, h host.Host, chainModule full.ChainModuleAPI, stateModule full.StateModuleAPI) error { topicName := build.IndexerIngestTopic(nn) - v := sub.NewIndexerMessageValidator(h.ID(), &chainModule, &stateModule) + v := sub.NewIndexerMessageValidator(h.ID(), chainModule, stateModule) if err := ps.RegisterTopicValidator(topicName, v.Validate); err != nil { return xerrors.Errorf("failed to register validator for topic %s, err: %w", topicName, err) From 1e37185d741465a2d3bea5f4083cab029ff1136a Mon Sep 17 00:00:00 2001 From: gammazero Date: Thu, 10 Feb 2022 08:44:40 -0800 Subject: [PATCH 73/99] Ignore, not regect, indexer messages from self. --- chain/sub/incoming.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index 4277503fda6..be2c75641ee 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -481,15 +481,15 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg // This chain-node should not be publishing its own messages. These are // relayed from market-nodes. If a node appears to be local, reject it. if pid == v.self { - log.Warnf("refusing to relay indexer message from self") + log.Debug("ignoring indexer message from self") stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) - return pubsub.ValidationReject + return pubsub.ValidationIgnore } originPeer := msg.GetFrom() if originPeer == v.self { - log.Warnf("refusing to relay indexer message originating from self") + log.Debug("ignoring indexer message originating from self") stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) - return pubsub.ValidationReject + return pubsub.ValidationIgnore } idxrMsg := dtsync.Message{} From b72cd90c19125ef6a0a7ced3fcff4a622f6b5b64 Mon Sep 17 00:00:00 2001 From: gammazero Date: Thu, 10 Feb 2022 09:21:21 -0800 Subject: [PATCH 74/99] Add indexer message scoring --- node/modules/lp2p/pubsub.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go index 14f10045085..13d32bbcb70 100644 --- a/node/modules/lp2p/pubsub.go +++ b/node/modules/lp2p/pubsub.go @@ -114,6 +114,22 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) { InvalidMessageDeliveriesDecay: pubsub.ScoreParameterDecay(time.Hour), } + ingestTopicParams := &pubsub.TopicScoreParams{ + // expected ~0.5 confirmed deals / min. sampled + TopicWeight: 1, + + TimeInMeshWeight: 0.00027, // ~1/3600 + TimeInMeshQuantum: time.Second, + TimeInMeshCap: 1, + + FirstMessageDeliveriesWeight: 5, + FirstMessageDeliveriesDecay: pubsub.ScoreParameterDecay(time.Hour), + FirstMessageDeliveriesCap: 100, // allowing for burstiness + + InvalidMessageDeliveriesWeight: -1000, + InvalidMessageDeliveriesDecay: pubsub.ScoreParameterDecay(time.Hour), + } + topicParams := map[string]*pubsub.TopicScoreParams{ build.BlocksTopic(in.Nn): { // expected 10 blocks/min @@ -208,6 +224,9 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) { drandTopics = append(drandTopics, topic) } + // Index ingestion whitelist + topicParams[build.IndexerIngestTopic(in.Nn)] = ingestTopicParams + // IP colocation whitelist var ipcoloWhitelist []*net.IPNet for _, cidr := range in.Cfg.IPColocationWhitelist { From eedcf910eb3aaa0b221c81df79a4f9a2f141c44f Mon Sep 17 00:00:00 2001 From: gammazero Date: Thu, 10 Feb 2022 10:53:07 -0800 Subject: [PATCH 75/99] change scoring based on review --- node/modules/lp2p/pubsub.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/node/modules/lp2p/pubsub.go b/node/modules/lp2p/pubsub.go index 13d32bbcb70..a59ff94dbcb 100644 --- a/node/modules/lp2p/pubsub.go +++ b/node/modules/lp2p/pubsub.go @@ -116,13 +116,13 @@ func GossipSub(in GossipIn) (service *pubsub.PubSub, err error) { ingestTopicParams := &pubsub.TopicScoreParams{ // expected ~0.5 confirmed deals / min. sampled - TopicWeight: 1, + TopicWeight: 0.1, TimeInMeshWeight: 0.00027, // ~1/3600 TimeInMeshQuantum: time.Second, TimeInMeshCap: 1, - FirstMessageDeliveriesWeight: 5, + FirstMessageDeliveriesWeight: 0.5, FirstMessageDeliveriesDecay: pubsub.ScoreParameterDecay(time.Hour), FirstMessageDeliveriesCap: 100, // allowing for burstiness From c1b2080f4e61db91ef4914ce45749fa133fab29f Mon Sep 17 00:00:00 2001 From: gammazero Date: Thu, 10 Feb 2022 11:25:30 -0800 Subject: [PATCH 76/99] spelling in comment --- chain/sub/ratelimit/window.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/chain/sub/ratelimit/window.go b/chain/sub/ratelimit/window.go index f0429d3d383..0756e8998bb 100644 --- a/chain/sub/ratelimit/window.go +++ b/chain/sub/ratelimit/window.go @@ -11,7 +11,7 @@ type Window struct { } // NewWindow creates a new Window that limits the number of events to maximum -// count of events withing a duration of time. The capacity sets the maximum +// count of events within a duration of time. The capacity sets the maximum // number of events, and size sets the span of time over which the events are // counted. func NewWindow(capacity int, size time.Duration) *Window { From 7e7844f169e5924a6c0616a5d1e20ded31a67dee Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Fri, 11 Feb 2022 12:15:21 +0000 Subject: [PATCH 77/99] Fix log message formatting when instantiating index provider --- node/modules/storageminer_idxprov.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index dfbc669d350..b8333441b1e 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -88,7 +88,7 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo // Get the miner ID and set as extra gossip data. // The extra data is required by the lotus-specific index-provider gossip message validators. ma := address.Address(maddr) - log.Info("Using extra gossip data in index provider engine: %s", ma.String()) + log.Infof("Using extra gossip data in index provider engine: %s", ma.String()) e, err := engine.New(cfg.Ingest, pkey, dt, h, ipds, maddrs, engine.WithExtraGossipData(ma.Bytes())) if err != nil { From b47cde70fafc073d595fe490535d44cb05dbe8dd Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Fri, 11 Feb 2022 18:30:29 +0000 Subject: [PATCH 78/99] Decode gossip extra data as []bytes The type of extra data in go-legs gossip is bytes. But when it is parsed as miner ID, it is cast to string then parsed. Instead, it should be decoded from bytes. --- chain/sub/incoming.go | 19 +++++----- chain/sub/incoming_test.go | 71 +++++++++++++++++++++++++++++++++++++- 2 files changed, 80 insertions(+), 10 deletions(-) diff --git a/chain/sub/incoming.go b/chain/sub/incoming.go index be2c75641ee..2a86286348f 100644 --- a/chain/sub/incoming.go +++ b/chain/sub/incoming.go @@ -503,7 +503,14 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg return pubsub.ValidationIgnore } - minerID := string(idxrMsg.ExtraData) + // Get miner info from lotus + minerAddr, err := address.NewFromBytes(idxrMsg.ExtraData) + if err != nil { + log.Warnw("cannot parse extra data as miner address", "err", err, "extraData", idxrMsg.ExtraData) + return pubsub.ValidationReject + } + + minerID := minerAddr.String() msgCid := idxrMsg.Cid var msgInfo *peerMsgInfo @@ -530,7 +537,7 @@ func (v *IndexerMessageValidator) Validate(ctx context.Context, pid peer.ID, msg if !ok || originPeer != msgInfo.peerID { // Check that the miner ID maps to the peer that sent the message. - err = v.authenticateMessage(ctx, minerID, originPeer) + err = v.authenticateMessage(ctx, minerAddr, originPeer) if err != nil { log.Warnw("cannot authenticate messsage", "err", err, "peer", originPeer, "minerID", minerID) stats.Record(ctx, metrics.IndexerMessageValidationFailure.M(1)) @@ -587,13 +594,7 @@ func (v *IndexerMessageValidator) rateLimitPeer(msgInfo *peerMsgInfo, msgCid cid return false } -func (v *IndexerMessageValidator) authenticateMessage(ctx context.Context, minerID string, peerID peer.ID) error { - // Get miner info from lotus - minerAddress, err := address.NewFromString(minerID) - if err != nil { - return xerrors.Errorf("invalid miner id: %w", err) - } - +func (v *IndexerMessageValidator) authenticateMessage(ctx context.Context, minerAddress address.Address, peerID peer.ID) error { ts, err := v.chainApi.ChainHead(ctx) if err != nil { return err diff --git a/chain/sub/incoming_test.go b/chain/sub/incoming_test.go index 1a3ab2785ec..f90dcb373df 100644 --- a/chain/sub/incoming_test.go +++ b/chain/sub/incoming_test.go @@ -2,13 +2,20 @@ package sub import ( + "bytes" "context" "testing" - address "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-address" + "github.com/filecoin-project/go-legs/dtsync" + "github.com/filecoin-project/lotus/api/mocks" "github.com/filecoin-project/lotus/chain/types" + "github.com/golang/mock/gomock" blocks "github.com/ipfs/go-block-format" "github.com/ipfs/go-cid" + "github.com/libp2p/go-libp2p-core/peer" + pubsub "github.com/libp2p/go-libp2p-pubsub" + pb "github.com/libp2p/go-libp2p-pubsub/pb" ) type getter struct { @@ -63,3 +70,65 @@ func TestFetchCidsWithDedup(t *testing.T) { t.Fatalf("there is a nil message: first %p, last %p", res[0], res[len(res)-1]) } } + +func TestIndexerMessageValidator_Validate(t *testing.T) { + validCid, err := cid.Decode("QmbpDgg5kRLDgMxS8vPKNFXEcA6D5MC4CkuUdSWDVtHPGK") + if err != nil { + t.Fatal(err) + } + tests := []struct { + name string + selfPID string + senderPID string + extraData []byte + wantValidation pubsub.ValidationResult + }{ + { + name: "invalid extra data is rejected", + selfPID: "12D3KooWQiCbqEStCkdqUvr69gQsrp9urYJZUCkzsQXia7mbqbFW", + senderPID: "12D3KooWE8yt84RVwW3sFcd6WMjbUdWrZer2YtT4dmtj3dHdahSZ", + extraData: []byte("f0127896"), // note, casting encoded address to byte is invalid. + wantValidation: pubsub.ValidationReject, + }, + { + name: "same sender and receiver is ignored", + selfPID: "12D3KooWQiCbqEStCkdqUvr69gQsrp9urYJZUCkzsQXia7mbqbFW", + senderPID: "12D3KooWQiCbqEStCkdqUvr69gQsrp9urYJZUCkzsQXia7mbqbFW", + wantValidation: pubsub.ValidationIgnore, + }, + } + for _, tc := range tests { + tc := tc + t.Run(tc.name, func(t *testing.T) { + mc := gomock.NewController(t) + node := mocks.NewMockFullNode(mc) + subject := NewIndexerMessageValidator(peer.ID(tc.selfPID), node, node) + message := dtsync.Message{ + Cid: validCid, + Addrs: nil, + ExtraData: tc.extraData, + } + buf := bytes.NewBuffer(nil) + if err := message.MarshalCBOR(buf); err != nil { + t.Fatal(err) + } + + topic := "topic" + pbm := &pb.Message{ + Data: buf.Bytes(), + Topic: &topic, + From: nil, + Seqno: nil, + } + validate := subject.Validate(context.Background(), peer.ID(tc.senderPID), &pubsub.Message{ + Message: pbm, + ReceivedFrom: peer.ID(tc.senderPID), + ValidatorData: nil, + }) + + if validate != tc.wantValidation { + t.Fatalf("expected %v but got %v", tc.wantValidation, validate) + } + }) + } +} From 230b8554f6a319f25c8c9cf6855718c2fae24d13 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Fri, 11 Feb 2022 19:36:36 +0000 Subject: [PATCH 79/99] Override `testnetnet` to `mainnet` in indexer ingest topic Override `testnetnet` to `mainnet` when constructing indexer ingestion topic. --- build/params_shared_funcs.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/build/params_shared_funcs.go b/build/params_shared_funcs.go index f03a35fecb8..7dd2dc8da3d 100644 --- a/build/params_shared_funcs.go +++ b/build/params_shared_funcs.go @@ -14,7 +14,15 @@ import ( func BlocksTopic(netName dtypes.NetworkName) string { return "/fil/blocks/" + string(netName) } func MessagesTopic(netName dtypes.NetworkName) string { return "/fil/msgs/" + string(netName) } func IndexerIngestTopic(netName dtypes.NetworkName) string { - return "/indexer/ingest/" + string(netName) + + nn := string(netName) + // The network name testnetnet is here for historical reasons. + // Going forward we aim to use the name `mainnet` where possible. + if nn == "testnetnet" { + nn = "mainnet" + } + + return "/indexer/ingest/" + nn } func DhtProtocolName(netName dtypes.NetworkName) protocol.ID { return protocol.ID("/fil/kad/" + string(netName)) From 59351c8cb802b8941741bbfbbdd5255a84742220 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Fri, 11 Feb 2022 15:51:49 +0000 Subject: [PATCH 80/99] Add `lotus net` CLI command to add/remove/list protected peers Add CLI commands under `lotus net` to add/ remove/list protected peers. --- cli/net.go | 108 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 108 insertions(+) diff --git a/cli/net.go b/cli/net.go index 524b0d753e5..0ff15e38a22 100644 --- a/cli/net.go +++ b/cli/net.go @@ -38,6 +38,9 @@ var NetCmd = &cli.Command{ NetBlockCmd, NetStatCmd, NetLimitCmd, + NetProtectAdd, + NetProtectRemove, + NetProtectList, }, } @@ -708,3 +711,108 @@ var NetLimitCmd = &cli.Command{ return enc.Encode(result) }, } + +var NetProtectAdd = &cli.Command{ + Name: "protect", + Usage: "Add one or more peer IDs to the list of protected peer connections", + ArgsUsage: " [...]", + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + pids, err := decodePeerIDsFromArgs(cctx) + if err != nil { + return err + } + + err = api.NetProtectAdd(ctx, pids) + if err != nil { + return err + } + + fmt.Println("added to protected peers:") + for _, pid := range pids { + fmt.Printf(" %s\n", pid) + } + return nil + }, +} + +var NetProtectRemove = &cli.Command{ + Name: "unprotect", + Usage: "Remove one or more peer IDs from the list of protected peer connections.", + ArgsUsage: " [...]", + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + + pids, err := decodePeerIDsFromArgs(cctx) + if err != nil { + return err + } + + err = api.NetProtectRemove(ctx, pids) + if err != nil { + return err + } + + fmt.Printf("removed from protected peers:") + for _, pid := range pids { + fmt.Printf(" %s\n", pid) + } + return nil + }, +} + +// decodePeerIDsFromArgs decodes all the arguments present in cli.Context.Args as peer.ID. +// +// This function requires at least one argument to be present, and arguments must not be empty +// string. Otherwise, an error is returned. +func decodePeerIDsFromArgs(cctx *cli.Context) ([]peer.ID, error) { + pidArgs := cctx.Args().Slice() + if len(pidArgs) == 0 { + return nil, xerrors.Errorf("must specify at least one peer ID as an argument") + } + var pids []peer.ID + for _, pidStr := range pidArgs { + if pidStr == "" { + return nil, xerrors.Errorf("peer ID must not be empty") + } + pid, err := peer.Decode(pidStr) + if err != nil { + return nil, err + } + pids = append(pids, pid) + } + return pids, nil +} + +var NetProtectList = &cli.Command{ + Name: "list-protected", + Usage: "List the peer IDs with protected connection.", + Action: func(cctx *cli.Context) error { + api, closer, err := GetAPI(cctx) + if err != nil { + return err + } + defer closer() + ctx := ReqContext(cctx) + pids, err := api.NetProtectList(ctx) + if err != nil { + return err + } + + for _, pid := range pids { + fmt.Printf("%s\n", pid) + } + return nil + }, +} From 1bf7e6a408914ed213f3c8e5d9a68abefa1bc77c Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Fri, 11 Feb 2022 20:02:56 +0000 Subject: [PATCH 81/99] Fix `gen-check` --- documentation/en/cli-lotus-miner.md | 66 +++++++++++++++++++++++------ documentation/en/cli-lotus.md | 66 +++++++++++++++++++++++------ 2 files changed, 108 insertions(+), 24 deletions(-) diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index e73621762e1..81cce261801 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1214,18 +1214,21 @@ USAGE: lotus-miner net command [command options] [arguments...] COMMANDS: - peers Print peers - connect Connect to a peer - listen List listen addresses - id Get node identity - findpeer Find the addresses of a given peerID - scores Print peers' pubsub scores - reachability Print information about reachability from the internet - bandwidth Print bandwidth usage information - block Manage network connection gating rules - stat Report resource usage for a scope - limit Get or set resource limits for a scope - help, h Shows a list of commands or help for one command + peers Print peers + connect Connect to a peer + listen List listen addresses + id Get node identity + findpeer Find the addresses of a given peerID + scores Print peers' pubsub scores + reachability Print information about reachability from the internet + bandwidth Print bandwidth usage information + block Manage network connection gating rules + stat Report resource usage for a scope + limit Get or set resource limits for a scope + protect Add one or more peer IDs to the list of protected peer connections + unprotect Remove one or more peer IDs from the list of protected peer connections. + list-protected List the peer IDs with protected connection. + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -1539,6 +1542,45 @@ OPTIONS: ``` +### lotus-miner net protect +``` +NAME: + lotus-miner net protect - Add one or more peer IDs to the list of protected peer connections + +USAGE: + lotus-miner net protect [command options] [...] + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus-miner net unprotect +``` +NAME: + lotus-miner net unprotect - Remove one or more peer IDs from the list of protected peer connections. + +USAGE: + lotus-miner net unprotect [command options] [...] + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus-miner net list-protected +``` +NAME: + lotus-miner net list-protected - List the peer IDs with protected connection. + +USAGE: + lotus-miner net list-protected [command options] [arguments...] + +OPTIONS: + --help, -h show help (default: false) + +``` + ## lotus-miner pieces ``` NAME: diff --git a/documentation/en/cli-lotus.md b/documentation/en/cli-lotus.md index 3dd7043bddc..315f2f055e6 100644 --- a/documentation/en/cli-lotus.md +++ b/documentation/en/cli-lotus.md @@ -2584,18 +2584,21 @@ USAGE: lotus net command [command options] [arguments...] COMMANDS: - peers Print peers - connect Connect to a peer - listen List listen addresses - id Get node identity - findpeer Find the addresses of a given peerID - scores Print peers' pubsub scores - reachability Print information about reachability from the internet - bandwidth Print bandwidth usage information - block Manage network connection gating rules - stat Report resource usage for a scope - limit Get or set resource limits for a scope - help, h Shows a list of commands or help for one command + peers Print peers + connect Connect to a peer + listen List listen addresses + id Get node identity + findpeer Find the addresses of a given peerID + scores Print peers' pubsub scores + reachability Print information about reachability from the internet + bandwidth Print bandwidth usage information + block Manage network connection gating rules + stat Report resource usage for a scope + limit Get or set resource limits for a scope + protect Add one or more peer IDs to the list of protected peer connections + unprotect Remove one or more peer IDs from the list of protected peer connections. + list-protected List the peer IDs with protected connection. + help, h Shows a list of commands or help for one command OPTIONS: --help, -h show help (default: false) @@ -2909,6 +2912,45 @@ OPTIONS: ``` +### lotus net protect +``` +NAME: + lotus net protect - Add one or more peer IDs to the list of protected peer connections + +USAGE: + lotus net protect [command options] [...] + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus net unprotect +``` +NAME: + lotus net unprotect - Remove one or more peer IDs from the list of protected peer connections. + +USAGE: + lotus net unprotect [command options] [...] + +OPTIONS: + --help, -h show help (default: false) + +``` + +### lotus net list-protected +``` +NAME: + lotus net list-protected - List the peer IDs with protected connection. + +USAGE: + lotus net list-protected [command options] [arguments...] + +OPTIONS: + --help, -h show help (default: false) + +``` + ## lotus sync ``` NAME: From f15a1edbf274fa90986cfffc2305a6e9c6bfb3cc Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Tue, 15 Feb 2022 11:32:02 +0000 Subject: [PATCH 82/99] Protect index provider peer ID before connecting to full node Add the peer ID of index provider host to the list of protected peers before connecting to full node. Otherwise, it is possible for the connection to be reset by full node before we reach the line that adds the ID to list of protected peers via JsonRPC API. Relates to: - https://github.com/filecoin-project/index-provider/issues/177 --- markets/idxprov/mesh.go | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go index 5b580c7fda4..097513d42ec 100644 --- a/markets/idxprov/mesh.go +++ b/markets/idxprov/mesh.go @@ -23,22 +23,28 @@ type Libp2pMeshCreator struct { } func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { + + // Add the index provider's host ID to list of protected peers first, before any attempt to + // connect to full node. + idxProvID := mc.idxProvHost.ID() + if err := mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{idxProvID}); err != nil { + return fmt.Errorf("failed to call NetProtectAdd on the full node, err: %w", err) + } + faddrs, err := mc.fullnodeApi.NetAddrsListen(ctx) if err != nil { return fmt.Errorf("failed to fetch full node listen addrs, err: %w", err) } - // otherwise, connect to the full node, ask it to protect the connection and protect the connection on our end too + // Connect to the full node, ask it to protect the connection and protect the connection on + // markets end too. if err := mc.idxProvHost.Connect(ctx, faddrs); err != nil { return fmt.Errorf("failed to connect index provider host with the full node: %w", err) } mc.idxProvHost.ConnManager().Protect(faddrs.ID, "index-provider-gossipsub") - if err := mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{mc.idxProvHost.ID()}); err != nil { - return fmt.Errorf("failed to call NetProtectAdd on the full node, err: %w", err) - } log.Debugw("successfully connected to full node and asked it protect indexer provider peer conn", "fullNodeInfo", faddrs.String(), - "idxProviderPeerId", mc.idxProvHost.ID()) + "idxProviderPeerId", idxProvID) return nil } From 031bfaf1204e95bf1737ee6b79f561d37c530812 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Tue, 15 Feb 2022 12:09:28 +0000 Subject: [PATCH 83/99] Update to the head of go-fil-markets#673 Update to the head of the PR that introduces indexing integration in `go-fil-markets` so that failure to connect to full node is logged only instead of crashing markets process. Relates to: - https://github.com/filecoin-project/go-fil-markets/pull/673 - https://github.com/filecoin-project/index-provider/issues/177 --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 66ed2a45aa2..0d57b3b50a5 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220210121001-44fb837759c1 + github.com/filecoin-project/go-fil-markets v1.19.1-0.20220215120226-a0db7a73d4fd github.com/filecoin-project/go-indexer-core v0.2.8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-legs v0.3.0 diff --git a/go.sum b/go.sum index e1edde31d99..613d3ab5152 100644 --- a/go.sum +++ b/go.sum @@ -336,8 +336,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220210121001-44fb837759c1 h1:gGfvTCfHDCqEfVhGZSIALKtzF3D4p5Lhm4wH4KGv+60= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220210121001-44fb837759c1/go.mod h1:Q7EWzO9s4sg2KYBUJduTYdtVhVhusDuH2W0keyyub3I= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220215120226-a0db7a73d4fd h1:RO4M6fD9L6+OGqgk6OnMrFJcN5JkcMo3MX40vqxUfmQ= +github.com/filecoin-project/go-fil-markets v1.19.1-0.20220215120226-a0db7a73d4fd/go.mod h1:Q7EWzO9s4sg2KYBUJduTYdtVhVhusDuH2W0keyyub3I= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 2ebc111b708b9a333c51070591c14808b09f550d Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 16 Feb 2022 12:46:03 +0000 Subject: [PATCH 84/99] Use the same host and datatransfer as markets for index provider Remove the bespoke instantiation of libp2p host and datatransfer manager for index provider and reuse the existing instances used by markets. The rationale for reuse is the following: 1. Separation of host introduces a discovery problem, where without gossipsub the index provider endpoint will not be discoverable. Using the same host as markets would mean the chain can be used to discover addresses, putting less empassis on criticality of gossipsub considering its set-up cost and lack of message delivery guarantees. 2. Only a single instance of graphsync/datatransfer can be instantiated per libp2p host; therefore, if the host is shared, so should datatransfer manager. 3. it is not clear if the assumptions under which separation was decided still hold. --- markets/idxprov/host.go | 5 - markets/idxprov/mesh.go | 23 +++-- node/builder_miner.go | 1 - node/modules/storageminer_idxprov.go | 141 +++------------------------ 4 files changed, 28 insertions(+), 142 deletions(-) delete mode 100644 markets/idxprov/host.go diff --git a/markets/idxprov/host.go b/markets/idxprov/host.go deleted file mode 100644 index 5e901a560f4..00000000000 --- a/markets/idxprov/host.go +++ /dev/null @@ -1,5 +0,0 @@ -package idxprov - -import "github.com/libp2p/go-libp2p-core/host" - -type Host host.Host diff --git a/markets/idxprov/mesh.go b/markets/idxprov/mesh.go index 097513d42ec..af0d1118966 100644 --- a/markets/idxprov/mesh.go +++ b/markets/idxprov/mesh.go @@ -4,6 +4,7 @@ import ( "context" "fmt" + "github.com/libp2p/go-libp2p-core/host" "github.com/libp2p/go-libp2p-core/peer" "github.com/filecoin-project/lotus/api/v1api" @@ -13,21 +14,23 @@ import ( var log = logging.Logger("idxprov") +const protectTag = "index-provider-gossipsub" + type MeshCreator interface { Connect(ctx context.Context) error } type Libp2pMeshCreator struct { fullnodeApi v1api.FullNode - idxProvHost Host + marketsHost host.Host } func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { - // Add the index provider's host ID to list of protected peers first, before any attempt to - // connect to full node. - idxProvID := mc.idxProvHost.ID() - if err := mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{idxProvID}); err != nil { + // Add the markets host ID to list of daemon's protected peers first, before any attempt to + // connect to full node over libp2p. + marketsPeerID := mc.marketsHost.ID() + if err := mc.fullnodeApi.NetProtectAdd(ctx, []peer.ID{marketsPeerID}); err != nil { return fmt.Errorf("failed to call NetProtectAdd on the full node, err: %w", err) } @@ -38,17 +41,17 @@ func (mc Libp2pMeshCreator) Connect(ctx context.Context) error { // Connect to the full node, ask it to protect the connection and protect the connection on // markets end too. - if err := mc.idxProvHost.Connect(ctx, faddrs); err != nil { + if err := mc.marketsHost.Connect(ctx, faddrs); err != nil { return fmt.Errorf("failed to connect index provider host with the full node: %w", err) } - mc.idxProvHost.ConnManager().Protect(faddrs.ID, "index-provider-gossipsub") + mc.marketsHost.ConnManager().Protect(faddrs.ID, protectTag) log.Debugw("successfully connected to full node and asked it protect indexer provider peer conn", "fullNodeInfo", faddrs.String(), - "idxProviderPeerId", idxProvID) + "peerId", marketsPeerID) return nil } -func NewMeshCreator(fullnodeApi v1api.FullNode, idxProvHost Host) MeshCreator { - return Libp2pMeshCreator{fullnodeApi, idxProvHost} +func NewMeshCreator(fullnodeApi v1api.FullNode, marketsHost host.Host) MeshCreator { + return Libp2pMeshCreator{fullnodeApi, marketsHost} } diff --git a/node/builder_miner.go b/node/builder_miner.go index 351a65be79e..d24beff80ec 100644 --- a/node/builder_miner.go +++ b/node/builder_miner.go @@ -170,7 +170,6 @@ func ConfigStorageMiner(c interface{}) Option { Override(new(dtypes.ProviderTransport), modules.NewProviderTransport), Override(new(dtypes.ProviderDataTransfer), modules.NewProviderDataTransfer), Override(new(idxprov.MeshCreator), idxprov.NewMeshCreator), - Override(new(idxprov.Host), modules.IndexProviderHost(cfg.IndexProvider)), Override(new(provider.Interface), modules.IndexProvider(cfg.IndexProvider)), Override(new(*storedask.StoredAsk), modules.NewStorageAsk), Override(new(dtypes.StorageDealFilter), modules.BasicDealFilter(cfg.Dealmaking, nil)), diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index b8333441b1e..649c5b09433 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -2,181 +2,70 @@ package modules import ( "context" - "fmt" - "os" - "path/filepath" - - "golang.org/x/xerrors" "github.com/ipfs/go-datastore" - "github.com/ipfs/go-graphsync" - graphsyncimpl "github.com/ipfs/go-graphsync/impl" - gsnet "github.com/ipfs/go-graphsync/network" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" - "github.com/libp2p/go-libp2p" - ci "github.com/libp2p/go-libp2p-core/crypto" "github.com/libp2p/go-libp2p-core/peer" "github.com/libp2p/go-libp2p-core/peerstore" "go.uber.org/fx" "github.com/filecoin-project/go-address" - datatransfer "github.com/filecoin-project/go-data-transfer" - dtimpl "github.com/filecoin-project/go-data-transfer/impl" - dtnet "github.com/filecoin-project/go-data-transfer/network" - dtgstransport "github.com/filecoin-project/go-data-transfer/transport/graphsync" provider "github.com/filecoin-project/index-provider" "github.com/filecoin-project/index-provider/engine" "github.com/ipfs/go-datastore/namespace" "github.com/libp2p/go-libp2p-core/host" + "golang.org/x/xerrors" - "github.com/filecoin-project/lotus/build" - "github.com/filecoin-project/lotus/markets/idxprov" - marketevents "github.com/filecoin-project/lotus/markets/loggers" "github.com/filecoin-project/lotus/node/config" "github.com/filecoin-project/lotus/node/modules/dtypes" - "github.com/filecoin-project/lotus/node/modules/helpers" - "github.com/filecoin-project/lotus/node/modules/lp2p" - "github.com/filecoin-project/lotus/node/repo" ) type IdxProv struct { fx.In - helpers.MetricsCtx fx.Lifecycle - Repo repo.LockedRepo Datastore dtypes.MetadataDS PeerID peer.ID peerstore.Peerstore } -func IndexProviderHost(cfg config.IndexProviderConfig) func(IdxProv) (idxprov.Host, error) { - return func(args IdxProv) (idxprov.Host, error) { - pkey := args.Peerstore.PrivKey(args.PeerID) - if pkey == nil { - return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) - } - - h, err := createIndexProviderHost(args.MetricsCtx, args.Lifecycle, pkey, args.Peerstore, cfg.ListenAddresses, cfg.AnnounceAddresses) - if err != nil { - return nil, xerrors.Errorf("creating indexer provider host: %w", err) - } - - return h, nil - } -} - -func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, h idxprov.Host, maddr dtypes.MinerAddress) (provider.Interface, error) { - return func(args IdxProv, marketHost host.Host, h idxprov.Host, maddr dtypes.MinerAddress) (provider.Interface, error) { +func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress) (provider.Interface, error) { + return func(args IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress) (provider.Interface, error) { ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/index-provider")) pkey := args.Peerstore.PrivKey(args.PeerID) if pkey == nil { - return nil, fmt.Errorf("missing private key for node ID: %s", args.PeerID.Pretty()) - } - - dt, err := newIndexProviderDataTransfer(cfg, args.MetricsCtx, args.Lifecycle, args.Repo, h, ipds) - if err != nil { - return nil, err + return nil, xerrors.Errorf("missing private key for node ID: %s", args.PeerID) } - var maddrs []string + var retAdds []string for _, a := range marketHost.Addrs() { - maddrs = append(maddrs, a.String()) + retAdds = append(retAdds, a.String()) } // Get the miner ID and set as extra gossip data. // The extra data is required by the lotus-specific index-provider gossip message validators. ma := address.Address(maddr) - log.Infof("Using extra gossip data in index provider engine: %s", ma.String()) + log.Infof("Using extra gossip data in index provider engine: %s", ma) - e, err := engine.New(cfg.Ingest, pkey, dt, h, ipds, maddrs, engine.WithExtraGossipData(ma.Bytes())) + e, err := engine.New(cfg.Ingest, pkey, dt, marketHost, ipds, retAdds, engine.WithExtraGossipData(ma.Bytes())) if err != nil { return nil, xerrors.Errorf("creating indexer provider engine: %w", err) } args.Lifecycle.Append(fx.Hook{ OnStart: func(ctx context.Context) error { - // Start the engine - err := e.Start(ctx) - if err != nil { - return xerrors.Errorf("starting indexer provider engine: %s", err) + if err := e.Start(ctx); err != nil { + return xerrors.Errorf("starting indexer provider engine: %w", err) } - return nil }, - OnStop: func(ctx context.Context) error { - return e.Shutdown() + OnStop: func(_ context.Context) error { + if err := e.Shutdown(); err != nil { + return xerrors.Errorf("shutting down indexer provider engine: %w", err) + } + return nil }, }) - return e, nil } } - -func createIndexProviderHost(mctx helpers.MetricsCtx, lc fx.Lifecycle, pkey ci.PrivKey, pstore peerstore.Peerstore, listenAddrs []string, announceAddrs []string) (host.Host, error) { - addrsFactory, err := lp2p.MakeAddrsFactory(announceAddrs, nil) - if err != nil { - return nil, err - } - - opts := []libp2p.Option{ - libp2p.Identity(pkey), - libp2p.Peerstore(pstore), - libp2p.ListenAddrStrings(listenAddrs...), - libp2p.AddrsFactory(addrsFactory), - libp2p.Ping(true), - libp2p.UserAgent("lotus-indexer-provider-" + build.UserVersion()), - } - - h, err := libp2p.New(opts...) - if err != nil { - return nil, err - } - - lc.Append(fx.Hook{ - OnStop: func(ctx context.Context) error { - return h.Close() - }, - }) - - return h, nil -} - -func newIndexProviderDataTransfer(cfg config.IndexProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, r repo.LockedRepo, h host.Host, ds datastore.Batching) (datatransfer.Manager, error) { - net := dtnet.NewFromLibp2pHost(h) - - // Set up graphsync - gs := newIndexProviderGraphsync(cfg, mctx, lc, h) - - // Set up data transfer - dtDs := namespace.Wrap(ds, datastore.NewKey("/datatransfer/transfers")) - transport := dtgstransport.NewTransport(h.ID(), gs) - dtPath := filepath.Join(r.Path(), "indexer-provider", "data-transfer") - err := os.MkdirAll(dtPath, 0755) //nolint: gosec - if err != nil && !os.IsExist(err) { - return nil, xerrors.Errorf("creating indexer provider data transfer dir %s: %w", dtPath, err) - } - - dt, err := dtimpl.NewDataTransfer(dtDs, net, transport) - if err != nil { - return nil, xerrors.Errorf("creating indexer provider data transfer module: %w", err) - } - - dt.OnReady(marketevents.ReadyLogger("indexer-provider data transfer")) - lc.Append(fx.Hook{ - OnStart: dt.Start, - OnStop: dt.Stop, - }) - return dt, nil -} - -func newIndexProviderGraphsync(cfg config.IndexProviderConfig, mctx helpers.MetricsCtx, lc fx.Lifecycle, h host.Host) graphsync.GraphExchange { - graphsyncNetwork := gsnet.NewFromLibp2pHost(h) - return graphsyncimpl.New(helpers.LifecycleCtx(mctx, lc), - graphsyncNetwork, - cidlink.DefaultLinkSystem(), - graphsyncimpl.MaxInProgressIncomingRequests(cfg.MaxSimultaneousTransfers), - graphsyncimpl.MaxLinksPerIncomingRequests(config.MaxTraversalLinks), - graphsyncimpl.MaxLinksPerOutgoingRequests(config.MaxTraversalLinks)) -} From a09f386537e14f563eb1fa87f8b1fe917a930111 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 16 Feb 2022 13:07:09 +0000 Subject: [PATCH 85/99] Remove redundant `IndexProvider` config now that host is shared Now that host is shared having separate config for listen and announce addresses along with graphsync limit makes no sense since all of that is shared with the markets host and datatransfer manager. --- .../en/default-lotus-miner-config.toml | 24 ----------------- node/config/def.go | 13 ++-------- node/config/doc_gen.go | 26 ------------------- node/config/types.go | 15 ----------- 4 files changed, 2 insertions(+), 76 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index c0392cc4a7c..da9d4315eef 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -273,30 +273,6 @@ # env var: LOTUS_INDEXPROVIDER_PUBLISHERKIND #PublisherKind = "dtsync" - # Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised - # multihashes. Note that when port is set to 0 a random port is generated at runtime and may be - # different on every restart. The format of the strings specified must conform to multiaddress; - # see https://multiformats.io/multiaddr/ - # - # type: []string - # env var: LOTUS_INDEXPROVIDER_LISTENADDRESSES - #ListenAddresses = ["/ip4/0.0.0.0/tcp/0", "/ip6/::/tcp/0"] - - # The address the endpoints at which the data associated to the advertised - # multihashes can be retrieved. If not specified, the ListenAddresses are used instead. The format - # of the strings specified must conform to multiaddress; see https://multiformats.io/multiaddr/ - # - # type: []string - # env var: LOTUS_INDEXPROVIDER_ANNOUNCEADDRESSES - #AnnounceAddresses = [] - - # The maximum number of simultaneous requests syncing the list of advertised multihashes between - # the indexers and the index provider. - # - # type: uint64 - # env var: LOTUS_INDEXPROVIDER_MAXSIMULTANEOUSTRANSFERS - #MaxSimultaneousTransfers = 20 - [IndexProvider.HttpPublisher] # env var: LOTUS_INDEXPROVIDER_HTTPPUBLISHER_LISTENMULTIADDR #ListenMultiaddr = "/ip4/0.0.0.0/tcp/3104/http" diff --git a/node/config/def.go b/node/config/def.go index 75e2a08a3d2..4db43753ecd 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -2,6 +2,7 @@ package config import ( "encoding" + "os" "strconv" "time" @@ -182,13 +183,7 @@ func DefaultStorageMiner() *StorageMiner { }, IndexProvider: IndexProviderConfig{ - ListenAddresses: []string{ - "/ip4/0.0.0.0/tcp/0", - "/ip6/::/tcp/0", - }, - AnnounceAddresses: []string{}, - - MaxSimultaneousTransfers: DefaultSimultaneousTransfers, + Ingest: ipconfig.NewIngest(), }, Subsystems: MinerSubsystemConfig{ @@ -232,10 +227,6 @@ func DefaultStorageMiner() *StorageMiner { }, } - // TODO: Remove hardcoded defaults once provider library exposes them. - // See: https://github.com/filecoin-project/index-provider/issues/108 - cfg.IndexProvider.Ingest = ipconfig.NewIngest() - cfg.Common.API.ListenAddress = "/ip4/127.0.0.1/tcp/2345/http" cfg.Common.API.RemoteListenAddress = "127.0.0.1:2345" return cfg diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index d7c500e6716..9d4f6088214 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -358,32 +358,6 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f Comment: ``, }, }, - "IndexProviderConfig": []DocField{ - { - Name: "ListenAddresses", - Type: "[]string", - - Comment: `Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised -multihashes. Note that when port is set to 0 a random port is generated at runtime and may be -different on every restart. The format of the strings specified must conform to multiaddress; -see https://multiformats.io/multiaddr/`, - }, - { - Name: "AnnounceAddresses", - Type: "[]string", - - Comment: `The address the endpoints at which the data associated to the advertised -multihashes can be retrieved. If not specified, the ListenAddresses are used instead. The format -of the strings specified must conform to multiaddress; see https://multiformats.io/multiaddr/`, - }, - { - Name: "MaxSimultaneousTransfers", - Type: "uint64", - - Comment: `The maximum number of simultaneous requests syncing the list of advertised multihashes between -the indexers and the index provider.`, - }, - }, "Libp2p": []DocField{ { Name: "ListenAddresses", diff --git a/node/config/types.go b/node/config/types.go index b73e957f600..a06ec886c34 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -163,21 +163,6 @@ type DealmakingConfig struct { type IndexProviderConfig struct { config.Ingest - - // Binding address for the libp2p host contacted by indexer nodes to sync the list of advertised - // multihashes. Note that when port is set to 0 a random port is generated at runtime and may be - // different on every restart. The format of the strings specified must conform to multiaddress; - // see https://multiformats.io/multiaddr/ - ListenAddresses []string - - // The address the endpoints at which the data associated to the advertised - // multihashes can be retrieved. If not specified, the ListenAddresses are used instead. The format - // of the strings specified must conform to multiaddress; see https://multiformats.io/multiaddr/ - AnnounceAddresses []string - - // The maximum number of simultaneous requests syncing the list of advertised multihashes between - // the indexers and the index provider. - MaxSimultaneousTransfers uint64 } type RetrievalPricing struct { From e3f5b7c59f36875123b4ac6bcd57e4975d1a5580 Mon Sep 17 00:00:00 2001 From: Aarsh Shah Date: Fri, 18 Feb 2022 14:00:01 +0400 Subject: [PATCH 86/99] update dagstore top level index db --- api/api_storage.go | 3 -- api/proxy_gen.go | 13 -------- build/openrpc/full.json.gz | Bin 26585 -> 26588 bytes build/openrpc/miner.json.gz | Bin 13088 -> 13010 bytes build/openrpc/worker.json.gz | Bin 3917 -> 3917 bytes cmd/lotus-miner/dagstore.go | 36 ----------------------- documentation/en/api-v0-methods-miner.md | 11 ------- documentation/en/cli-lotus-miner.md | 15 ---------- go.mod | 3 +- go.sum | 8 ++--- markets/dagstore/wrapper.go | 10 ++----- markets/dagstore/wrapper_test.go | 2 +- node/impl/storminer.go | 15 +--------- 13 files changed, 7 insertions(+), 109 deletions(-) diff --git a/api/api_storage.go b/api/api_storage.go index decd534d683..bccb7baf9c1 100644 --- a/api/api_storage.go +++ b/api/api_storage.go @@ -226,9 +226,6 @@ type StorageMiner interface { // IndexerAnnounceAllDeals informs the indexer nodes aboutall active deals. IndexerAnnounceAllDeals(ctx context.Context) error //perm:admin - // DagstorePieceIndexSize returns the size of the piece index. - DagstorePieceIndexSize(ctx context.Context) (int64, error) //perm:admin - // DagstoreLookupPieces returns information about shards that contain the given CID. DagstoreLookupPieces(ctx context.Context, cid cid.Cid) ([]DagstoreShardInfo, error) //perm:admin diff --git a/api/proxy_gen.go b/api/proxy_gen.go index a4024ab729a..d0d4757099f 100644 --- a/api/proxy_gen.go +++ b/api/proxy_gen.go @@ -647,8 +647,6 @@ type StorageMinerStruct struct { DagstoreLookupPieces func(p0 context.Context, p1 cid.Cid) ([]DagstoreShardInfo, error) `perm:"admin"` - DagstorePieceIndexSize func(p0 context.Context) (int64, error) `perm:"admin"` - DagstoreRecoverShard func(p0 context.Context, p1 string) error `perm:"write"` DealsConsiderOfflineRetrievalDeals func(p0 context.Context) (bool, error) `perm:"admin"` @@ -3876,17 +3874,6 @@ func (s *StorageMinerStub) DagstoreLookupPieces(p0 context.Context, p1 cid.Cid) return *new([]DagstoreShardInfo), ErrNotSupported } -func (s *StorageMinerStruct) DagstorePieceIndexSize(p0 context.Context) (int64, error) { - if s.Internal.DagstorePieceIndexSize == nil { - return 0, ErrNotSupported - } - return s.Internal.DagstorePieceIndexSize(p0) -} - -func (s *StorageMinerStub) DagstorePieceIndexSize(p0 context.Context) (int64, error) { - return 0, ErrNotSupported -} - func (s *StorageMinerStruct) DagstoreRecoverShard(p0 context.Context, p1 string) error { if s.Internal.DagstoreRecoverShard == nil { return ErrNotSupported diff --git a/build/openrpc/full.json.gz b/build/openrpc/full.json.gz index 7ca70d7d9a7bfd719c101badd45b7df84a32d2f5..7ea7df180ebeb98e5d18a7e2193808213a17cda1 100644 GIT binary patch delta 24118 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 delta 24057 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 P00960JXiX4)_Vc~Wqsl( delta 11212 zcmV;-D>Ky6WuRuT76JiSlNSQ2f12c==QZO0#{Z!D&>7K?;HC~%J&?B4;1!(W!|1(2 zFpVC~^9K?%t3zp`AB^wDSQ-xcs<;2vU+TgnhBVuU^le2K0#}u+ms8|s$o$4H1MC3^ z!bf7=9t;OZljFg7FdE-Qo%5gkzLj%q$d&VSfz10$*Lh$_TT3+)6qJfNf5nGaXpR|w z$hvf{>80y9Gaan@;LDvS$oil73bE@0z~KEgc(sJ9FVXiGpYYD3E+)CYQG%@;WzHdA zNwd?#z`D)4$GWmz{gw~y)|8~aYDB&0XIhmAK`EsA@=ZHGW7oJ$Y9~FzFm%5U+R22w z297hk;S7(T?(X!!cz-Fdf8I$~OEgm91)m?uaQj|>|NAN8w)oj6iBl2lUj+g&%#M9e z;h9waoP*5gWV&1G`!VV<1_GC^z9q@g=M0zm&z6~9^!fwsL^C1zFAAW^`2{Y57O)-j zUSkZdAY}+~nGlY{pJHyT-{6b$2PZv+$#IseHAMkR)v!1*0xE;^f8}nv#x}*|@cmbc zh=nZikWKYbUN_v(Q@^F&ey+J>y5Kq{oiys zLz~%PIKzYWX0%?TVgF&MJ=Hf5G1kjqeuDGhaW24wf^!QIif1_fYJd`nQKvs#2{A+>!`{$pv`tTBKr3}2p+4!a{ zk%c+uQ%s<{c~4BoVu---(nF(REH;(rjMP<&{q#@9MqlBdxCm184x0DtRXzVCMnL7C z_%lr5GDtm!e;5(D$56p7NHU}jIVBo3`40~e$3kE#t~ta)E}#npycIH;ov{ELe!vFt z5Zo-#EfMQ~z!wY;&;_LY75-TcmTah)?z?M3Fqwl#Oc(6_ExGvp=JWM`-n~8j_4DO_ z-o3qk|DVgZH@^Tx9C9`i2(8YX4?;#4P13YJmf4~aTg$^LGcw4uGHO8*Rn0#Cy z0!(Pzti?n(vBx>Ug!9N0g1>u9TJno3%qRS3!2`6{NQ@#zhrc}l30RZpf(1PG$l)!yCE;t3!-MG% z4|~)D&J4^DH5bg5abJPG@n0UWAcf$Sg`f>qaAP~rdJSf-vlJHF4*&yiJ@qyoMN1vb ze-S}0q>K(E022#+6?T5bW*{C78sK+s33b2>n%Kq^GLeH6xxhu##pnUr9)I(V<1)8l zC04iDpMewu&sn=B@_5f~7T5z!F-6a?2QU#q4fcxZFnr-2TYsSfM=n;7AkHcGXPQlc6%zF>43B`7LfM%FrZ^31+^E$s{b2J>~ zo1+WtQ7$0$k{`2VN_n9o=3VTAe@0}>`=X3?El)JjhkWZ4<4e$EXgqV=rBEI?b=DL> z+YWH?o;Z($DLcoA$Xf-!6MF;T1H?9;LOO)cZKIhe)8{30?-BJPE7ZD^>j%VhUEC@` z^Y$EE23FdM7D3qCV63#gad!oer54X#n6GJesJnD6C`s!STfk*f z?jb_CSBmV}fp})hpwRSb_}OF3vka*nf^*6|9yS(;xpV*me@Q?G5S%&|GQq3I1vVGV z#lj{JBSNrT+Z3DZ?!gM0fA`1=TVZPYn!9Kad}2>6ptm?oE()}>z}KdG)8TrD>n-5= zNU`f65FCy{=WMD{JAGD8O71*jLPx_g2%aP+$8e(#R%f`(N9q(G0ao+L8N1+!iJF*T z^C@3*myQoo=2HY$x3elbd0{!J<6}j_c<^Dbkm)=iw|V3)PN;F%e=bg}t(aYk!D8BERNr-r_P0BK4T|#e65UyAj%+B4;W2iO5y} zS3sA+^adk0wb6gkOd=3;E zsj@AYdR|~Jo26bFf7siq#H~*}{fIqQXcifn+{}rHR<)Fg7>`@Ad2!Ap3+9QN<+k9t z&dTv1FU`bPe*;_G5v&V}eChS1XAJtf7WfC8MPIN_ZHx%jPJ+rgd<)(K^CsfgF5nc| zp-TH|$``*~D)xn*@C}^0_MTYD3%)d6y4XaQ$n|e(My#b%$L2ZDj4OUaFqOI-Uu^el z>SUY0fFAw4vY1k)*s!6uh+k^3Wjg-Zs#HDmhq`L@f356jRHYDolrnoT{f{k4c8JSp zwGG@cSuD8?)R)1kU6sjHRT^=*DzztGD&kdJO=@S(u9zgJLLn-MVOB-T?fXw_T&cHW zT34q^%*)TBnH;OKXqYt<3Wu$CwqxGgjf{7Ol**EabBF>no*|fP(}TRr$_8D=_m-@C zG?hr3fA+#jM$)dg;*v|tL%g6#Ovc53VTwIgWeG8wJtwcP(-_x z5JHI#Y`ym6^OXVn!RD(&!^q3U$;v`I0pEPO?W#y|)VHyMq?qs2GfP&CjGIs2W8yc`wj=j9e}6;>S`e4cI&d=1*Z2oFx_Fs#n2cjlH&NjXXL&m#90#) zf4#LEge(-aqzhb1gisJ^iVteuaikmD)mLA$v-uul+h_HQd3r18L^fn)#p!b!(=Q3Qks-dUStLWf*!eWf=B297nuk@ zAWOd`9xr&c0VX8Cavq88Knq~%1=SI|e?-ymKT)(pn2Vt?R-}4}#KBWYOk|%y3U6FU zyqQGo%D{|@mxb{`a70%BgC$DJtc3r}(5YB~vE9#FUDc zb`AO;mUQ>aV1?Ju&$xCubb(wxDy^ZCV)(arRNz)lLGuNrT&{Poe>V8lasK@Hf6v!{ ze*O3VKA>Ozhps-3-g@rmf4wvR{QAqg57+%)y!Xz>o3HMti-%wTht6u}gzxETUq2l7 zO%&NMe$sSIInOYh6UU?2tT!9TrKmzdUw~hOS3gPK%FBhzZBCAU1lv{8;EFn=cG2>A z3rY%mz(UjYe9mhZX9@+HYu9Bye?|f*J;00g%w4!zcpGB228a6#Br+|Q$x5b6iigUa z(s#w3WK8A(iQw|zYvj@MGwo!k2fu=1d8rirbMI7qz|#dJ1lj)6Vfw$gDpI;dS#-*) z>eU)s#*DY(XRXvH!FU-wg{*}s&N1V7G7zcHYfn4r>DoK!wYziT+=~r`e;BB9?;44I ziQj)XYjeT7nHum<$n)S_@+E#}&ch{YGBm*ua6ujR`5?^wW8D0|zI@Yu6T+El{!Fqr zE4(QVma%Ryf739G-U0vT#xPF!KmXQr%}*N7f9S%Q3ob64dA6MrB%bb`?wXEi& zHi$88WZ$DxjZQT>)kvwve^b%v=gIvbG9&XXi11h2;1t)G%4ZZ8?!o@8@UOuy9C zSmWEOQc6^T;h0uc+Xj`;p6nK%xGu@=h6*IDT->x&e|etcaG4iEYf(yR z6VMm?{Fy;bkG|5_%k(VfMU?46(#;GICQY^U*e9B=LQ z6x*sqNbn<~Z@v2l;Z;FEzJ>TF|3Ex(BGKVBo|7;w@U3@W9849&Ta2BC+-_y#a6x~w z0l~uO%ftrRle`uMe>Ra{HX}&Ej9>eNNv00SC-^mcjeX;I$q$Bw9)-(QRNCX~3NxmH ziW=ze-yAmAW^jh*1d5USrrmHo>gyV>b|pJayy6Vi?`oBEJbYHmKu2;kO1+U7(~@u0 zD`vqzWaau5;>(n>7138NWhs&p*4$Di1gF9W7NS+_gm~Q-f6%t-QGCx=q2V z1%qzEU}p;kFSTIjuy?H3(HJwVwRbY6Xf!Lfog%i4f0El-e!IfkUE%Gn@OD>tyDPli z72e)&J3dzI_l|7ZIWZk(G-!h=KT2vU+n!t;=CsNi`cxaaCSTD|P5Yni-IhE71=|w0 zK>cLrBW%G(5Z5ba0_fo|pJJ=M(S2)KAJ)Y3I8m~;ZC$%uPi^ciVpoEchng{$@Z;2c z-!~zAf1!;D!zH9_><>A5Eg5fbW*%Lxdi?>99#LpP3iF@JI9s~*0eaCgW*}I~SQH<% zE94>ffuS}3;8$p-#WtDT#9fT=#Vg05Eo(>otQj!K^mj|~fuv<3;n$=oWO_Uf1J#m?F4lM4zTG}a=t0d4f{ROwclqm578j( zbAia5F2t{=yVydnq5C`Y8|8&K6x!F^*=1kGp8|-=i@^pFRVcvUtd*3D3p9u3=F)Yj zV>Cli!zxpbw7c8^3)_(KSD`a4pq!bR;h`?3~H@_QPbR=(2|y# zIYjVY=JA$yHM}f;zi;GLD7+K}8k&0gaWZlrKlTK}sbYUVPBO=nPtmR6wWoOBioc%X zGBeWI`(?I3MSfYgsJDYfJ%$W^e@yEVx!AEd*Xo6q#IxGT$O!*eahq8qEB&3WF?2ET zE(X32G4N7OV^Yye4ZZ|NzGkkws4vUe$LLO7XmX0ZqP}|8l1(J5#5lnf9%AQmpe`5<$ik2(t z0qOu(-0zMp=#DMujxE>;7!Gp_q+B8DZhTu*`&=kFsrpAl$?3HPZy7GPe#l{0_Mkhr z>3KomNO6j`(247&we+r4we+~cvvKqe-{JW=q1@R?T^Im3#fPU0hzXzT>0mYFmoA}Y zAuF8g>R@#wyIzPS*E!Yrf2!g~*wwg4#5iW$Z52i0qgKw|8(LBDsowN5&mq}IF0=ke zQsB1c^YL(I3x3~F+JTfBY_S)EehZyA`ffYXnUITNf0SEA>$?gSFuQO}zWXsaf0@q?@)emsl-Rwix1Nhr`4qJJi3I7s*2_MrxKpZr@rV-ouSKJ4{6E zwhO%2B(8y>*iSb?b$*4AxhL!Y-%t)MAf9^)nz+hE3DJg!pv=KBi zB%vcs>q zbiK7iGD0oINs>^-Mc9-Q&!CA8PoZu53E(^zA_|SH2H>aUbMJ+cDOb3YZ8u%o&h(@> z0X$;&PshDSt{~A`zIJ-lO6t{hxOrNkVWL8TW*m$Ee;-Kx75rbTsE%T?7*3!|B&-zc z?Gk=H7X*7FU0Y%j`<0%uUf0<;zFiDye#l&2@>xQO$_hwqvupb?{Azg-wL{`%!|pAN zdN!F(22^F&Z5#{nLNSUOE>)L6IJr{C*(xiEbQv2BZ0nI?vw^S$9}wlqmURs)f4`Dd ztz|=be>3eE(17EeoUYhe$j(9*S;!8nJFNDxdZgGB;v*L((8m8X2_wh|?Et+K?X?8s z={|IL-r;$N=N+E!6P_O{HfRV4`-li~A@w2bSG4)yI?LK8o)^&EKFTYbZU^x5de&io zhy5M)ci6vA*gsb6lo4q5$$3CNiZ?*}7?thgZF{V-b`U+ueTU&4hIbg=Vfa2__(ZXD zOyJk0>pY+(+uhdsb}EhK7@{8ajVy@p_7_aRRol5Nw=U z9MY&{-KLIX*SBL~o9$Syco#aG)!D4Qv01yRN!{6!&X$z1C4I&2%m74f1U)1Q)1mB! z!YUReL23IdJE;cSGAij_bSpfaS=kG-(qVds={}|p6&rQ~42#W`8zFj(PV*?(?`zs* z?hvEY7St!Z*Uf(+IPIl$BrhXIrIrP2n1T^&zHQ^xrCfBzYcGF|SC?hc*{v6Cw~lk`7F_d_ znov8FuZU1h>xJ5yf<>g-Gh~V0b+)XtWqWALP&XIrY}(7WY2)154GFMrIvtA$)v{>< zi%zlCV4qi#jV&0oZgSQcw7oQFk@l37lD60G*w{bgT43FUz-|?=v)lV{D0s$|&Oc#&>=puj!oZ75)OaNVA z4`AX^NKACt_+XY)mopzNd%sL=1#vdJCfw)XFNS}aQC+Q1(7i|0OIKZZ&gj#gYFtlI z8NeUgw^PT>o=#sz+2RDs`bs%2QJh>;Zz#pu)(@TSoS@DL>MXp#o4#USwy%@d<^ow~ z7|xquPDn(BJ5$H8UxQbe0Rq#@Z%=tfK25ciH>_e^6p2;|x;B*D&~Peq=S7Ij_Mh(TX^0I$uXK+~m08ajKR4 zaCxVTmp9&87T`yi1L^=sfU`mbc%0ZFIG=w3;`qNj@QCRGAmXg&3*fDwiMW%_UeIp| z!gPULW_Hn|{|0!(whg8Tm@Z;6r~}6pe!K~7+rMi&<~?9D0~;(I7u}MeH4~E9yVX4Y zJj9TGa0+Q~Lf%#TFCKi%yQuJeE`=BGv1 zF5nc|={S$BT~p}N_bbQbhwS%^p02$oR`P-mW0x*A(Is;Io0<`8>C~}pNRi99;x`0S zsmo7d%&vWN%U4qh+keuvUlCeG%O`(aAga0LRSxq{f7L2+F#k&wyp-~bWrJ0fLNsP& zy6DS7CI+WBIKD3?s%2P+M6_yGWg=IVMqKL3a4XkRW}g{2zbp;Nzns zMfm|gDS>Cse6ZJEy(1bkR8&X)^NFK~O!0@`L253pP;SgSLp;aPR<}^Y?N0VbHB(MA zhnGuaVMvj^0Ujcj$4|Cr_rX#u;s}>J@QC4j?xH!97k);$c=Yg=T=`*i=0E{Fi(ZBv z`7g>y)5h^~^>AgxAotM{QS^U6-MRbRALu>qL4SbQMpk&|o7U?Ov=hyQtc%d(+6G(% zEx=|Jd?C!62Tr9}xXY}-B|`93U|*1v821d9D@d87TqfQ>{3&mBE{6BK3zbj#jaqLv zN}7y>%5d+6tw4+vySL-2e2Iu9R(hI&p-)Ezhiuj=9zQ=T3xPh#To8YZ)2$7B5%0y& z7cdp9{Xt-3j{;`~R{k9y0t3{e4wxbiVt_9LB0$hr8i8Q|cP&6%d@v-imbzUE$`tD( zwV`Lb3kfe*m5&wMSjG4Ji0J#TD`ZlJ-OxT;yU>@Ix=O8}C|7Tam*_Bfq*%KZv~%=4 z(LfC~SNA4Q;Z=Oj5fy)H{>Z-z7=PTSfkEhyI(+G%u~H{`p81~XyW5EYj*ReswL^h> zs#asgF1t_w_=iU}Y!bIYW~kqrX~dbBqOel*zUdtRY`rSs5aE-MI>ox>LTzJgpkE^f$LUh;ITQJ4S6-wY*! zpflH5hKZ=)oC3>1+}cy*E-`_W2YDQFU@jmgI(S@Qa{)|9Zpjn@%OSpRA=-X_@;y*X|}17sJtiFgJJmy7hGw z1x1y{CquSH>aHN(j{d7TF9HM=Ti%w|P4d+8y9w%c+IcY?jdF9huG?9Txz1mXsi%hp z>oGNyFV15Ljf)uY_F?&@)5({jlgGJ9L_8-r+AUsNCu3w<^M>O@TT;s;n}uo_XCT-Q z1Z^8xz#*ZFiV1kXT+t1Ga9r>w#Pp17A>U@`-4f~m>f-qvx#3%-m52z-T7v5I;^d!>&hP z>+EfEOW>M1OGq)(<4ri}#WXS5?UeJ!QqDYWQT;zGk0yw0`LvNV-`AcMh=>|aX2XZ~0YX-roV<8i~62Ui2ENpVHgkZV0 zDK^>NgB3LIkrlQb!c_M)557V0i9NM|-r_KcC~VMUpyIDOeb;(^Y?E0eCVy15d$}1< z-UasR7V8S%FIM6pRk28sIk}SB>-*}}H8|i|uC|;5XxnU}IuAoiUaLy>o7|U`K2k#2 zf((tWa$SKg^mDVWxLll*YaXCzsuKYn)tvLoT^LHCsEM`&4edm0V!cvNRJjJlf6-_ zz6hbZW6}z3WL=?I3EgHSb97oxw~k)>yl*A1SI%W-q?M1AsX;Lr8-@|9Msa?|z0P<= zisAU^cx32WP)>;de&Rx&vkyE>9o%Xui?X$O%GQ^WZC5W&Tl}7Ndw-al%H%QQux_N? zflS-hY}DKZtaaa7e$du$#QZ zKE$60&llAHVsX(*+&CwgVrXC5$l}ejYrhl5bVMJz_9ht0YIVHg+?H`^d|auzyTeDI zI zWe_y!#Z}fl;Y5AYc-{s3V~PoMH}8q*@I`Fq)O%<&j5Qs-9Xf~Q0y&}2wuQKl@9|a< z^70by`_VhvC!0hYsl+0z z`W968rD@G^?p`CW>8Z9^GI>X}MW<%-RWJYi7EzlbIPBxyhN5#~p|AWn7uCrxLqE_C z?JGzuXMahM=jmW|1cH3T!mMqt#nW-6qYyvTg>lT-+xjVSi4iWTV8ZuM9udcVnH#PX z<64Kn?M+%&a*7mmYKyhwi%y17Nd6X&xfvRRaT_PyWY3lPE)VP(DpsK4uu@8kMCf^c z5-*}I9(5_(Ev9UD`#>&+$K%|+lHTW))ohEFPk*7(5_=+luF&*z`fXYLfZ49tWwF(( znxPjZ=yeKPUtuSzU6n!w-&)p%W5Vp1lv3Fw4Ym8vK3bk?Ch0U*&J0^SIHlPY84@ML zIw8QniLVx zi3OZ9G4J%!N657-P#pC^b~orzmFE1lh=0sVdTcDqOwh&msnT#1=YEzMc|vDP3hXId zK@-yr&y{=o0I?0HjPr@EeYj5kzCs>y9~dtaKA8N!pFMt|suV?pOJ&xCOqO{%!FQP# zcwfpq7>z(F`SHp<*`21}zgP2JDDlYS)fTVmtU(oL%P};O?DuPkNj@Y7Rv^Ad!f0lOdOM9 zur=lf!@<$ycrYG}##@P!W<|H;e8I0h)#g+|Cf2g@;q{!k@6?;CyCJ=E?6&6Ey{yfL z(^j!LtWoz>=O(Heh8zEO6~vO7U)XW%_h)r|0g$#qsOAa_Wm zW!Nr()?w3aL3O+@JDv1&7~Ns?PBFRz$cy24s4A@?;NSx$R&#)is1)Z2_?PQLW@0lT0ZcTZIlD10XB?Tr`Bx4qYI3BR5Tf=9Zx#3cHWMvZ9P z_Qt`9?TPR|*mDif4_B&eJW}mw%<%{+U?zLNFo5KvXXSNs_E-UIHh*6*_j|B|%+37? z7pbtlV4b#0x$9PD_cP^gPr-Mr+88SaynZG0=>5DJus-12g)_V}WZETgx1c0?4)Hnw zoLd{cm1?k3Ruv^-RnL}zxl#zH3`+3|vZ<)eNq;LfV|V86y=>oVqS~Y83wG1}E~?Eg z83h;ETSl|h+g>E9?UQgUB!9xxU}EI&{9?1|hFWmn&Js-hC2Ph*ON-ThcXqZ+-L0AY zAZsSyPdBo<#h_FSpI5fSDCI!idI*&6{=#r0k7S*HPmd|TH}I!9XDiO3@82kjcopw z&e~AT-Y*kNPwXKrG3jHE<;?k#+sJE7_I$p7_y~G>Z*RBr_a#B-3z@7B@{>v}GXW}- zel0+M94WSL2x0h_Gp(1w8NIGvE?cj$b@=&nxV9@WHheSBm59g}teq9KQE7IS=+o8~ z(h4}1uB#QlQ^q?%v#~Xq!2ZE#JUTiU_QsQg@oWYUCNnfMW@BT75Q^1~F3JZr3_r(3 zJ02P1-V_=Kqu$gy7#_i+gQ;nZ58%u=n)S?o{s6D1Ri&es(St=5N}}ahH&ZwFN0Upm>Q4 qWGCMUC8=>}*-M*Uv&b&>0~I))XirafPyasv0RR8Dm=;0LegXhKQw8|| diff --git a/build/openrpc/worker.json.gz b/build/openrpc/worker.json.gz index 97250a33588a13a8b77fb10f5d6d27feb9f798a6..137ab7e5791107dc6bcf074716703814e7a65a87 100644 GIT binary patch delta 2868 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 Date: Mon, 21 Feb 2022 13:57:29 +0400 Subject: [PATCH 87/99] dagstore size bloating fix --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 4d25bb40ed9..50608e5d268 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.5.2-0.20220218091406-7e3dada33cf4 + github.com/filecoin-project/dagstore v0.5.2-0.20220221082516-6beb25bc4425 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 diff --git a/go.sum b/go.sum index 08f2c4b3980..b2d87d3c2c6 100644 --- a/go.sum +++ b/go.sum @@ -299,8 +299,8 @@ github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGE github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= github.com/filecoin-project/dagstore v0.5.1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= -github.com/filecoin-project/dagstore v0.5.2-0.20220218091406-7e3dada33cf4 h1:zyE+eiIhkkTSi5zL5bDeHTfumikCER8uxKjyQJeEHV4= -github.com/filecoin-project/dagstore v0.5.2-0.20220218091406-7e3dada33cf4/go.mod h1:cVH6pCuJaOZzn2sCWQ2BtqnivvG/69acZJ0UA3mGagg= +github.com/filecoin-project/dagstore v0.5.2-0.20220221082516-6beb25bc4425 h1:OQxAqlQVzH9/WUAMue7LWQorL1KXgiEbJTuKRxPuxlo= +github.com/filecoin-project/dagstore v0.5.2-0.20220221082516-6beb25bc4425/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= From c3b406c5c23c7f6576d439c48ea259bc390353b0 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 23 Feb 2022 14:10:38 +0000 Subject: [PATCH 88/99] Update indexing and markets dependencies Update indexing dependencies to latest along with go-fil-markets dependency, to the head of: - https://github.com/filecoin-project/go-fil-markets/pull/673 --- go.mod | 8 ++++---- go.sum | 23 ++++++++++------------- 2 files changed, 14 insertions(+), 17 deletions(-) diff --git a/go.mod b/go.mod index 50608e5d268..1316d48817a 100644 --- a/go.mod +++ b/go.mod @@ -26,7 +26,7 @@ require ( github.com/elastic/gosigar v0.14.1 github.com/etclabscore/go-openrpc-reflect v0.0.36 github.com/fatih/color v1.13.0 - github.com/filecoin-project/dagstore v0.5.2-0.20220221082516-6beb25bc4425 + github.com/filecoin-project/dagstore v0.5.2 github.com/filecoin-project/filecoin-ffi v0.30.4-0.20200910194244-f640612a1a1f github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-bitfield v0.2.4 @@ -36,16 +36,16 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.1-0.20220215120226-a0db7a73d4fd + github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223140554-a6e18af5929a github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-legs v0.3.0 + github.com/filecoin-project/go-legs v0.3.4 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.3-0.20220111000201-e42866db1a53 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.3.0 + github.com/filecoin-project/index-provider v0.3.1 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index b2d87d3c2c6..4df7ba31c52 100644 --- a/go.sum +++ b/go.sum @@ -298,9 +298,8 @@ github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/filecoin-project/dagstore v0.5.1/go.mod h1:OdlK3x5m3Mol874WC2bI79H4H2+leN+FabwWdW2D/wY= -github.com/filecoin-project/dagstore v0.5.2-0.20220221082516-6beb25bc4425 h1:OQxAqlQVzH9/WUAMue7LWQorL1KXgiEbJTuKRxPuxlo= -github.com/filecoin-project/dagstore v0.5.2-0.20220221082516-6beb25bc4425/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= +github.com/filecoin-project/dagstore v0.5.2 h1:Nd6oXdnolbbVhpMpkYT5PJHOjQp4OBSntHpMV5pxj3c= +github.com/filecoin-project/dagstore v0.5.2/go.mod h1:mdqKzYrRBHf1pRMthYfMv3n37oOw0Tkx7+TxPt240M0= github.com/filecoin-project/go-address v0.0.3/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.5/go.mod h1:jr8JxKsYx+lQlQZmF5i2U0Z+cGQ59wMIps/8YW/lDj8= github.com/filecoin-project/go-address v0.0.6 h1:DWQtj38ax+ogHwyH3VULRIoT8E6loyXqsk/p81xoY7M= @@ -336,8 +335,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220215120226-a0db7a73d4fd h1:RO4M6fD9L6+OGqgk6OnMrFJcN5JkcMo3MX40vqxUfmQ= -github.com/filecoin-project/go-fil-markets v1.19.1-0.20220215120226-a0db7a73d4fd/go.mod h1:Q7EWzO9s4sg2KYBUJduTYdtVhVhusDuH2W0keyyub3I= +github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223140554-a6e18af5929a h1:R0g6Dg7jeY1YYULvXdynJNSq9EaBj1dA6+BNuzytLNE= +github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223140554-a6e18af5929a/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -345,13 +344,12 @@ github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0/go.mod h1:7aWZdaQ1b16BVoQUYR+ github.com/filecoin-project/go-hamt-ipld/v3 v3.0.1/go.mod h1:gXpNmr3oQx8l3o7qkGyDjJjYSRX7hp/FGOStdqrWyDI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0 h1:rVVNq0x6RGQIzCo1iiJlGFm9AGIZzeifggxtKMU7zmI= github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBwFmYdT8SOFUwB3ovSUfG1Ux0g= -github.com/filecoin-project/go-indexer-core v0.2.4/go.mod h1:MSe5aRWmfRB+5syR4yDV+OApgJU+MUJ4rl9VUuzwCfc= github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.2.7/go.mod h1:NrdELuDbtAH8/xqRMgyOYms67aliQajExInLS6g8zFM= -github.com/filecoin-project/go-legs v0.3.0 h1:1rDNdPdXbgetmmvRcYZV5YIplIO8LtBVQ7ZttKCrTrM= github.com/filecoin-project/go-legs v0.3.0/go.mod h1:x6nwM+DuN7NzlPndOoJuiHYCX+pze6+efPRx17nIA7M= +github.com/filecoin-project/go-legs v0.3.4 h1:yid2IivTJ8JeF1ROA8jxNKNKJshU/HO1sRo5lEMNOUc= +github.com/filecoin-project/go-legs v0.3.4/go.mod h1:P7ZPHqFG96OFaT11rnXyTdcxRdGkaH1dRyPxJSOiSuM= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -373,8 +371,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.3.0 h1:+oU4whsKq2x2Z/sQfd2gVGDrARrOZVpR/irlGsKaxSc= -github.com/filecoin-project/index-provider v0.3.0/go.mod h1:3m4D2O+o649LfrsgNCZqTiiY6r+t9qF5g55jhB3PPLo= +github.com/filecoin-project/index-provider v0.3.1 h1:ySGk2FnDbUEhq6QwakeU/p8tKnIoUm6JIpXPQ8RG1iM= +github.com/filecoin-project/index-provider v0.3.1/go.mod h1:o8ineTLWnwtfBv7SnELpncza6SBU295esxOaXsTCl2I= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -398,8 +396,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1 h1:FuDaXIbcw2hRsFI8SDTmsG github.com/filecoin-project/specs-actors/v7 v7.0.0-rc1/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9 h1:oUYOvF7EvdXS0Zmk9mNkaB6Bu0l+WXBYPzVodKMiLug= github.com/filecoin-project/specs-storage v0.1.1-0.20211228030229-6d460d25a0c9/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.3.0 h1:M9C4BFLCKn6FJn2N/8q0VbX00hEjEWUuvJpscqKwqzQ= -github.com/filecoin-project/storetheindex v0.3.0/go.mod h1:GhUmP8+nINxDRUqxQvTc3Fqc7Yp6w0dW/uTaYYIzd68= +github.com/filecoin-project/storetheindex v0.3.2 h1:KsTJer5Di/iapSrOWtbFTPMt5kS7Y3n3C9kOYH93gEA= +github.com/filecoin-project/storetheindex v0.3.2/go.mod h1:d7y0FHAwPPSIdg+Oh7xV5B9TLebL7rvoKu591N/l2ZU= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -924,7 +922,6 @@ github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd github.com/ipld/go-ipld-prime/storage/bsadapter v0.0.0-20211210234204-ce2a1c70cd73/go.mod h1:2PJ0JgxyB08t0b2WKrcuqI3di0V+5n6RS/LTUJhkoxY= github.com/ipld/go-ipld-selector-text-lite v0.0.1 h1:lNqFsQpBHc3p5xHob2KvEg/iM5dIFn6iw4L/Hh+kS1Y= github.com/ipld/go-ipld-selector-text-lite v0.0.1/go.mod h1:U2CQmFb+uWzfIEF3I1arrDa5rwtj00PrpiwwCO+k1RM= -github.com/ipld/go-storethehash v0.0.0-20210915160027-d72ca9b0968c/go.mod h1:PwE6iq8TiWJRI3zMGA1RtkFAnrDMK93dLA5SUeu0lH8= github.com/ipld/go-storethehash v0.0.1/go.mod h1:w8cQfWInks8lvvbQTiKbCPusU9v0sqiViBihTHbavpQ= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52 h1:QG4CGBqCeuBo6aZlGAamSkxWdgWfZGeE49eUOWJPA4c= github.com/ipsn/go-secp256k1 v0.0.0-20180726113642-9d62b9f0bc52/go.mod h1:fdg+/X9Gg4AsAIzWpEHwnqd+QY3b7lajxyjE1m4hkq4= From b802ddb848608df5ad0f7c055d7b6cfc6befe90c Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 23 Feb 2022 14:41:55 +0000 Subject: [PATCH 89/99] Upgrade dependency to markets --- go.mod | 2 +- go.sum | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 1316d48817a..d9dd613ee3e 100644 --- a/go.mod +++ b/go.mod @@ -36,7 +36,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223140554-a6e18af5929a + github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-legs v0.3.4 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index 4df7ba31c52..5f2f91e56d7 100644 --- a/go.sum +++ b/go.sum @@ -335,8 +335,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223140554-a6e18af5929a h1:R0g6Dg7jeY1YYULvXdynJNSq9EaBj1dA6+BNuzytLNE= -github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223140554-a6e18af5929a/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= +github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8 h1:cuV4t78W8tUgmqvsc6T6qbWuycg7GzPcNsTdAOxrTns= +github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= From 769b0f30efadd2ad0a09bde72736270d14394ebc Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 2 Mar 2022 11:04:50 +0000 Subject: [PATCH 90/99] Address review comments - Add comment to clarify the reason for loop in testkit - Trim common prefix in state printed in CLI commands for better readability - Upgrade to a tagged release of `go-fil-markets` that includes indexing work; see: https://github.com/filecoin-project/go-fil-markets/pull/673 - Fix typo in CLI usage. - Add comments to note that it is safe to use fx `OnStart` context when starting the provider engine. - Fix string concatenation in error message formatting. --- cmd/lotus-miner/dagstore.go | 6 ++++-- cmd/lotus-miner/index_provider.go | 2 +- extern/filecoin-ffi | 2 +- go.mod | 2 +- go.sum | 4 ++-- itests/kit/client.go | 1 + markets/dagstore/wrapper.go | 2 +- node/modules/storageminer_idxprov.go | 3 +++ 8 files changed, 14 insertions(+), 8 deletions(-) diff --git a/cmd/lotus-miner/dagstore.go b/cmd/lotus-miner/dagstore.go index 46642459a86..b35dcbe5037 100644 --- a/cmd/lotus-miner/dagstore.go +++ b/cmd/lotus-miner/dagstore.go @@ -3,6 +3,7 @@ package main import ( "fmt" "os" + "strings" "github.com/fatih/color" "github.com/ipfs/go-cid" @@ -259,10 +260,11 @@ func printTableShards(shards []api.DagstoreShardInfo) error { m := map[string]interface{}{ "Key": s.Key, "State": func() string { + trimmedState := strings.TrimPrefix(s.State, "ShardState") if c, ok := colors[s.State]; ok { - return color.New(c).Sprint(s.State) + return color.New(c).Sprint(trimmedState) } - return s.State + return trimmedState }(), "Error": s.Error, } diff --git a/cmd/lotus-miner/index_provider.go b/cmd/lotus-miner/index_provider.go index cf97e35bf15..b784ad69594 100644 --- a/cmd/lotus-miner/index_provider.go +++ b/cmd/lotus-miner/index_provider.go @@ -60,7 +60,7 @@ var indexProvAnnounceCmd = &cli.Command{ var indexProvAnnounceAllCmd = &cli.Command{ Name: "announce-all", - Usage: "Announce all active deals to indexers so they can download its indices", + Usage: "Announce all active deals to indexers so they can download the indices", Flags: []cli.Flag{ &cli.BoolFlag{ Name: "color", diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index 5ec5d805c01..e660df5616e 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit 5ec5d805c01ea85224f6448dd6c6fa0a2a73c028 +Subproject commit e660df5616e397b2d8ac316f45ddfa7a44637971 diff --git a/go.mod b/go.mod index eac65352403..9c5310fedd1 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8 + github.com/filecoin-project/go-fil-markets v1.20.0 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-legs v0.3.4 github.com/filecoin-project/go-padreader v0.0.1 diff --git a/go.sum b/go.sum index 41205175913..3a83f7e02ff 100644 --- a/go.sum +++ b/go.sum @@ -335,8 +335,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8 h1:cuV4t78W8tUgmqvsc6T6qbWuycg7GzPcNsTdAOxrTns= -github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= +github.com/filecoin-project/go-fil-markets v1.20.0 h1:kP9A2otcRe4mTfL++GF0+d4PoFDI92E38lhM8GXFT9I= +github.com/filecoin-project/go-fil-markets v1.20.0/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= diff --git a/itests/kit/client.go b/itests/kit/client.go index 6ac3b6fec4b..8b03617f617 100644 --- a/itests/kit/client.go +++ b/itests/kit/client.go @@ -112,6 +112,7 @@ func RunClientTest(t *testing.T, cmds []*lcli.Command, clientNode *TestFullNode) require.NoError(t, err) path := filepath.Join(tmpdir, "outfile.dat") + // Wait for client retrieve to succeed. for { out = clientCLI.RunCmd("client", "retrieve", dataCid.String(), path) fmt.Println("retrieve:\n", out) diff --git a/markets/dagstore/wrapper.go b/markets/dagstore/wrapper.go index a711db93e91..1085a53cc11 100644 --- a/markets/dagstore/wrapper.go +++ b/markets/dagstore/wrapper.go @@ -419,7 +419,7 @@ func (w *Wrapper) GetPiecesContainingBlock(blockCID cid.Cid) ([]cid.Cid, error) c, err := cid.Parse(k.String()) if err != nil { prefix := fmt.Sprintf("getting pieces containing block %s:", blockCID) - return nil, xerrors.Errorf(prefix+" converting shard key %s to piece cid: %w", k, err) + return nil, xerrors.Errorf("%s converting shard key %s to piece cid: %w", prefix, k, err) } pieceCids = append(pieceCids, c) diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index 649c5b09433..ad98f033f6e 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -54,6 +54,9 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo args.Lifecycle.Append(fx.Hook{ OnStart: func(ctx context.Context) error { + // Note that the OnStart context is cancelled after startup. Its use in e.Start is + // to start up gossipsub publishers and restore cache, all of which are completed + // before e.Start returns. Therefore, it is fine to reuse the give context. if err := e.Start(ctx); err != nil { return xerrors.Errorf("starting indexer provider engine: %w", err) } From 963caf2e9d493b73ccc43bfe41311ed5504381f1 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 2 Mar 2022 11:40:02 +0000 Subject: [PATCH 91/99] Fix `gen-check` --- documentation/en/cli-lotus-miner.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/en/cli-lotus-miner.md b/documentation/en/cli-lotus-miner.md index f73b21314d4..382fe426546 100644 --- a/documentation/en/cli-lotus-miner.md +++ b/documentation/en/cli-lotus-miner.md @@ -1154,7 +1154,7 @@ USAGE: COMMANDS: announce Announce a deal to indexers so they can download its index - announce-all Announce all active deals to indexers so they can download its indices + announce-all Announce all active deals to indexers so they can download the indices help, h Shows a list of commands or help for one command OPTIONS: @@ -1179,7 +1179,7 @@ OPTIONS: ### lotus-miner index announce-all ``` NAME: - lotus-miner index announce-all - Announce all active deals to indexers so they can download its indices + lotus-miner index announce-all - Announce all active deals to indexers so they can download the indices USAGE: lotus-miner index announce-all [command options] [arguments...] From 444a2bf3550b2d6a093a2922b6758df08cfb1dd1 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 2 Mar 2022 13:45:09 +0000 Subject: [PATCH 92/99] Integrate the latest index-provider with config to disable announcements Integrate the latest `index-provider` and reflect the changes to engine configuration. Note that this commit disables announcements of indices on the network by default as requested for initial merge to master. Introduce dedicated index provider configuration parameters with documentation and defaults that match the defaults in index-provider. Re-generate code as needed. --- .../en/default-lotus-miner-config.toml | 50 +++++++++++++------ go.mod | 6 +-- go.sum | 17 +++++-- node/config/def.go | 7 ++- node/config/doc_gen.go | 43 ++++++++++++++++ node/config/types.go | 29 +++++++++-- node/modules/storageminer_idxprov.go | 39 ++++++++------- 7 files changed, 146 insertions(+), 45 deletions(-) diff --git a/documentation/en/default-lotus-miner-config.toml b/documentation/en/default-lotus-miner-config.toml index fe202833b7a..00370a9cc9d 100644 --- a/documentation/en/default-lotus-miner-config.toml +++ b/documentation/en/default-lotus-miner-config.toml @@ -266,24 +266,46 @@ [IndexProvider] - # env var: LOTUS_INDEXPROVIDER_LINKCACHESIZE - #LinkCacheSize = 1024 - - # env var: LOTUS_INDEXPROVIDER_LINKEDCHUNKSIZE - #LinkedChunkSize = 16384 + # Enable set whether to enable indexing announcement to the network and expose endpoints that + # allow indexer nodes to process announcements. Disabled by default. + # + # type: bool + # env var: LOTUS_INDEXPROVIDER_ENABLE + #Enable = false - # env var: LOTUS_INDEXPROVIDER_PUBSUBTOPIC - #PubSubTopic = "/indexer/ingest/mainnet" + # EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement + # entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The + # maximum storage used by the cache is a factor of EntriesCacheCapacity, EntriesChunkSize and + # the length of multihashes being advertised. For example, advertising 128-bit long multihashes + # with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size can grow to + # 256MiB when full. + # + # type: int + # env var: LOTUS_INDEXPROVIDER_ENTRIESCACHECAPACITY + #EntriesCacheCapacity = 1024 - # env var: LOTUS_INDEXPROVIDER_PURGELINKCACHE - #PurgeLinkCache = false + # EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. + # Defaults to 16384 if not specified. Note that chunks are chained together for indexing + # advertisements that include more multihashes than the configured EntriesChunkSize. + # + # type: int + # env var: LOTUS_INDEXPROVIDER_ENTRIESCHUNKSIZE + #EntriesChunkSize = 16384 - # env var: LOTUS_INDEXPROVIDER_PUBLISHERKIND - #PublisherKind = "dtsync" + # TopicName sets the topic name on which the changes to the advertised content are announced. + # Defaults to '/indexer/ingest/mainnet' if not specified. + # + # type: string + # env var: LOTUS_INDEXPROVIDER_TOPICNAME + #TopicName = "/indexer/ingest/mainnet" - [IndexProvider.HttpPublisher] - # env var: LOTUS_INDEXPROVIDER_HTTPPUBLISHER_LISTENMULTIADDR - #ListenMultiaddr = "/ip4/0.0.0.0/tcp/3104/http" + # PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine + # starts. By default, the cache is rehydrated from previously cached entries stored in + # datastore if any is present. + # + # type: bool + # env var: LOTUS_INDEXPROVIDER_PURGECACHEONSTART + #PurgeCacheOnStart = false [Sealing] diff --git a/go.mod b/go.mod index 9c5310fedd1..1c06ecbb119 100644 --- a/go.mod +++ b/go.mod @@ -40,14 +40,14 @@ require ( github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 github.com/filecoin-project/go-fil-markets v1.20.0 github.com/filecoin-project/go-jsonrpc v0.1.5 - github.com/filecoin-project/go-legs v0.3.4 + github.com/filecoin-project/go-legs v0.3.7 github.com/filecoin-project/go-padreader v0.0.1 github.com/filecoin-project/go-paramfetch v0.0.4 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.3.1 + github.com/filecoin-project/index-provider v0.4.0 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 @@ -150,7 +150,7 @@ require ( github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 + github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 diff --git a/go.sum b/go.sum index 3a83f7e02ff..bab2875808e 100644 --- a/go.sum +++ b/go.sum @@ -348,8 +348,9 @@ github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43 github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= github.com/filecoin-project/go-legs v0.3.0/go.mod h1:x6nwM+DuN7NzlPndOoJuiHYCX+pze6+efPRx17nIA7M= -github.com/filecoin-project/go-legs v0.3.4 h1:yid2IivTJ8JeF1ROA8jxNKNKJshU/HO1sRo5lEMNOUc= github.com/filecoin-project/go-legs v0.3.4/go.mod h1:P7ZPHqFG96OFaT11rnXyTdcxRdGkaH1dRyPxJSOiSuM= +github.com/filecoin-project/go-legs v0.3.7 h1:yfm7fx+iy1nPtgPEQ6kQjvhoJOVbXide50STYdy+yos= +github.com/filecoin-project/go-legs v0.3.7/go.mod h1:pgekGm8/gKY5zCtQ/qGAoSjGP92wTLFqpO3GPHeu8YU= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -371,8 +372,9 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.3.1 h1:ySGk2FnDbUEhq6QwakeU/p8tKnIoUm6JIpXPQ8RG1iM= github.com/filecoin-project/index-provider v0.3.1/go.mod h1:o8ineTLWnwtfBv7SnELpncza6SBU295esxOaXsTCl2I= +github.com/filecoin-project/index-provider v0.4.0 h1:laCdWms1OvgHwxkU0DSfkzqPQBRAMPO2TKes5s0TdHo= +github.com/filecoin-project/index-provider v0.4.0/go.mod h1:SDfBxhD9/wet7e5wv1J4IZjWfVkln/k4oTzMcNccLZA= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -396,8 +398,9 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuO github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.3.2 h1:KsTJer5Di/iapSrOWtbFTPMt5kS7Y3n3C9kOYH93gEA= github.com/filecoin-project/storetheindex v0.3.2/go.mod h1:d7y0FHAwPPSIdg+Oh7xV5B9TLebL7rvoKu591N/l2ZU= +github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= +github.com/filecoin-project/storetheindex v0.3.5/go.mod h1:0r3d0kSpK63O6AvLr1CjAINLi+nWD49clzcnKV+GLpI= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= @@ -1056,6 +1059,7 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= +github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= github.com/libp2p/go-libp2p v0.18.0-rc5 h1:88wWDHb9nNo0vBNCupLde3OTnFAkugOCNkrDfl3ivK4= github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= @@ -1253,6 +1257,7 @@ github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkR github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= +github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-swarm v0.10.2 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1928,8 +1933,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831 h1:9blPRrm7ebDqDm6nHXXzCSru+sp20gcA3CLu+G/kHUc= +github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -2040,8 +2046,9 @@ go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= diff --git a/node/config/def.go b/node/config/def.go index 8024bf9a2ce..233eccdd5aa 100644 --- a/node/config/def.go +++ b/node/config/def.go @@ -11,7 +11,6 @@ import ( "github.com/filecoin-project/go-state-types/abi" "github.com/filecoin-project/go-state-types/big" - ipconfig "github.com/filecoin-project/index-provider/config" miner5 "github.com/filecoin-project/specs-actors/v5/actors/builtin/miner" "github.com/filecoin-project/lotus/chain/actors/builtin" @@ -185,7 +184,11 @@ func DefaultStorageMiner() *StorageMiner { }, IndexProvider: IndexProviderConfig{ - Ingest: ipconfig.NewIngest(), + Enable: false, + EntriesCacheCapacity: 1024, + EntriesChunkSize: 16384, + TopicName: "/indexer/ingest/mainnet", + PurgeCacheOnStart: false, }, Subsystems: MinerSubsystemConfig{ diff --git a/node/config/doc_gen.go b/node/config/doc_gen.go index d846f6db9d2..c9b6357d39d 100644 --- a/node/config/doc_gen.go +++ b/node/config/doc_gen.go @@ -366,6 +366,49 @@ see https://docs.filecoin.io/mine/lotus/miner-configuration/#using-filters-for-f Comment: ``, }, }, + "IndexProviderConfig": []DocField{ + { + Name: "Enable", + Type: "bool", + + Comment: `Enable set whether to enable indexing announcement to the network and expose endpoints that +allow indexer nodes to process announcements. Disabled by default.`, + }, + { + Name: "EntriesCacheCapacity", + Type: "int", + + Comment: `EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement +entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The +maximum storage used by the cache is a factor of EntriesCacheCapacity, EntriesChunkSize and +the length of multihashes being advertised. For example, advertising 128-bit long multihashes +with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size can grow to +256MiB when full.`, + }, + { + Name: "EntriesChunkSize", + Type: "int", + + Comment: `EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. +Defaults to 16384 if not specified. Note that chunks are chained together for indexing +advertisements that include more multihashes than the configured EntriesChunkSize.`, + }, + { + Name: "TopicName", + Type: "string", + + Comment: `TopicName sets the topic name on which the changes to the advertised content are announced. +Defaults to '/indexer/ingest/mainnet' if not specified.`, + }, + { + Name: "PurgeCacheOnStart", + Type: "bool", + + Comment: `PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine +starts. By default, the cache is rehydrated from previously cached entries stored in +datastore if any is present.`, + }, + }, "Libp2p": []DocField{ { Name: "ListenAddresses", diff --git a/node/config/types.go b/node/config/types.go index a2bd4e0a081..c70d99a825a 100644 --- a/node/config/types.go +++ b/node/config/types.go @@ -3,8 +3,6 @@ package config import ( "github.com/ipfs/go-cid" - "github.com/filecoin-project/index-provider/config" - "github.com/filecoin-project/lotus/chain/types" sectorstorage "github.com/filecoin-project/lotus/extern/sector-storage" ) @@ -166,7 +164,32 @@ type DealmakingConfig struct { } type IndexProviderConfig struct { - config.Ingest + + // Enable set whether to enable indexing announcement to the network and expose endpoints that + // allow indexer nodes to process announcements. Disabled by default. + Enable bool + + // EntriesCacheCapacity sets the maximum capacity to use for caching the indexing advertisement + // entries. Defaults to 1024 if not specified. The cache is evicted using LRU policy. The + // maximum storage used by the cache is a factor of EntriesCacheCapacity, EntriesChunkSize and + // the length of multihashes being advertised. For example, advertising 128-bit long multihashes + // with the default EntriesCacheCapacity, and EntriesChunkSize means the cache size can grow to + // 256MiB when full. + EntriesCacheCapacity int + + // EntriesChunkSize sets the maximum number of multihashes to include in a single entries chunk. + // Defaults to 16384 if not specified. Note that chunks are chained together for indexing + // advertisements that include more multihashes than the configured EntriesChunkSize. + EntriesChunkSize int + + // TopicName sets the topic name on which the changes to the advertised content are announced. + // Defaults to '/indexer/ingest/mainnet' if not specified. + TopicName string + + // PurgeCacheOnStart sets whether to clear any cached entries chunks when the provider engine + // starts. By default, the cache is rehydrated from previously cached entries stored in + // datastore if any is present. + PurgeCacheOnStart bool } type RetrievalPricing struct { diff --git a/node/modules/storageminer_idxprov.go b/node/modules/storageminer_idxprov.go index ad98f033f6e..c13fcb7c51a 100644 --- a/node/modules/storageminer_idxprov.go +++ b/node/modules/storageminer_idxprov.go @@ -2,10 +2,7 @@ package modules import ( "context" - "github.com/ipfs/go-datastore" - "github.com/libp2p/go-libp2p-core/peer" - "github.com/libp2p/go-libp2p-core/peerstore" "go.uber.org/fx" "github.com/filecoin-project/go-address" @@ -24,33 +21,38 @@ type IdxProv struct { fx.Lifecycle Datastore dtypes.MetadataDS - PeerID peer.ID - peerstore.Peerstore } func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress) (provider.Interface, error) { return func(args IdxProv, marketHost host.Host, dt dtypes.ProviderDataTransfer, maddr dtypes.MinerAddress) (provider.Interface, error) { ipds := namespace.Wrap(args.Datastore, datastore.NewKey("/index-provider")) - - pkey := args.Peerstore.PrivKey(args.PeerID) - if pkey == nil { - return nil, xerrors.Errorf("missing private key for node ID: %s", args.PeerID) + var opts = []engine.Option{ + engine.WithDatastore(ipds), + engine.WithHost(marketHost), + engine.WithRetrievalAddrs(marketHost.Addrs()...), } - var retAdds []string - for _, a := range marketHost.Addrs() { - retAdds = append(retAdds, a.String()) + llog := log.With("idxProvEnabled", cfg.Enable, "pid", marketHost.ID(), "retAddrs", marketHost.Addrs()) + // If announcements to the network are enabled, then set options for datatransfer publisher. + if cfg.Enable { + // Get the miner ID and set as extra gossip data. + // The extra data is required by the lotus-specific index-provider gossip message validators. + ma := address.Address(maddr) + opts = append(opts, + engine.WithPublisherKind(engine.DataTransferPublisher), + engine.WithDataTransfer(dt), + engine.WithExtraGossipData(ma.Bytes())) + llog = llog.With("extraGossipData", ma) + } else { + opts = append(opts, engine.WithPublisherKind(engine.NoPublisher)) } - // Get the miner ID and set as extra gossip data. - // The extra data is required by the lotus-specific index-provider gossip message validators. - ma := address.Address(maddr) - log.Infof("Using extra gossip data in index provider engine: %s", ma) - - e, err := engine.New(cfg.Ingest, pkey, dt, marketHost, ipds, retAdds, engine.WithExtraGossipData(ma.Bytes())) + // Instantiate the index provider engine. + e, err := engine.New(opts...) if err != nil { return nil, xerrors.Errorf("creating indexer provider engine: %w", err) } + llog.Info("Instantiated index provider engine") args.Lifecycle.Append(fx.Hook{ OnStart: func(ctx context.Context) error { @@ -60,6 +62,7 @@ func IndexProvider(cfg config.IndexProviderConfig) func(params IdxProv, marketHo if err := e.Start(ctx); err != nil { return xerrors.Errorf("starting indexer provider engine: %w", err) } + log.Infof("Started index provider engine") return nil }, OnStop: func(_ context.Context) error { From eb83001bbc4aae6f74dbcbca06b262d5157fa56a Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Wed, 2 Mar 2022 15:07:05 +0000 Subject: [PATCH 93/99] Fix wrong ffi commit --- extern/filecoin-ffi | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extern/filecoin-ffi b/extern/filecoin-ffi index e660df5616e..5ec5d805c01 160000 --- a/extern/filecoin-ffi +++ b/extern/filecoin-ffi @@ -1 +1 @@ -Subproject commit e660df5616e397b2d8ac316f45ddfa7a44637971 +Subproject commit 5ec5d805c01ea85224f6448dd6c6fa0a2a73c028 From a52b4b72e9cdb97aec3f197796f3a002598dfd4e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Wed, 2 Mar 2022 20:23:47 +0100 Subject: [PATCH 94/99] gomod: Use latest cbor-gen --- go.mod | 2 +- go.sum | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/go.mod b/go.mod index 1c06ecbb119..e76692d531f 100644 --- a/go.mod +++ b/go.mod @@ -150,7 +150,7 @@ require ( github.com/uber/jaeger-client-go v2.25.0+incompatible // indirect github.com/urfave/cli/v2 v2.3.0 github.com/whyrusleeping/bencher v0.0.0-20190829221104-bb6607aa8bba - github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831 + github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 github.com/whyrusleeping/ledger-filecoin-go v0.9.1-0.20201010031517-c3dcc1bddce4 github.com/whyrusleeping/multiaddr-filter v0.0.0-20160516205228-e903e4adabd7 github.com/whyrusleeping/pubsub v0.0.0-20190708150250-92bcb0691325 diff --git a/go.sum b/go.sum index bab2875808e..cd4618b291c 100644 --- a/go.sum +++ b/go.sum @@ -1934,8 +1934,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831 h1:9blPRrm7ebDqDm6nHXXzCSru+sp20gcA3CLu+G/kHUc= github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 h1:vo2wkP2ceHyGyZwFFtAabpot03EeSxxwAe57pOI9E/4= +github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= From 8cf6f24f4d0aedb9ee904d3b37de74738db7aca1 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 3 Mar 2022 12:57:09 +0000 Subject: [PATCH 95/99] Upgrade `go-fil-markets` to include index provider metadata changes Upgrade to the latest `go-fil-markets` that integrates concrete multicodec for the indexing metadata. --- go.mod | 4 ++-- go.sum | 16 ++++++---------- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index e76692d531f..fb25f4335e3 100644 --- a/go.mod +++ b/go.mod @@ -38,7 +38,7 @@ require ( github.com/filecoin-project/go-data-transfer v1.14.0 github.com/filecoin-project/go-fil-commcid v0.1.0 github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 - github.com/filecoin-project/go-fil-markets v1.20.0 + github.com/filecoin-project/go-fil-markets v1.20.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-legs v0.3.7 github.com/filecoin-project/go-padreader v0.0.1 @@ -47,7 +47,7 @@ require ( github.com/filecoin-project/go-statemachine v1.0.1 github.com/filecoin-project/go-statestore v0.2.0 github.com/filecoin-project/go-storedcounter v0.1.0 - github.com/filecoin-project/index-provider v0.4.0 + github.com/filecoin-project/index-provider v0.5.0 github.com/filecoin-project/specs-actors v0.9.14 github.com/filecoin-project/specs-actors/v2 v2.3.6 github.com/filecoin-project/specs-actors/v3 v3.1.1 diff --git a/go.sum b/go.sum index cd4618b291c..5af25332ef6 100644 --- a/go.sum +++ b/go.sum @@ -335,8 +335,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.20.0 h1:kP9A2otcRe4mTfL++GF0+d4PoFDI92E38lhM8GXFT9I= -github.com/filecoin-project/go-fil-markets v1.20.0/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= +github.com/filecoin-project/go-fil-markets v1.20.1 h1:DwrFuNIWC0a2c2ESpHtdEMH3QCpR/hoZ5DwjNT+VJ+E= +github.com/filecoin-project/go-fil-markets v1.20.1/go.mod h1:QV767KIWHrikVK8R0u2wTc5wkee4gXOf5/AfxDoQckw= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -347,8 +347,6 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.3.0/go.mod h1:x6nwM+DuN7NzlPndOoJuiHYCX+pze6+efPRx17nIA7M= -github.com/filecoin-project/go-legs v0.3.4/go.mod h1:P7ZPHqFG96OFaT11rnXyTdcxRdGkaH1dRyPxJSOiSuM= github.com/filecoin-project/go-legs v0.3.7 h1:yfm7fx+iy1nPtgPEQ6kQjvhoJOVbXide50STYdy+yos= github.com/filecoin-project/go-legs v0.3.7/go.mod h1:pgekGm8/gKY5zCtQ/qGAoSjGP92wTLFqpO3GPHeu8YU= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= @@ -372,9 +370,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.3.1/go.mod h1:o8ineTLWnwtfBv7SnELpncza6SBU295esxOaXsTCl2I= -github.com/filecoin-project/index-provider v0.4.0 h1:laCdWms1OvgHwxkU0DSfkzqPQBRAMPO2TKes5s0TdHo= -github.com/filecoin-project/index-provider v0.4.0/go.mod h1:SDfBxhD9/wet7e5wv1J4IZjWfVkln/k4oTzMcNccLZA= +github.com/filecoin-project/index-provider v0.5.0 h1:k2C1RFvOvxmA2i8bhmkb3b4qun7RDRDzzs/y25/TwQg= +github.com/filecoin-project/index-provider v0.5.0/go.mod h1:KHVrP2vU3YuScb+fawObwTFoR882up9U07kk0ZrfP0c= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -398,7 +395,6 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuO github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.3.2/go.mod h1:d7y0FHAwPPSIdg+Oh7xV5B9TLebL7rvoKu591N/l2ZU= github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= github.com/filecoin-project/storetheindex v0.3.5/go.mod h1:0r3d0kSpK63O6AvLr1CjAINLi+nWD49clzcnKV+GLpI= github.com/filecoin-project/test-vectors/schema v0.0.5 h1:w3zHQhzM4pYxJDl21avXjOKBLF8egrvwUwjpT8TquDg= @@ -1579,8 +1575,9 @@ github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErh github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.4.0 h1:fbqb6ky7erjdD+/zaEBJgZWu1i8D6i/wmPywGK7sdow= github.com/multiformats/go-multicodec v0.4.0/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4= +github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -1933,7 +1930,6 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 h1:vo2wkP2ceHyGyZwFFtAabpot03EeSxxwAe57pOI9E/4= github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= From 1bb65189af87631b2adc32ccc728f1af1ffee554 Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 3 Mar 2022 13:29:32 +0000 Subject: [PATCH 96/99] Upgrade to go-path `v0.2.1` and remove `replace` directive The dependency was used in the chain API. Integrated the new fetcher factory. --- go.mod | 3 +-- go.sum | 7 ++++++- node/impl/full/chain.go | 15 ++++++--------- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/go.mod b/go.mod index fb25f4335e3..14c1ce0d470 100644 --- a/go.mod +++ b/go.mod @@ -81,6 +81,7 @@ require ( github.com/ipfs/go-ds-badger2 v0.1.2 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 + github.com/ipfs/go-fetcher v1.6.1 github.com/ipfs/go-fs-lock v0.0.7 github.com/ipfs/go-graphsync v0.12.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 @@ -176,5 +177,3 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ./extern/filecoin-ffi replace github.com/filecoin-project/test-vectors => ./extern/test-vectors - -replace github.com/ipfs/go-path => github.com/ipfs/go-path v0.0.7 diff --git a/go.sum b/go.sum index 5af25332ef6..79febec3a71 100644 --- a/go.sum +++ b/go.sum @@ -746,6 +746,7 @@ github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82l github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= +github.com/ipfs/go-fetcher v1.6.1 h1:UFuRVYX5AIllTiRhi5uK/iZkfhSpBCGX7L70nSZEmK8= github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= @@ -865,8 +866,11 @@ github.com/ipfs/go-metrics-prometheus v0.0.2 h1:9i2iljLg12S78OhC6UAiXi176xvQGiZa github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= -github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= +github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8= +github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0= +github.com/ipfs/go-path v0.2.1 h1:R0JYCu0JBnfa6A3C42nzsNPxtKU5/fnUPhWSuzcJHws= +github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= @@ -881,6 +885,7 @@ github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMU github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= +github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-unixfsnode v1.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index ce492f94ae0..6ed9b6de42c 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -17,6 +17,7 @@ import ( "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" + bsfetcher "github.com/ipfs/go-fetcher/impl/blockservice" offline "github.com/ipfs/go-ipfs-exchange-offline" cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" @@ -24,6 +25,7 @@ import ( "github.com/ipfs/go-merkledag" "github.com/ipfs/go-path" "github.com/ipfs/go-path/resolver" + cidlink "github.com/ipld/go-ipld-prime/linking/cid" mh "github.com/multiformats/go-multihash" cbg "github.com/whyrusleeping/cbor-gen" @@ -557,21 +559,16 @@ func (a *ChainAPI) ChainGetNode(ctx context.Context, p string) (*api.IpldObject, bs := a.ExposedBlockstore bsvc := blockservice.New(bs, offline.Exchange(bs)) + fc := bsfetcher.NewFetcherConfig(bsvc) + r := resolver.NewBasicResolver(fc) - dag := merkledag.NewDAGService(bsvc) - - r := &resolver.Resolver{ - DAG: dag, - ResolveOnce: resolveOnce(bs, a.TsExec), - } - - node, err := r.ResolvePath(ctx, ip) + node, lnk, err := r.ResolvePath(ctx, ip) if err != nil { return nil, err } return &api.IpldObject{ - Cid: node.Cid(), + Cid: lnk.(cidlink.Link).Cid, Obj: node, }, nil } From 7dcfeee0ea8afe28625d1b10308aa164462c49ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 3 Mar 2022 14:14:12 +0000 Subject: [PATCH 97/99] use old go-path --- lib/oldpath/oldresolver/resolver.go | 198 +++++++++++++++++++++++++++ lib/oldpath/path.go | 199 ++++++++++++++++++++++++++++ node/impl/full/chain.go | 20 +-- 3 files changed, 408 insertions(+), 9 deletions(-) create mode 100644 lib/oldpath/oldresolver/resolver.go create mode 100644 lib/oldpath/path.go diff --git a/lib/oldpath/oldresolver/resolver.go b/lib/oldpath/oldresolver/resolver.go new file mode 100644 index 00000000000..e475e29be91 --- /dev/null +++ b/lib/oldpath/oldresolver/resolver.go @@ -0,0 +1,198 @@ +package oldresolver + +import ( + "context" + "errors" + "fmt" + "time" + + path "github.com/filecoin-project/lotus/lib/oldpath" + + cid "github.com/ipfs/go-cid" + ipld "github.com/ipfs/go-ipld-format" + logging "github.com/ipfs/go-log/v2" + dag "github.com/ipfs/go-merkledag" +) + +var log = logging.Logger("pathresolv") + +// ErrNoComponents is used when Paths after a protocol +// do not contain at least one component +var ErrNoComponents = errors.New( + "path must contain at least one component") + +// ErrNoLink is returned when a link is not found in a path +type ErrNoLink struct { + Name string + Node cid.Cid +} + +// Error implements the Error interface for ErrNoLink with a useful +// human readable message. +func (e ErrNoLink) Error() string { + return fmt.Sprintf("no link named %q under %s", e.Name, e.Node.String()) +} + +// ResolveOnce resolves path through a single node +type ResolveOnce func(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) + +// Resolver provides path resolution to IPFS +// It has a pointer to a DAGService, which is uses to resolve nodes. +// TODO: now that this is more modular, try to unify this code with the +// the resolvers in namesys +type Resolver struct { + DAG ipld.NodeGetter + + ResolveOnce ResolveOnce +} + +// NewBasicResolver constructs a new basic resolver. +func NewBasicResolver(ds ipld.DAGService) *Resolver { + return &Resolver{ + DAG: ds, + ResolveOnce: ResolveSingle, + } +} + +// ResolveToLastNode walks the given path and returns the cid of the last node +// referenced by the path +func (r *Resolver) ResolveToLastNode(ctx context.Context, fpath path.Path) (cid.Cid, []string, error) { + c, p, err := path.SplitAbsPath(fpath) + if err != nil { + return cid.Cid{}, nil, err + } + + if len(p) == 0 { + return c, nil, nil + } + + nd, err := r.DAG.Get(ctx, c) + if err != nil { + return cid.Cid{}, nil, err + } + + for len(p) > 0 { + lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, p) + + // Note: have to drop the error here as `ResolveOnce` doesn't handle 'leaf' + // paths (so e.g. for `echo '{"foo":123}' | ipfs dag put` we wouldn't be + // able to resolve `zdpu[...]/foo`) + if lnk == nil { + break + } + + if err != nil { + if err == dag.ErrLinkNotFound { + err = ErrNoLink{Name: p[0], Node: nd.Cid()} + } + return cid.Cid{}, nil, err + } + + next, err := lnk.GetNode(ctx, r.DAG) + if err != nil { + return cid.Cid{}, nil, err + } + nd = next + p = rest + } + + if len(p) == 0 { + return nd.Cid(), nil, nil + } + + // Confirm the path exists within the object + val, rest, err := nd.Resolve(p) + if err != nil { + if err == dag.ErrLinkNotFound { + err = ErrNoLink{Name: p[0], Node: nd.Cid()} + } + return cid.Cid{}, nil, err + } + + if len(rest) > 0 { + return cid.Cid{}, nil, errors.New("path failed to resolve fully") + } + switch val.(type) { + case *ipld.Link: + return cid.Cid{}, nil, errors.New("inconsistent ResolveOnce / nd.Resolve") + default: + return nd.Cid(), p, nil + } +} + +// ResolvePath fetches the node for given path. It returns the last item +// returned by ResolvePathComponents. +func (r *Resolver) ResolvePath(ctx context.Context, fpath path.Path) (ipld.Node, error) { + // validate path + if err := fpath.IsValid(); err != nil { + return nil, err + } + + nodes, err := r.ResolvePathComponents(ctx, fpath) + if err != nil || nodes == nil { + return nil, err + } + return nodes[len(nodes)-1], err +} + +// ResolveSingle simply resolves one hop of a path through a graph with no +// extra context (does not opaquely resolve through sharded nodes) +func ResolveSingle(ctx context.Context, ds ipld.NodeGetter, nd ipld.Node, names []string) (*ipld.Link, []string, error) { + return nd.ResolveLink(names) +} + +// ResolvePathComponents fetches the nodes for each segment of the given path. +// It uses the first path component as a hash (key) of the first node, then +// resolves all other components walking the links, with ResolveLinks. +func (r *Resolver) ResolvePathComponents(ctx context.Context, fpath path.Path) ([]ipld.Node, error) { + + h, parts, err := path.SplitAbsPath(fpath) + if err != nil { + return nil, err + } + + log.Debug("resolve dag get") + nd, err := r.DAG.Get(ctx, h) + if err != nil { + return nil, err + } + + return r.ResolveLinks(ctx, nd, parts) +} + +// ResolveLinks iteratively resolves names by walking the link hierarchy. +// Every node is fetched from the DAGService, resolving the next name. +// Returns the list of nodes forming the path, starting with ndd. This list is +// guaranteed never to be empty. +// +// ResolveLinks(nd, []string{"foo", "bar", "baz"}) +// would retrieve "baz" in ("bar" in ("foo" in nd.Links).Links).Links +func (r *Resolver) ResolveLinks(ctx context.Context, ndd ipld.Node, names []string) ([]ipld.Node, error) { + result := make([]ipld.Node, 0, len(names)+1) + result = append(result, ndd) + nd := ndd // dup arg workaround + + // for each of the path components + for len(names) > 0 { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, time.Minute) + defer cancel() + + lnk, rest, err := r.ResolveOnce(ctx, r.DAG, nd, names) + if err == dag.ErrLinkNotFound { + return result, ErrNoLink{Name: names[0], Node: nd.Cid()} + } else if err != nil { + return result, err + } + + nextnode, err := lnk.GetNode(ctx, r.DAG) + if err != nil { + return result, err + } + + nd = nextnode + result = append(result, nextnode) + names = rest + } + return result, nil +} diff --git a/lib/oldpath/path.go b/lib/oldpath/path.go new file mode 100644 index 00000000000..fe4bd67a24b --- /dev/null +++ b/lib/oldpath/path.go @@ -0,0 +1,199 @@ +package oldpath + +import ( + "fmt" + "path" + "strings" + + cid "github.com/ipfs/go-cid" +) + +// helper type so path parsing errors include the path +type pathError struct { + error error + path string +} + +func (e *pathError) Error() string { + return fmt.Sprintf("invalid path %q: %s", e.path, e.error) +} + +func (e *pathError) Unwrap() error { + return e.error +} + +func (e *pathError) Path() string { + return e.path +} + +// A Path represents an ipfs content path: +// * //path/to/file +// * /ipfs/ +// * /ipns//path/to/folder +// * etc +type Path string + +// ^^^ +// TODO: debate making this a private struct wrapped in a public interface +// would allow us to control creation, and cache segments. + +// FromString safely converts a string type to a Path type. +func FromString(s string) Path { + return Path(s) +} + +// FromCid safely converts a cid.Cid type to a Path type. +func FromCid(c cid.Cid) Path { + return Path("/ipfs/" + c.String()) +} + +// Segments returns the different elements of a path +// (elements are delimited by a /). +func (p Path) Segments() []string { + cleaned := path.Clean(string(p)) + segments := strings.Split(cleaned, "/") + + // Ignore leading slash + if len(segments[0]) == 0 { + segments = segments[1:] + } + + return segments +} + +// String converts a path to string. +func (p Path) String() string { + return string(p) +} + +// IsJustAKey returns true if the path is of the form or /ipfs/, or +// /ipld/ +func (p Path) IsJustAKey() bool { + parts := p.Segments() + return len(parts) == 2 && (parts[0] == "ipfs" || parts[0] == "ipld") +} + +// PopLastSegment returns a new Path without its final segment, and the final +// segment, separately. If there is no more to pop (the path is just a key), +// the original path is returned. +func (p Path) PopLastSegment() (Path, string, error) { + + if p.IsJustAKey() { + return p, "", nil + } + + segs := p.Segments() + newPath, err := ParsePath("/" + strings.Join(segs[:len(segs)-1], "/")) + if err != nil { + return "", "", err + } + + return newPath, segs[len(segs)-1], nil +} + +// FromSegments returns a path given its different segments. +func FromSegments(prefix string, seg ...string) (Path, error) { + return ParsePath(prefix + strings.Join(seg, "/")) +} + +// ParsePath returns a well-formed ipfs Path. +// The returned path will always be prefixed with /ipfs/ or /ipns/. +// The prefix will be added if not present in the given string. +// This function will return an error when the given string is +// not a valid ipfs path. +func ParsePath(txt string) (Path, error) { + parts := strings.Split(txt, "/") + if len(parts) == 1 { + kp, err := ParseCidToPath(txt) + if err == nil { + return kp, nil + } + } + + // if the path doesnt begin with a '/' + // we expect this to start with a hash, and be an 'ipfs' path + if parts[0] != "" { + if _, err := cid.Decode(parts[0]); err != nil { + return "", &pathError{error: err, path: txt} + } + // The case when the path starts with hash without a protocol prefix + return Path("/ipfs/" + txt), nil + } + + if len(parts) < 3 { + return "", &pathError{error: fmt.Errorf("path does not begin with '/'"), path: txt} + } + + //TODO: make this smarter + switch parts[1] { + case "ipfs", "ipld": + if parts[2] == "" { + return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} + } + // Validate Cid. + _, err := cid.Decode(parts[2]) + if err != nil { + return "", &pathError{error: fmt.Errorf("invalid CID: %s", err), path: txt} + } + case "ipns": + if parts[2] == "" { + return "", &pathError{error: fmt.Errorf("not enough path components"), path: txt} + } + default: + return "", &pathError{error: fmt.Errorf("unknown namespace %q", parts[1]), path: txt} + } + + return Path(txt), nil +} + +// ParseCidToPath takes a CID in string form and returns a valid ipfs Path. +func ParseCidToPath(txt string) (Path, error) { + if txt == "" { + return "", &pathError{error: fmt.Errorf("empty"), path: txt} + } + + c, err := cid.Decode(txt) + if err != nil { + return "", &pathError{error: err, path: txt} + } + + return FromCid(c), nil +} + +// IsValid checks if a path is a valid ipfs Path. +func (p *Path) IsValid() error { + _, err := ParsePath(p.String()) + return err +} + +// Join joins strings slices using / +func Join(pths []string) string { + return strings.Join(pths, "/") +} + +// SplitList splits strings usings / +func SplitList(pth string) []string { + return strings.Split(pth, "/") +} + +// SplitAbsPath clean up and split fpath. It extracts the first component (which +// must be a Multihash) and return it separately. +func SplitAbsPath(fpath Path) (cid.Cid, []string, error) { + parts := fpath.Segments() + if parts[0] == "ipfs" || parts[0] == "ipld" { + parts = parts[1:] + } + + // if nothing, bail. + if len(parts) == 0 { + return cid.Cid{}, nil, &pathError{error: fmt.Errorf("empty"), path: string(fpath)} + } + + c, err := cid.Decode(parts[0]) + // first element in the path is a cid + if err != nil { + return cid.Cid{}, nil, &pathError{error: fmt.Errorf("invalid CID: %s", err), path: string(fpath)} + } + + return c, parts[1:], nil +} diff --git a/node/impl/full/chain.go b/node/impl/full/chain.go index 6ed9b6de42c..61be82bc9e6 100644 --- a/node/impl/full/chain.go +++ b/node/impl/full/chain.go @@ -17,15 +17,11 @@ import ( "github.com/ipfs/go-blockservice" "github.com/ipfs/go-cid" - bsfetcher "github.com/ipfs/go-fetcher/impl/blockservice" offline "github.com/ipfs/go-ipfs-exchange-offline" cbor "github.com/ipfs/go-ipld-cbor" ipld "github.com/ipfs/go-ipld-format" logging "github.com/ipfs/go-log/v2" "github.com/ipfs/go-merkledag" - "github.com/ipfs/go-path" - "github.com/ipfs/go-path/resolver" - cidlink "github.com/ipld/go-ipld-prime/linking/cid" mh "github.com/multiformats/go-multihash" cbg "github.com/whyrusleeping/cbor-gen" @@ -38,6 +34,8 @@ import ( "github.com/filecoin-project/lotus/chain/store" "github.com/filecoin-project/lotus/chain/types" "github.com/filecoin-project/lotus/chain/vm" + "github.com/filecoin-project/lotus/lib/oldpath" + "github.com/filecoin-project/lotus/lib/oldpath/oldresolver" "github.com/filecoin-project/lotus/node/modules/dtypes" ) @@ -552,23 +550,27 @@ func resolveOnce(bs blockstore.Blockstore, tse stmgr.Executor) func(ctx context. } func (a *ChainAPI) ChainGetNode(ctx context.Context, p string) (*api.IpldObject, error) { - ip, err := path.ParsePath(p) + ip, err := oldpath.ParsePath(p) if err != nil { return nil, xerrors.Errorf("parsing path: %w", err) } bs := a.ExposedBlockstore bsvc := blockservice.New(bs, offline.Exchange(bs)) - fc := bsfetcher.NewFetcherConfig(bsvc) - r := resolver.NewBasicResolver(fc) + dag := merkledag.NewDAGService(bsvc) + + r := &oldresolver.Resolver{ + DAG: dag, + ResolveOnce: resolveOnce(bs, a.TsExec), + } - node, lnk, err := r.ResolvePath(ctx, ip) + node, err := r.ResolvePath(ctx, ip) if err != nil { return nil, err } return &api.IpldObject{ - Cid: lnk.(cidlink.Link).Cid, + Cid: node.Cid(), Obj: node, }, nil } From 28d751b2e0f8b0aa4b75f4f740eefcde59c8d066 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Magiera?= Date: Thu, 3 Mar 2022 14:20:57 +0000 Subject: [PATCH 98/99] mod tidy --- go.mod | 2 -- go.sum | 1 - 2 files changed, 3 deletions(-) diff --git a/go.mod b/go.mod index 14c1ce0d470..060613d1949 100644 --- a/go.mod +++ b/go.mod @@ -81,7 +81,6 @@ require ( github.com/ipfs/go-ds-badger2 v0.1.2 github.com/ipfs/go-ds-leveldb v0.5.0 github.com/ipfs/go-ds-measure v0.2.0 - github.com/ipfs/go-fetcher v1.6.1 github.com/ipfs/go-fs-lock v0.0.7 github.com/ipfs/go-graphsync v0.12.0 github.com/ipfs/go-ipfs-blockstore v1.1.2 @@ -101,7 +100,6 @@ require ( github.com/ipfs/go-merkledag v0.5.1 github.com/ipfs/go-metrics-interface v0.0.1 github.com/ipfs/go-metrics-prometheus v0.0.2 - github.com/ipfs/go-path v0.2.1 github.com/ipfs/go-unixfs v0.3.1 github.com/ipfs/go-unixfsnode v1.2.0 github.com/ipfs/interface-go-ipfs-core v0.5.2 diff --git a/go.sum b/go.sum index 79febec3a71..d07b83200fc 100644 --- a/go.sum +++ b/go.sum @@ -746,7 +746,6 @@ github.com/ipfs/go-ds-leveldb v0.5.0/go.mod h1:d3XG9RUDzQ6V4SHi8+Xgj9j1XuEk1z82l github.com/ipfs/go-ds-measure v0.2.0 h1:sG4goQe0KDTccHMyT45CY1XyUbxe5VwTKpg2LjApYyQ= github.com/ipfs/go-ds-measure v0.2.0/go.mod h1:SEUD/rE2PwRa4IQEC5FuNAmjJCyYObZr9UvVh8V3JxE= github.com/ipfs/go-fetcher v1.5.0/go.mod h1:5pDZ0393oRF/fHiLmtFZtpMNBQfHOYNPtryWedVuSWE= -github.com/ipfs/go-fetcher v1.6.1 h1:UFuRVYX5AIllTiRhi5uK/iZkfhSpBCGX7L70nSZEmK8= github.com/ipfs/go-fetcher v1.6.1/go.mod h1:27d/xMV8bodjVs9pugh/RCjjK2OZ68UgAMspMdingNo= github.com/ipfs/go-filestore v0.1.0/go.mod h1:0KTrzoJnJ3sJDEDM09Vq8nz8H475rRyeq4i0n/bpF00= github.com/ipfs/go-filestore v1.1.0 h1:Pu4tLBi1bucu6/HU9llaOmb9yLFk/sgP+pW764zNDoE= From 4c8015c0a1ac188b2ed3588b638b5f4f896c1d3f Mon Sep 17 00:00:00 2001 From: "Masih H. Derkani" Date: Thu, 3 Mar 2022 16:05:50 +0000 Subject: [PATCH 99/99] Update deps in lotus-soup mod and remove replace directive Update dependency to go-fil-markets in `lotus-soup` module and remove the redundant replace directive. --- testplans/lotus-soup/go.mod | 4 +--- testplans/lotus-soup/go.sum | 38 +++++++++++++++++++++---------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/testplans/lotus-soup/go.mod b/testplans/lotus-soup/go.mod index 079ad814ebc..41847e082f9 100644 --- a/testplans/lotus-soup/go.mod +++ b/testplans/lotus-soup/go.mod @@ -9,7 +9,7 @@ require ( github.com/drand/drand v1.3.0 github.com/filecoin-project/go-address v0.0.6 github.com/filecoin-project/go-data-transfer v1.14.0 - github.com/filecoin-project/go-fil-markets v1.20.0 + github.com/filecoin-project/go-fil-markets v1.20.1 github.com/filecoin-project/go-jsonrpc v0.1.5 github.com/filecoin-project/go-state-types v0.1.3 github.com/filecoin-project/go-storedcounter v0.1.0 @@ -43,5 +43,3 @@ require ( replace github.com/filecoin-project/filecoin-ffi => ../../extern/filecoin-ffi replace github.com/filecoin-project/lotus => ../../ - -replace github.com/ipfs/go-path => github.com/ipfs/go-path v0.0.7 diff --git a/testplans/lotus-soup/go.sum b/testplans/lotus-soup/go.sum index cb0a1b762d1..51e5172a59a 100644 --- a/testplans/lotus-soup/go.sum +++ b/testplans/lotus-soup/go.sum @@ -426,10 +426,8 @@ github.com/filecoin-project/go-fil-commcid v0.1.0 h1:3R4ds1A9r6cr8mvZBfMYxTS88Oq github.com/filecoin-project/go-fil-commcid v0.1.0/go.mod h1:Eaox7Hvus1JgPrL5+M3+h7aSPHc0cVqpSxA+TxIEpZQ= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0 h1:imrrpZWEHRnNqqv0tN7LXep5bFEVOVmQWHJvl2mgsGo= github.com/filecoin-project/go-fil-commp-hashhash v0.1.0/go.mod h1:73S8WSEWh9vr0fDJVnKADhfIv/d6dCbAGaAGWbdJEI8= -github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8 h1:cuV4t78W8tUgmqvsc6T6qbWuycg7GzPcNsTdAOxrTns= -github.com/filecoin-project/go-fil-markets v1.19.2-0.20220223141410-2460e15e07a8/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= -github.com/filecoin-project/go-fil-markets v1.20.0 h1:kP9A2otcRe4mTfL++GF0+d4PoFDI92E38lhM8GXFT9I= -github.com/filecoin-project/go-fil-markets v1.20.0/go.mod h1:OeR49x+NPMfZMMgOresxzecMAgUB+lna2kwJABPwnt8= +github.com/filecoin-project/go-fil-markets v1.20.1 h1:DwrFuNIWC0a2c2ESpHtdEMH3QCpR/hoZ5DwjNT+VJ+E= +github.com/filecoin-project/go-fil-markets v1.20.1/go.mod h1:QV767KIWHrikVK8R0u2wTc5wkee4gXOf5/AfxDoQckw= github.com/filecoin-project/go-hamt-ipld v0.1.5 h1:uoXrKbCQZ49OHpsTCkrThPNelC4W3LPEk0OrS/ytIBM= github.com/filecoin-project/go-hamt-ipld v0.1.5/go.mod h1:6Is+ONR5Cd5R6XZoCse1CWaXZc0Hdb/JeX+EQCQzX24= github.com/filecoin-project/go-hamt-ipld/v2 v2.0.0 h1:b3UDemBYN2HNfk3KOXNuxgTTxlWi3xVvbQP0IT38fvM= @@ -440,9 +438,8 @@ github.com/filecoin-project/go-hamt-ipld/v3 v3.1.0/go.mod h1:bxmzgT8tmeVQA1/gvBw github.com/filecoin-project/go-indexer-core v0.2.8/go.mod h1:IagNfTdFuX4057kla43PjRCn3yBuUiZgIxuA0hTUamY= github.com/filecoin-project/go-jsonrpc v0.1.5 h1:ckxqZ09ivBAVf5CSmxxrqqNHC7PJm3GYGtYKiNQ+vGk= github.com/filecoin-project/go-jsonrpc v0.1.5/go.mod h1:XBBpuKIMaXIIzeqzO1iucq4GvbF8CxmXRFoezRh+Cx4= -github.com/filecoin-project/go-legs v0.3.0/go.mod h1:x6nwM+DuN7NzlPndOoJuiHYCX+pze6+efPRx17nIA7M= -github.com/filecoin-project/go-legs v0.3.4 h1:yid2IivTJ8JeF1ROA8jxNKNKJshU/HO1sRo5lEMNOUc= -github.com/filecoin-project/go-legs v0.3.4/go.mod h1:P7ZPHqFG96OFaT11rnXyTdcxRdGkaH1dRyPxJSOiSuM= +github.com/filecoin-project/go-legs v0.3.7 h1:yfm7fx+iy1nPtgPEQ6kQjvhoJOVbXide50STYdy+yos= +github.com/filecoin-project/go-legs v0.3.7/go.mod h1:pgekGm8/gKY5zCtQ/qGAoSjGP92wTLFqpO3GPHeu8YU= github.com/filecoin-project/go-padreader v0.0.0-20200903213702-ed5fae088b20/go.mod h1:mPn+LRRd5gEKNAtc+r3ScpW2JRU/pj4NBKdADYWHiak= github.com/filecoin-project/go-padreader v0.0.1 h1:8h2tVy5HpoNbr2gBRr+WD6zV6VD6XHig+ynSGJg8ZOs= github.com/filecoin-project/go-padreader v0.0.1/go.mod h1:VYVPJqwpsfmtoHnAmPx6MUwmrK6HIcDqZJiuZhtmfLQ= @@ -464,8 +461,8 @@ github.com/filecoin-project/go-statestore v0.2.0 h1:cRRO0aPLrxKQCZ2UOQbzFGn4WDNd github.com/filecoin-project/go-statestore v0.2.0/go.mod h1:8sjBYbS35HwPzct7iT4lIXjLlYyPor80aU7t7a/Kspo= github.com/filecoin-project/go-storedcounter v0.1.0 h1:Mui6wSUBC+cQGHbDUBcO7rfh5zQkWJM/CpAZa/uOuus= github.com/filecoin-project/go-storedcounter v0.1.0/go.mod h1:4ceukaXi4vFURIoxYMfKzaRF5Xv/Pinh2oTnoxpv+z8= -github.com/filecoin-project/index-provider v0.3.1 h1:ySGk2FnDbUEhq6QwakeU/p8tKnIoUm6JIpXPQ8RG1iM= -github.com/filecoin-project/index-provider v0.3.1/go.mod h1:o8ineTLWnwtfBv7SnELpncza6SBU295esxOaXsTCl2I= +github.com/filecoin-project/index-provider v0.5.0 h1:k2C1RFvOvxmA2i8bhmkb3b4qun7RDRDzzs/y25/TwQg= +github.com/filecoin-project/index-provider v0.5.0/go.mod h1:KHVrP2vU3YuScb+fawObwTFoR882up9U07kk0ZrfP0c= github.com/filecoin-project/specs-actors v0.9.13/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= github.com/filecoin-project/specs-actors v0.9.14 h1:68PVstg2UB3ZsMLF+DKFTAs/YKsqhKWynkr0IqmVRQY= github.com/filecoin-project/specs-actors v0.9.14/go.mod h1:TS1AW/7LbG+615j4NsjMK1qlpAwaFsG9w0V2tg2gSao= @@ -489,8 +486,8 @@ github.com/filecoin-project/specs-actors/v7 v7.0.0 h1:FQN7tjt3o68hfb3qLFSJBoLMuO github.com/filecoin-project/specs-actors/v7 v7.0.0/go.mod h1:TA5FwCna+Yi36POaT7SLKXsgEDvJwc0V/L6ZsO19B9M= github.com/filecoin-project/specs-storage v0.2.0 h1:Y4UDv0apRQ3zI2GiPPubi8JblpUZZphEdaJUxCutfyg= github.com/filecoin-project/specs-storage v0.2.0/go.mod h1:Tb88Zq+IBJbvAn3mS89GYj3jdRThBTE/771HCVZdRJU= -github.com/filecoin-project/storetheindex v0.3.2 h1:KsTJer5Di/iapSrOWtbFTPMt5kS7Y3n3C9kOYH93gEA= -github.com/filecoin-project/storetheindex v0.3.2/go.mod h1:d7y0FHAwPPSIdg+Oh7xV5B9TLebL7rvoKu591N/l2ZU= +github.com/filecoin-project/storetheindex v0.3.5 h1:KoS9TvjPm6zIZfUH8atAHJbVHOO7GTP1MdTG+v0eE+Q= +github.com/filecoin-project/storetheindex v0.3.5/go.mod h1:0r3d0kSpK63O6AvLr1CjAINLi+nWD49clzcnKV+GLpI= github.com/filecoin-project/test-vectors/schema v0.0.5/go.mod h1:iQ9QXLpYWL3m7warwvK1JC/pTri8mnfEmKygNDqqY6E= github.com/flynn/go-shlex v0.0.0-20150515145356-3f9db97f8568/go.mod h1:xEzjJPgXI435gkrCt3MPfRiAkVrwSbHsst4LCFVfpJc= github.com/flynn/noise v0.0.0-20180327030543-2492fe189ae6/go.mod h1:1i71OnUq3iUe1ma7Lr6yG6/rjvM3emb6yoL7xLFzcVQ= @@ -1088,8 +1085,11 @@ github.com/ipfs/go-metrics-interface v0.0.1/go.mod h1:6s6euYU4zowdslK0GKHmqaIZ3j github.com/ipfs/go-metrics-prometheus v0.0.2/go.mod h1:ELLU99AQQNi+zX6GCGm2lAgnzdSH3u5UVlCdqSXnEks= github.com/ipfs/go-mfs v0.2.1/go.mod h1:Woj80iuw4ajDnIP6+seRaoHpPsc9hmL0pk/nDNDWP88= github.com/ipfs/go-namesys v0.4.0/go.mod h1:jpJwzodyP8DZdWN6DShRjVZw6gaqMr4nQLBSxU5cR6E= -github.com/ipfs/go-path v0.0.7 h1:H06hKMquQ0aYtHiHryOMLpQC1qC3QwXwkahcEVD51Ho= github.com/ipfs/go-path v0.0.7/go.mod h1:6KTKmeRnBXgqrTvzFrPV3CamxcgvXX/4z79tfAd2Sno= +github.com/ipfs/go-path v0.0.9/go.mod h1:VpDkSBKQ9EFQOUgi54Tq/O/tGi8n1RfYNks13M3DEs8= +github.com/ipfs/go-path v0.1.1/go.mod h1:vC8q4AKOtrjJz2NnllIrmr2ZbGlF5fW2OKKyhV9ggb0= +github.com/ipfs/go-path v0.2.1 h1:R0JYCu0JBnfa6A3C42nzsNPxtKU5/fnUPhWSuzcJHws= +github.com/ipfs/go-path v0.2.1/go.mod h1:NOScsVgxfC/eIw4nz6OiGwK42PjaSJ4Y/ZFPn1Xe07I= github.com/ipfs/go-peertaskqueue v0.0.4/go.mod h1:03H8fhyeMfKNFWqzYEVyMbcPUeYrqP1MX6Kd+aN+rMQ= github.com/ipfs/go-peertaskqueue v0.1.0/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= github.com/ipfs/go-peertaskqueue v0.1.1/go.mod h1:Jmk3IyCcfl1W3jTW3YpghSwSEC6IJ3Vzz/jUmWw8Z0U= @@ -1104,6 +1104,7 @@ github.com/ipfs/go-unixfs v0.2.4/go.mod h1:SUdisfUjNoSDzzhGVxvCL9QO/nKdwXdr+gbMU github.com/ipfs/go-unixfs v0.2.6/go.mod h1:GTTzQvaZsTZARdNkkdjDKFFnBhmO3e5mIM1PkH/x4p0= github.com/ipfs/go-unixfs v0.3.1 h1:LrfED0OGfG98ZEegO4/xiprx2O+yS+krCMQSp7zLVv8= github.com/ipfs/go-unixfs v0.3.1/go.mod h1:h4qfQYzghiIc8ZNFKiLMFWOTzrWIAtzYQ59W/pCFf1o= +github.com/ipfs/go-unixfsnode v1.1.2/go.mod h1:5dcE2x03pyjHk4JjamXmunTMzz+VUtqvPwZjIEkfV6s= github.com/ipfs/go-unixfsnode v1.1.3/go.mod h1:ZZxUM5wXBC+G0Co9FjrYTOm+UlhZTjxLfRYdWY9veZ4= github.com/ipfs/go-unixfsnode v1.2.0 h1:tHHBJftsJyHGa8bS62PpkYNqHy/Sug3c/vxxC8NaGQY= github.com/ipfs/go-unixfsnode v1.2.0/go.mod h1:mQEgLjxkV/1mohkC4p7taRRBYPBeXu97SA3YaerT2q0= @@ -1300,6 +1301,7 @@ github.com/libp2p/go-libp2p v0.14.4/go.mod h1:EIRU0Of4J5S8rkockZM7eJp2S0UrCyi55m github.com/libp2p/go-libp2p v0.16.0/go.mod h1:ump42BsirwAWxKzsCiFnTtN1Yc+DuPu76fyMX364/O4= github.com/libp2p/go-libp2p v0.17.0/go.mod h1:Fkin50rsGdv5mm5BshBUtPRZknt9esfmYXBOYcwOTgw= github.com/libp2p/go-libp2p v0.18.0-rc1/go.mod h1:RgYlH7IIWHXREimC92bw5Lg1V2R5XmSzuLHb5fTnr+8= +github.com/libp2p/go-libp2p v0.18.0-rc3/go.mod h1:WYL+Xw1iuwi6rdfzw5VIEpD+HqzYucHZ6fcUuumbI3M= github.com/libp2p/go-libp2p v0.18.0-rc5 h1:88wWDHb9nNo0vBNCupLde3OTnFAkugOCNkrDfl3ivK4= github.com/libp2p/go-libp2p v0.18.0-rc5/go.mod h1:aZPS5l84bDvCvP4jkyEUT/J6YOpUq33Fgqrs3K59mpI= github.com/libp2p/go-libp2p-asn-util v0.0.0-20200825225859-85005c6cf052/go.mod h1:nRMRTab+kZuk0LnKZpxhOVH/ndsdr2Nr//Zltc/vwgo= @@ -1510,6 +1512,7 @@ github.com/libp2p/go-libp2p-swarm v0.5.3/go.mod h1:NBn7eNW2lu568L7Ns9wdFrOhgRlkR github.com/libp2p/go-libp2p-swarm v0.8.0/go.mod h1:sOMp6dPuqco0r0GHTzfVheVBh6UEL0L1lXUZ5ot2Fvc= github.com/libp2p/go-libp2p-swarm v0.9.0/go.mod h1:2f8d8uxTJmpeqHF/1ujjdXZp+98nNIbujVOMEZxCbZ8= github.com/libp2p/go-libp2p-swarm v0.10.0/go.mod h1:71ceMcV6Rg/0rIQ97rsZWMzto1l9LnNquef+efcRbmA= +github.com/libp2p/go-libp2p-swarm v0.10.1/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-swarm v0.10.2 h1:UaXf+CTq6Ns1N2V1EgqJ9Q3xaRsiN7ImVlDMpirMAWw= github.com/libp2p/go-libp2p-swarm v0.10.2/go.mod h1:Pdkq0QU5a+qu+oyqIV3bknMsnzk9lnNyKvB9acJ5aZs= github.com/libp2p/go-libp2p-testing v0.0.1/go.mod h1:gvchhf3FQOtBdr+eFUABet5a4MBLK8jM3V4Zghvmi+E= @@ -1852,8 +1855,9 @@ github.com/multiformats/go-multicodec v0.2.0/go.mod h1:/y4YVwkfMyry5kFbMTbLJKErh github.com/multiformats/go-multicodec v0.3.0/go.mod h1:qGGaQmioCDh+TeFOnxrbU0DaIPw8yFgAZgFG0V7p1qQ= github.com/multiformats/go-multicodec v0.3.1-0.20210902112759-1539a079fd61/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multicodec v0.3.1-0.20211210143421-a526f306ed2c/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= -github.com/multiformats/go-multicodec v0.4.0 h1:fbqb6ky7erjdD+/zaEBJgZWu1i8D6i/wmPywGK7sdow= github.com/multiformats/go-multicodec v0.4.0/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= +github.com/multiformats/go-multicodec v0.4.1 h1:BSJbf+zpghcZMZrwTYBGwy0CPcVZGWiC72Cp8bBd4R4= +github.com/multiformats/go-multicodec v0.4.1/go.mod h1:1Hj/eHRaVWSXiSNNfcEPcwZleTmdNP81xlxDLnWU9GQ= github.com/multiformats/go-multihash v0.0.1/go.mod h1:w/5tugSrLEbWqlcgJabL3oHFKTwfvkofsjW2Qa1ct4U= github.com/multiformats/go-multihash v0.0.5/go.mod h1:lt/HCbqlQwlPBz7lv0sQCdtfcMtlJvakRUn/0Ual8po= github.com/multiformats/go-multihash v0.0.8/go.mod h1:YSLudS+Pi8NHE7o6tb3D8vrpKa63epEDmG8nTduyAew= @@ -2257,8 +2261,9 @@ github.com/whyrusleeping/cbor-gen v0.0.0-20200826160007-0b9f6c5fb163/go.mod h1:f github.com/whyrusleeping/cbor-gen v0.0.0-20210118024343-169e9d70c0c2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210219115102-f37d292932f2/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/cbor-gen v0.0.0-20210303213153-67a261a1d291/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= -github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008 h1:7WtW9D9VGpmRLuQmrPy2JobUNdka95z3MKEVpELtOjo= -github.com/whyrusleeping/cbor-gen v0.0.0-20211110122933-f57984553008/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20220224212727-7a699437a831/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= +github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14 h1:vo2wkP2ceHyGyZwFFtAabpot03EeSxxwAe57pOI9E/4= +github.com/whyrusleeping/cbor-gen v0.0.0-20220302191723-37c43cae8e14/go.mod h1:fgkXqYy7bV2cFeIEOkVTZS/WjXARfBqSH6Q2qHL33hQ= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f h1:jQa4QT2UP9WYv2nzyawpKMOCl+Z/jW7djv2/J50lj9E= github.com/whyrusleeping/chunker v0.0.0-20181014151217-fe64bd25879f/go.mod h1:p9UJB6dDgdPgMJZs7UjUOdulKyRr9fqkS+6JKAInPy8= github.com/whyrusleeping/go-ctrlnet v0.0.0-20180313164037-f564fbbdaa95/go.mod h1:SJqKCCPXRfBFCwXjfNT/skfsceF7+MBFLI2OrvuRA7g= @@ -2374,8 +2379,9 @@ go.uber.org/fx v1.15.0/go.mod h1:jI3RazQUhGv5KkpZIRv+kuP4CcgX3fnc0qX8bLnzbx8= go.uber.org/goleak v1.0.0/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= -go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.12 h1:gZAh5/EyT/HQwlpkCy6wTpqfH9H8Lz8zbm3dZh+OyzA= +go.uber.org/goleak v1.1.12/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.3.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4= go.uber.org/multierr v1.4.0/go.mod h1:VgVr7evmIr6uPjLBxg28wmKNXyqE9akIJ5XnfpiKl+4=