تصور کنید که مجموعه بزرگی از دادهها داریم و میخواهیم بتوانیم به سرعت آزمایش کنیم که آیا در حال حاضر عنصری در آن مجموعه وجود دارد یا خیر. روش ساده بررسی ممکن است این باشد که مجموعه را پرس و جو کنیم تا ببینیم آیا عنصر ما در آنجا است یا خیر.
این بسته توابع کاربردی را برای dapps اتریوم و سایر بستههای web3.js فراهم میکند.
فیلتر بلوم یک ساختار داده احتمالی و فضا کارآمد است که برای بررسی سریع عضویت مجموعه استفاده می شود. روش ساده بررسی ممکن است این باشد که مجموعه را پرس و جو کنیم تا ببینیم آیا عنصر ما در آنجا است یا خیر. اگر مجموعه داده های ما نسبتاً کوچک باشد، احتمالاً خوب است. متأسفانه، اگر مجموعه دادههای ما واقعاً بزرگ باشد، این جستجو ممکن است کمی طول بکشد. خوشبختانه، ما ترفندهایی برای سرعت بخشیدن به کارها در دنیای اتریوم داریم!
فیلتر bloom یکی از این ترفندها است. ایده اصلی پشت فیلتر بلوم این است که هر عنصر جدیدی را که وارد مجموعه داده میشود هش کند، بیتهای خاصی را از این هش بگیرد و سپس از آن بیتها برای پر کردن بخشهایی از یک آرایه بیت با اندازه ثابت استفاده کند (مثلاً بیتهای خاصی را روی 1 تنظیم کنید. ). این آرایه بیتی فیلتر bloom نامیده می شود.
بعداً، وقتی میخواهیم بررسی کنیم که آیا عنصری در مجموعه وجود دارد یا خیر، به سادگی عنصر را هش میکنیم و بررسی میکنیم که بیتهای مناسب در فیلتر bloom قرار دارند. اگر حداقل یکی از بیت ها 0 باشد، قطعاً عنصر در مجموعه داده ما نیست! اگر همه بیت ها 1 باشند، ممکن است عنصر در مجموعه داده ها باشد، اما برای اطمینان باید در واقع پایگاه داده را پرس و جو کنیم. بنابراین ممکن است جواب مثبت کاذب داشته باشیم، اما هرگز جواب منفی کاذب نخواهیم داشت. این می تواند تا حد زیادی تعداد پرس و جوهای پایگاه داده را که باید انجام دهیم کاهش دهد.
پیشنهاد ویژه: آموزش بلاکچین
یک مثال واقعی اتریوم که در آن مفید است، این است که میخواهید موجودی کاربران را در هر بلوک جدید بهروزرسانی کنید تا تا حد امکان به زمان واقعی نزدیک شود. بدون استفاده از فیلتر بلوم در هر بلوک جدید، شما باید تعادل را مجبور کنید حتی اگر آن کاربر هیچ فعالیتی در آن بلوک نداشته باشد. اما اگر از logBlooms از بلوک استفاده میکنید، میتوانید قبل از انجام عملیات آهستهتر، فیلتر bloom را در برابر آدرس اتریوم کاربران آزمایش کنید، این امر بهطور چشمگیری میزان connection هایی را که انجام میدهید کاهش میدهد، زیرا تنها در صورت انجام آن اتریوم، آن عملیات اضافی را انجام خواهید داد. آدرس در آن بلوک است (منهای نتیجه مثبت کاذب که قابل چشم پوشی خواهد بود). این برای برنامه شما بسیار کارآمد خواهد بود.
web3.utils.isBloom
web3.utils.isUserEthereumAddressInBloom
web3.utils.isContractAddressInBloom
web3.utils.isTopic
web3.utils.isTopicInBloom
web3.utils.isInBloom
isBloom
isBloom(bloom: string): boolean;
اگر یک بلوم معتبر باشد، true را برمیگرداند.
isUserEthereumAddressInBloom(bloom: string, ethereumAddress: string): boolean;
اگر آدرس کاربران اتریوم بخشی از bloom باشد، true برمی گرداند: موارد مثبت اشتباه امکان پذیر است.
isContractAddressInBloom(bloom: string, contractAddress: string): boolean;
اگر آدرس قرارداد بخشی از داده بلوم باشد، true را برمی گرداند: موارد مثبت نادرست ممکن است.
isTopic(topic: string): boolean;
اگر موضوع معتبر باشد، true را برمیگرداند.
isTopicInBloom(bloom: string, topic: string): boolean;
اگر موضوع بخشی از bloom note باشد، true را برمی گرداند: موارد مثبت کاذب امکان پذیر است.
این روش پایه خام است که سایر روش های bloom استفاده می کنند. شما می توانید در یک bloom و مقداری که اگر بخشی از bloom داده شده باشد true برمی گرداند.
isInBloom(bloom: string, value: string | Uint8Array): boolean;
اگر مقدار بخشی از bloom note باشد، مقدار true را برمی گرداند: مثبت کاذب ممکن است.
کتابخانه randomHex برای تولید رشته های HEX شبه تصادفی رمزنگاری قوی با اندازه بایت معین.
کتابخانه BN.js برای محاسبه اعداد بزرگ در جاوا اسکریپت.
برای تبدیل ایمن انواع مختلف، از جمله BigNumber.js از utils.toBN استفاده کنید
npm install --save bn.js
توضیحات بیشتر در مستندات گیت هاب قابل مطالعه است.
بررسی می کند که آیا یک مقدار داده شده یک نمونه BN.js است یا خیر.
بررسی می کند که آیا یک مقدار داده شده یک نمونه BigNumber.js است یا خیر.
رمز نگاری sha3 ورودی را محاسبه خواهد کرد.
sha3 ورودی را محاسبه میکند، اما اگر مثلاً یک رشته خالی ارسال شود، به جای null، مقدار هش را برمیگرداند.
sha3 پارامترهای ورودی داده شده را به همان روش سالیدیتی محاسبه می کند. این بدان معناست که آرگومانها قبل از هش شدن، تبدیل به ABI میشوند و کاملا پکیج میشوند.
این روش یک خطر امنیتی ایجاد می کند که در آن چندین ورودی می توانند با یک هش محاسبه شوند. در کد مثال موارد متعددی از این خطر امنیتی ارائه شده است
web3.utils.soliditySha3(‘hello’, ‘world01’)
// “0xfb0a9d38c4dc568cbd105866540986fabf3c08c1bfb78299ce21aa0e5c0c586b”
web3.utils.soliditySha3({ type: ‘string’, value: ‘helloworld’ }, { type: ‘string’, value: ’01’ })
// “0xfb0a9d38c4dc568cbd105866540986fabf3c08c1bfb78299ce21aa0e5c0c586b”
web3.utils.soliditySha3({ type: ‘string’, value: ‘hell’ }, { type: ‘string’, value: ‘oworld’ }, { type: ‘uint16’, value: 0x3031 })
// “0xfb0a9d38c4dc568cbd105866540986fabf3c08c1bfb78299ce21aa0e5c0c586b”
web3.utils.soliditySha3({ type: ‘uint96’, value: ‘32309054545061485574011236401’ })
// “0xfb0a9d38c4dc568cbd105866540986fabf3c08c1bfb78299ce21aa0e5c0c586b”
web3.utils.soliditySha3(‘234564535’, ‘0xfff23243’, true, -10);
// auto detects: uint256, bytes, bool, int256
//> “0x3e27a893dc40ef8a7f0841d96639de2f58a132be5ae466d40087a2cfa83b7179”
web3.utils.soliditySha3(‘Hello!%’);
// auto detects: string
//”0x661136a4267dba9ccdf6bfddb7c00e714de936674c4bdb065a531cf1cb15c7fc”
web3.utils.soliditySha3(‘234’);
// auto detects: uint256
//”0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2″
web3.utils.soliditySha3(0xea);
// same as above
//”0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2″
web3.utils.soliditySha3(new BN(‘234’));
// same as above
//”0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2″
web3.utils.soliditySha3({ type: ‘uint256’, value: ‘234’ })); // same as above
//”0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2″
web3.utils.soliditySha3({ t: ‘uint’, v: new BN(‘234’) })); // same as above
//”0x61c831beab28d67d1bb40b5ae1a11e2757fa842f031a2d0bc94a7867bc5d26c2″
web3.utils.soliditySha3(‘0x407D73d8a49eeb85D32Cf465507dd71d507100c1’);
//”0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b”
web3.utils.soliditySha3({ t: ‘bytes’, v: ‘0x407D73d8a49eeb85D32Cf465507dd71d507100c1’ });
//”0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b” // same result as above
web3.utils.soliditySha3({ t: ‘address’, v: ‘0x407D73d8a49eeb85D32Cf465507dd71d507100c1’ });
//”0x4e8ebbefa452077428f93c9520d3edd60594ff452a29ac7d2ccc11d47f3ab95b” // same as above, but will do a checksum check, if its multi case
web3.utils.soliditySha3({ t: ‘bytes32’, v: ‘0x407D73d8a49eeb85D32Cf465507dd71d507100c1’ });
//”0x3c69a194aaf415ba5d6afca734660d0a3d45acdc05d54cd1ca89a8988e7625b4″ // different result as above
web3.utils.soliditySha3({ t: ‘string’, v: ‘Hello!%’ }, { t: ‘int8’, v: -23 }, { t: ‘address’, v: ‘0x85F43D8a49eeB85d32Cf465507DD71d507100C1d’ });
//”0xa13b31627c1ed7aaded5aecec71baf02fe123797fffd45e662eac8e06fbe4955″
sha3 پارامترهای ورودی داده شده را به همان روش سالیدیتی محاسبه می کند. این بدان معناست که آرگومانها قبل از هش شدن، تبدیل به ABI میشوند و کاملا بستهبندی میشوند. تفاوت این تابع با تابع soliditySha3 در این است که اگر برای مثال یک رشته خالی داده شود، مقدار هش را به جای null برمی گرداند.
بررسی می کند که آیا یک رشته داده شده یک رشته HEX است.
بررسی می کند که آیا یک رشته داده شده یک رشته HEX است. تفاوت web3.utils.isHex () این است که بررسی میکند HEX با 0x پیشوند شروع شود.
بررسی می کند که آیا رشته داده شده یک آدرس اتریوم معتبر است یا خیر. اگر آدرس دارای حروف بزرگ و کوچک باشد، حروف بزرگ و کوچک را نیز بررسی میکند.
آدرس اتریوم با حروف بزرگ یا کوچک را به آدرس چکسام تبدیل میکند.
web3.utils.checkAddressChecksum(address)
جمع چک یک آدرس داده شده را بررسی می کند. همچنین در آدرسهای غیر چک سام، false را برمیگرداند.